通过存储过程更新两个表中的值

时间:2014-04-14 10:23:27

标签: c# sql sql-server

我有两个表,我需要通过存储过程更新它们中的值。尝试过多更新但有时只更新第一个表,其他第二个甚至失败,因为不能允许重复。此外,当它更新表中的WHOLE数据时,与新更新的数据相同。在所有这些代码行之后,我现在已经达到了这个错误

  

无法将值NULL插入列' Emp_ID',table' DatePics&#39 ;;列不允许空值。更新失败。声明已终止

以下是 SQL 代码:

ALTER procedure [dbo].[UpdateEmp]
    @EmpName nvarchar(100),
    @Nationality nvarchar(30),    
    @Passport nvarchar(20),
    @ContractDate date,
    @HealthDate date
AS
BEGIN 
    set nocount on;

DECLARE @IDs table (ID int )
UPDATE Employee SET 
EmpName=@EmpName, Nationality=@Nationality, Visa=@Visa, Passport=@Passport,
ReceivedDate=@ReceivedDate,IDIssue=@IDIssue, IDExpiry=@IDExpiry, Sponsor=@Sponsor
output inserted.ID into @IDs (ID)
WHERE ID = @ID

UPDATE DatePics SET
FingerDate=@FingerDate, ContractDate=@ContractDate, HealthDate=@HealthDate
where Emp_ID in (select ID from @IDs);
END

编写存储过程代码后,我编写了C#代码,如下所示:

private void updatebtn_Click(object sender, EventArgs e)
{
        SqlCommand cmd = new SqlCommand();
        cmd.Connection = db.con;
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "UpdateEmp";

        cmd.Parameters.AddWithValue("@EmpName", NameSeartxt.Text);
        cmd.Parameters.AddWithValue("@Nationality", NatSeartxt.Text);            
        cmd.Parameters.AddWithValue("@Passport", PassSeartxt.Text);            
        cmd.Parameters.AddWithValue("@ContractDate", ContractSeartxt.Text);
        cmd.Parameters.AddWithValue("@HealthDate", HealthSeartxt.Text);

        db.con.Open();
        int up = cmd.ExecuteNonQuery();

        if (up > 0)
        {
            MessageBox.Show("Update done ", "DONE !");
            SearNametxt.Text = "";
        }

        else
        {
            MessageBox.Show("Failed to update", "FAIL !");
            SearNametxt.Text = "";
        }
        db.con.Close();
    }

有任何线索吗?

3 个答案:

答案 0 :(得分:2)

我可以看到您的查询有三个问题。 1您声明ID,但在使用之前不要分配它,因此第一个查询的ID始终为NULL,因此永远不会更新任何行:

DECLARE @ID int 

UPDATE FrstTable SET 
EmpName=@EmpName, Nationality=@Nationality, Passport=@Passport
WHERE ID = @ID

其次,您正在使用SCOPE_IDENTITY来尝试获取已更新记录的ID。你不能这样做,SCOPE_IDENTITY将返回最后插入的ID,它不受更新的影响。您需要使用OUTPUT来获取更新的ID:

DECLARE @IDs TABLE (ID INT);

UPDATE  FirstTable
OUTPUT inserted.ID INTO @Ids (ID)
SET     EmpName = @EmpName, 
        Nationality = @Nationality, 
        Passport = @Passport;

第三,你的第二个更新语句没有where子句,因此将更新整个表:

UPDATE  ScndTable 
SET     Emp_ID=@ID, ContractDate=@ContractDate, HealthDate=@HealthDate
WHERE   EmpID IN (SELECT ID FROM @Ids);

答案 1 :(得分:0)

您的存储过程对我来说很奇怪。我相信第二个WHERE应该有UPDATE cluase,否则它将始终更新整个ScndTable表。 set @ID = SCOPE_IDENTITY();似乎在这里变得清晰。如果那里没有相应的Emp_ID,您是否尝试在ScndTable中执行插入? Finnaly显式创建一个事务来更新两个表或没有。

希望它有所帮助!

答案 2 :(得分:0)

请在执行第一个更新语句之前指定@ID变量的值。

我认为您正在尝试更新某些行,因此您可以从CSHARP代码中传递“id”值。当您使用SCOPE_IDENTITY时,您将获得最后插入的值。尝试从前端传递ID值。