SQL DataAdapter.Update 中的按行更新
本文关键字:更新 DataAdapter Update SQL | 更新日期: 2023-09-27 17:55:34
我对DataAdapter.Update
有问题。
场景是这样的:我有一个这样的数据库表
Student
(StudentID INT NOT NULL,
STUDENTNAME NVARCHAR(100),
STUDENTIdentity INT DEFAULT 10)
在我的Datatable
中,我有这样的行
DS学生
StudentID STUDENTNAME STUDENTIdentity
1 AAA
2 BBB 20
3 CCC
当我尝试像这样更新学生Datatable
时
ds.Update(dsStudent,"Student");
这工作正常。但是我在数据库中studentidentity
列,插入 NULL 值而不是默认值 10。
我想实现OnRowUpdating
事件并更改参数以实现逐行更新语句更改。
但问题是这已经在我的项目中实现了。那么我们是否有任何通用解决方案来做到这一点?
我尝试更新的示例代码
dr = ds.Tables["Student"].NewRow(); dr["StudentId"] = 534; dr["StudentName"] = "robin"; ds.Tables["Student"].Rows.Add(dr); cmdBuilder = new SqlCommandBuilder(da); da.Update(ds, "Student");
与其使用
sqlcommandbuilder 生成更新命令,不如使用自己的 sql 命令。
更新:
SqlCommand upCmd = new SqlCommand(
"update emp set Name=@Name, Age=@Age where No=@No",con);
upCmd.Parameters.Add("@Name", SqlDbType.NChar, 10, "Name");
upCmd.Parameters.Add("@Age", SqlDbType.Int, 4, "Age");
upCmd.Parameters.Add("@No", SqlDbType.Int, 4, "No");
sqlDa.UpdateCommand = upCmd;
sqlDa.Update(dSet,"emp");
对于插入:
SqlCommand insCmd = new SqlCommand(
"insert into emp (Name, Age) values(@Name, @Age)",con);
insCmd.Parameters.Add("@Name", SqlDbType.NChar, 10, "Name");
insCmd.Parameters.Add("@Age", SqlDbType.Int, 4, "Age");
sqlDa.InsertCommand = insCmd;
sqlDa.Update(dSet,"emp");
在参数值中给出新的行值。
试试这个,让我知道/
DataAdapter.Update
方法使用DataAdapter.UpdateCommand.CommandText
与数据库通信。如果您查看字符串,默认情况下您会看到足以:
UPDATE [Student]
SET [StudentID] = @StudentID,
[STUDENTNAME] = @STUDENTNAME,
[STUDENTIdentity] = @STUDENTIdentity
WHERE
...
问题出在命令集显式DBNull
列的第 [STUDENTIdentity] = @STUDENTIdentity
行中。这就是数据库中的默认值不起作用的原因。
看到DataAdapter.UpdateCommand.CommandText
是一个可写属性。因此,最简单但不是通用的解决方案是复制以前的原始命令文本,删除有问题的行并将修改后的版本设置回来,因此:
UPDATE [Student]
SET [StudentID] = @StudentID,
[STUDENTNAME] = @STUDENTNAME
WHERE
...
之后,STUDENTIdentity 将不会显式更新,因此将使用数据库中的默认值。
您可能也应该更新InsertCommand
。