2014-04-13 31 views
0

我嘗試寫入SP以將值插入相關表中。我有錯誤消息:存儲過程插入到相關表中

"Cannot insert the value NULL into column 'marka_id', table 'env.dbo.Marka'; column does not allow nulls. INSERT fails.

Cannot insert the value NULL into column 'model_id', table 'env.dbo.Model'; column does not allow nulls. INSERT fails.

Cannot insert the value NULL into column 'f_id', table 'env.dbo.Firma'; column does not allow nulls. INSERT fails.

Cannot insert the value NULL into column 'sira_no', table 'env.dbo.Ana'; column does not allow nulls. INSERT fails.

The statement has been terminated.

The statement has been terminated.

The statement has been terminated.

The statement has been terminated."

這裏的存儲過程:

use env 
go 
create procedure [SP$Ekle](
@marka_adi nvarchar(30) = NULL, 
@model_adi nvarchar(30) = NULL, 
@f_adi nvarchar(50) = NULL, 
@adres nvarchar(20) = NULL, 
@tel nvarchar(20) = NULL, 
@seri_no nvarchar(30) = NULL, 
@kullanici_adi nvarchar(50) = NULL, 
@link nvarchar(50) = NULL, 
@aciklama nvarchar(50) = NULL, 
@sira_no int output 
) 
as 
begin 
set nocount on 

DECLARE 
@marka_id int, 
@model_id int, 
@f_id int 
begin 

INSERT INTO Marka(marka_adi) VALUES(@marka_adi); 
SET @marka_id = (SELECT marka_id FROM Marka WHERE marka_adi = @marka_adi); 

INSERT INTO Model(marka_id,model_adi) VALUES(@marka_id,@model_adi); 
SET @model_id = (SELECT @model_id FROM Model WHERE model_adi = @model_adi); 

INSERT INTO Firma(f_adi,adres,tel) VALUES (@f_adi,@adres,@tel); 
SET @f_id = (SELECT f_id FROM Firma WHERE f_adi= @f_adi AND adres = @adres AND tel = @tel); 

INSERT INTO Ana(seri_no,kullanici_adi,link,aciklama,marka_id,model_id,f_id) VALUES (@seri_no,@kullanici_adi,@link,@aciklama,@marka_id,@model_id,@f_id); 

SELECT @sira_no = SCOPE_IDENTITY(); 
end 

set nocount off 
end 
go 

從C#調用:

cmd.CommandText = "SP$Ekle"; 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.Add(new SqlParameter("@marka_adi", TextBox1.Text)); 
     cmd.Parameters.Add(new SqlParameter("@model_adi", TextBox2.Text)); 
     cmd.Parameters.Add(new SqlParameter("@f_adi", TextBox3.Text)); 
     cmd.Parameters.Add(new SqlParameter("@adres", TextBox4.Text)); 
     cmd.Parameters.Add(new SqlParameter("@tel", TextBox5.Text)); 
     cmd.Parameters.Add(new SqlParameter("@seri_no", TextBox6.Text)); 
     cmd.Parameters.Add(new SqlParameter("@kullanici_adi", TextBox7.Text)); 
     cmd.Parameters.Add(new SqlParameter("@link", TextBox8.Text)); 
     cmd.Parameters.Add(new SqlParameter("@aciklama", TextBox9.Text)); 
     cmd.Parameters.Add(new SqlParameter("@sira_no", SqlDbType.Int)).Direction = ParameterDirection.Output; 

回答

2

錯誤是告訴你,當你調用insert你不及格在一個不可空列的值中。特別是您的ID列,如果它們被設置爲您的主鍵,那麼這些列不能爲空。

很難說沒有看到你的表,但我認爲你需要將你的列設置爲標識,這樣你的行ID就自動創建了。否則,如果您在插入時未指定ID,您將收到您收到的錯誤。

在這個堆棧溢出問題請看: Setting Identity to on or off in SQL server

這裏是開啓播種好的計算器問題。其SQL 2005,但其同樣的過程:

Adding auto incrementing primary key to an existing table in SQL SERVER 2005

編輯回答你的問題:

您要查詢分配給你想要做這樣的事情的變量:

SELECT TOP 1 @marka_id = marka_id FROM Marka WHERE marka_adi = @marka_adi 

你必須對所有的可疑陳述都這樣做。

+0

我設置這些身份。現在它給出了這個錯誤:子查詢返回了多個值。當子查詢遵循=,!=,<, <= , >,> =或當子查詢用作表達式時,這是不允許的。 子查詢返回的值超過1。當子查詢遵循=,!=,<, <= , >,> =或當子查詢用作表達式時,這是不允許的。 – user3318923

+0

我編輯了我的答案來解決您的問題。 – kmacdonald