【发布时间】:2016-02-26 13:29:05
【问题描述】:
我正在使用 SqlDataAdapter 更新我在另一种方法中从数据库中查询的数据表,并且在该方法中更新了列 Status 和 Is_processed。
现在,我希望将这些更改保留(更新)在数据库中。以下是实现的目标:
代码
batchSize = 10;
string cmd;
int updatedRows;
try
{
string connString = db.ConnectionString;
using (SqlConnection conn = new SqlConnection(connString))
using (SqlDataAdapter adapter = new SqlDataAdapter())
{
cmd = "UPDATE IMPORTED_ACCOUNTS SET STATUS = @Status , IS_PROCESSED = @IsProcessed " +
", CREATED_ON = @CreatedOn , CREATED_BY = @CreatedBy , UPDATED_ON = @UpdatedOn , UPDATED_BY = @UpdatedBy " +
"WHERE CONVENTIONAL_ACCOUNT = @ConAcct";
adapter.UpdateCommand = new SqlCommand(cmd, conn);
adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.OutputParameters;
adapter.UpdateCommand.Parameters.AddWithValue("@Status", "Status");
adapter.UpdateCommand.Parameters.Add("@IsProcessed", SqlDbType.Bit, 1, dTable.Columns["IsProcessed"].ColumnName);
adapter.UpdateCommand.Parameters.Add("@CreatedOn",SqlDbType.DateTime,30, dTable.Columns["CreatedOn"].ColumnName);
adapter.UpdateCommand.Parameters.AddWithValue("@CreatedBy", dTable.Columns["CreatedBy"].ColumnName);
adapter.UpdateCommand.Parameters.Add("@UpdatedOn",SqlDbType.DateTime,30, dTable.Columns["UpdatedOn"].ColumnName);
adapter.UpdateCommand.Parameters.AddWithValue("@UpdatedBy", dTable.Columns["UpdatedBy"].ColumnName);
adapter.UpdateCommand.Parameters.AddWithValue("@ConAcct", dTable.Columns["ConventionalAccount"].ColumnName);
cmd = "INSERT INTO IMPORTED_ACCOUNTS ([STATUS],[IS_PROCESSED],[CREATED_ON],[CREATED_BY],[UPDATED_ON],[UPDATED_BY], CONVENTIONAL_ACCOUNT) " +
"VALUES (@Status , @IsProcessed, @CreatedOn, @CreatedBy, @UpdatedOn, @UpdatedBy, @ConAcct) ";
adapter.InsertCommand = new SqlCommand(cmd, conn);
adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.OutputParameters;
adapter.InsertCommand.Parameters.AddWithValue("@Status", dTable.Columns["Status"].ColumnName);
adapter.InsertCommand.Parameters.Add("@IsProcessed", SqlDbType.Bit, 1, dTable.Columns["IsProcessed"].ColumnName);
adapter.InsertCommand.Parameters.Add("@CreatedOn", SqlDbType.DateTime, 30, dTable.Columns["CreatedOn"].ColumnName);
adapter.InsertCommand.Parameters.AddWithValue("@CreatedBy", dTable.Columns["CreatedBy"].ColumnName);
adapter.InsertCommand.Parameters.Add("@UpdatedOn", SqlDbType.DateTime, 30, dTable.Columns["UpdatedOn"].ColumnName);
adapter.InsertCommand.Parameters.AddWithValue("@UpdatedBy", dTable.Columns["UpdatedBy"].ColumnName);
adapter.InsertCommand.Parameters.Add("@ConAcct", SqlDbType.VarChar, 100, dTable.Columns["ConventionalAccount"].ColumnName);
cmd = "DELETE FROM IMPORTED_ACCOUNTS WHERE CONVENTIONAL_ACCOUNT = @ConAcct";
adapter.DeleteCommand = new SqlCommand(cmd, conn);
adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.OutputParameters;
adapter.DeleteCommand.Parameters.AddWithValue("@ConAcct", dTable.Columns["ConventionalAccount"].ColumnName);
adapter.UpdateBatchSize = batchSize;
updatedRows = adapter.Update(dTable); // point where code breaks
}
return updatedRows;
}
catch (Exception ex)
{
return 0;
}
错误
catch 块中出现以下错误:
违反主键约束“PK_ACCTS”。无法插入 对象“dbo.IMPORTED_ACCOUNTS”中的重复键。
评论 为什么当它们应该被更新时,它试图在数据库中插入行,因为它们已经存在于数据库中? 当adapter.Update(dTable)方法触发Update而不是Insert时,条件是什么?
想不通... 非常感谢您的帮助!
【问题讨论】:
-
检查您正在尝试更新的
RowState或DataRows。如果他们有Addedrowstate - 那么 dataadapter 将尝试插入适当的记录。 -
我刚刚检查了 RowState 属性,是的,它具有“添加”值。我现在该怎么办?让它为空?
-
哦,它是一个只读属性。那么我怎样才能阻止它插入“已添加”?
标签: c# .net sql-server ado.net