繁体   English   中英

SQL DataAdapter.Update中的按行更新

[英]Row-wise update in SQL DataAdapter.Update

我对DataAdapter.Update有问题。

场景是这样的:我有一个像这样的数据库表

Student
(StudentID INT NOT NULL,
 STUDENTNAME NVARCHAR(100),
 STUDENTIdentity    INT DEFAULT 10)

在我的Datatable我有诸如

dsStudent

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
    ...

问题出在[STUDENTIdentity] = @STUDENTIdentity ,其中命令将DBNull显式设置为该列。 这就是为什么数据库中的默认值不起作用的原因。

看到DataAdapter.UpdateCommand.CommandText是可写属性。 因此,最简单但非通用的解决方案是复制先前的原始命令文本,删除有问题的行,然后将修改后的版本设置回去,因此有:

UPDATE [Student]
SET [StudentID] = @StudentID,
    [STUDENTNAME] = @STUDENTNAME
WHERE
    ...

此后,不会显式更新STUDENTIdentity,因此将使用数据库中的默认值。

您可能也应该更新InsertCommand

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM