Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在c#中使用存储过程将主键值传递给外键_C#_Sql Server_Stored Procedures - Fatal编程技术网

如何在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作为参数。您确定在您运行的版本中没有将其作为参数吗?