2

我遇到了问题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");
4

2 回答 2

0

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

于 2013-05-07T07:30:40.000 回答
0

不要使用 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");

在参数值中给出您的新行值。

试试这个,让我知道/

于 2013-01-23T07:48:55.997 回答