我有两个表,我需要通过存储过程更新它们中的值。尝试过多更新但有时只更新第一个表,其他第二个甚至失败,因为不能允许重复。此外,当它更新表中的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();
}
有任何线索吗?
答案 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值。