如何在c#中使用存储过程将主键值传递给外键
我正在尝试使用存储过程将值插入到两个表中 这是我使用的存储过程如何在c#中使用存储过程将主键值传递给外键,c#,sql-server,stored-procedures,C#,Sql Server,Stored Procedures,我正在尝试使用存储过程将值插入到两个表中 这是我使用的存储过程 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 (
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时出错”,它只将数据写入Employee表
DatePics.Emp_ID是第二个表的外键
Employee.ID是主键。假设这些表之间存在一对一的关系。如何将自动生成的值从Employee.ID传递到C#中的DatePics.Emp_ID
谢谢你这里有几个问题 首先,你不需要这个:
com.Parameters.AddWithValue("@Emp_ID", "@ID");
@Emp_ID不是存储过程中的参数,您也不需要它,因为员工ID是通过identity生成的(我假设employee表中的ID列是PK identity列)
第二,在存储过程中,没有像预期的那样将父表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
我认为你不必从代码中传递@Emp\u ID i、 e尝试注释掉
com.Parameters.AddWithValue(“@Emp_ID”,“@ID”)代码>来自您的代码
因为您正在从@ID(在存储过程中声明)在DatePics
表中插入Emp\u ID
还尝试在事务范围内写入整个存储过程。此错误仅在C中出现,我必须声明Emp_ID过程或函数“insert_Emp_pics”的值,该参数应为@Emp_ID”,而您发布的过程(以及我发布的版本)未提供该参数不将@Emp_ID作为参数。您确定在您运行的版本中没有将其作为参数吗?