2014-02-28 84 views
0

我試圖使用存儲過程將值插入到兩個表中。如何將主鍵值傳遞給C#中的外鍵使用存儲過程

這是存儲過程我用

ALTER PROCEDURE [dbo].[insert_emp_pics] 
@EmpName nvarchar(100), 
@Nationality nvarchar(30), 
@PassportPic nvarchar(100), 
@Pic nvarchar(100) 
AS 
Begin 
set nocount on; 
DECLARE @ID int, 
@Emp_ID int 
insert into Employee (EmpName,Nationality) 
values (@EmpName,@Nationality) 
set @ID = SCOPE_IDENTITY(); 
insert into DatePics 
(Emp_ID,PassportPic,Pic) 
values 
(@Emp_ID,@PassportPic ,@Pic) 
set @ID_Pics = SCOPE_IDENTITY(); 
end 

這是我的C#語句

 private void Savebtn_Click_1(object sender, EventArgs e) 
    { 


     if (Nametxt.Text == "" || Nationalitydrp.SelectedItem == null) 
     { 
      nameerr.Text = ("*"); 
      nationalityerr.Text = ("*"); 

     } 
     else 
     {    

      SqlCommand com = new SqlCommand();     
      com.Connection = db.con; 
      com.CommandType = CommandType.StoredProcedure; 
      com.CommandText = "insert_emp_pics "; 
      com.Parameters.AddWithValue("@EmpName", Nametxt.Text); 
      com.Parameters.AddWithValue("@Nationality", Nationalitydrp.SelectedItem);     
      com.Parameters.AddWithValue("@Pic", picpath.Text); 
      com.Parameters.AddWithValue("@PassportPic", pppath.Text); 
      //These are the relation between two tables 
      com.Parameters.AddWithValue("@Emp_ID", "@ID"); 
      db.con.Open(); 
      int x = com.ExecuteNonQuery(); 
      db.con.Close(); 
      if (x > 0) 
      { 
       MessageBox.Show("Welcome " + Nametxt.Text + " in our organization"); 

       nameerr.Visible = false;    
       nationalityerr.Visible = false;     
       Nametxt.Text = null; 
       Nationalitydrp.SelectedItem = null;     
       picpath.Text = null; 
       pppath.Text = null; 


      } 
    } 

    } 

錯誤彈出「錯誤轉換數據類型爲nvarchar成int」,並將其寫入數據僅限員工表。

的DatePics.Emp_ID是第二臺

Employee.ID的外鍵的主鍵。假設這些表之間存在一對一的關係。如何將自動生成的值從Employee.ID傳遞給C#中的DatePics.Emp_ID?

謝謝

回答

1

這裏有幾個問題。

首先,你不需要這樣的:

com.Parameters.AddWithValue("@Emp_ID", "@ID"); 

@emp_id是不是在你的存儲過程中的參數,而你不需要它是,因爲員工ID是通過身份(我產生假設你的id表在Employee表中是一個PK標識列)。

其次,在你的存儲過程中,你並沒有像你想要的那樣將外部表的id插入子表中,你抓取剛剛插入的僱員的id並將其設置爲@ID變量,但是你將插入(未填充的)@Emp_ID變量作爲你的子表中的外鍵。做到這一點,而不是:

ALTER PROCEDURE [dbo].[insert_emp_pics] 
@EmpName nvarchar(100), 
@Nationality nvarchar(30), 
@PassportPic nvarchar(100), 
@Pic nvarchar(100) 
AS 
Begin 
set nocount on; 
DECLARE @ID int 
insert into Employee (EmpName,Nationality) 
values (@EmpName,@Nationality) 
set @ID = SCOPE_IDENTITY(); -- This is the employee id that was just inserted 
insert into DatePics 
(Emp_ID,PassportPic,Pic) 
values 
(@ID,@PassportPic ,@Pic) -- Use the just-inserted employee id to insert as a foreign key into the child table 
set @ID_Pics = SCOPE_IDENTITY(); 
end 
+0

這個錯誤剛剛出現在C#中,我必須聲明Emp_ID的值'procedure或function'insert_emp_pics'期望參數@Emp_ID',這是沒有提供的' –

+0

您發佈的過程(以及它的版本發佈)不會將@Emp_ID作爲參數。你確定你沒有把它作爲你正在運行的版本中的一個參數嗎? – mayabelle

0

我不認爲你必須從你的代碼通過@emp_id,

即嘗試從您的代碼註釋掉com.Parameters.AddWithValue("@Emp_ID", "@ID");

,因爲你在DatePics表從@ID插入Emp_ID(在你的存儲過程聲明。)

也嘗試寫裏面Transaction範圍整個存儲過程。

相關問題