2016-02-26 92 views
0

我正在使用SqlDataAdapter更新我在另一个方法中从数据库中查询的dataTable,并且在那个方法中有更新的列Status和Is_processed。
现在,我希望这些更改在数据库中保留(更新)。下面是什么都做,以实现:SqlDataAdapter不更新数据库中的行

代码

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块以下错误结束:

违反PRIMARY KEY的约束'PK_ACCTS'。不能在对象'dbo.IMPORTED_ACCOUNTS'中插入 重复键。

评论 为什么试图数据库中插入行的时候,他们已经在数据库中不存在,他们应该更新? adapter.Update(dTable)方法的条件是什么,当它触发Update而不是Insert时?

想不通... 帮助确实感激不尽!

+0

检查您尝试更新的'DataRows'的'RowState'。如果他们有'增加'行状态 - 那么dataadapter会尝试插入适当的记录。 –

+0

我刚刚检查了RowState属性,并且它具有“添加”值。我现在应该怎么做?让它为空? – Sadiq

+0

你在这里检查过:https://msdn.microsoft.com/en-in/library/z1z2bkx2(v = vs.110).aspx – TheGameiswar

回答

2

在.NET中DataAdapter使da tabase根据DataRow.RowState属性进行更改。

在具有Added值的情况下 - dataadapter将尝试插入记录。 如果您需要更新记录 - 那么此属性应具有Modified值。

您不能直接设置值od RowState。例如,当您将数据行添加到dataTable时,它自动设置为Added

Hovewer,你仍然可以间接修改这个值。要做到这一点,您应该致电DataRow.AcceptChanges您需要更新的thouse数据行,这将设置RowStateUnchanged。那么你应该修改这些数据行中的任何东西,在这种情况下他们将有RowState = Modified

1

适配器将根据表中每行的DataRow.RowState决定何时插入,更新或删除。 有关可能的状态,请参见https://msdn.microsoft.com/es-es/library/system.data.datarowstate(v=vs.110).aspx

填充DataTable后,您可以调用DataTable.AcceptChanges方法将所有行标记为未更改。

另外,如果您有autonumeric PK,是一个最佳实践设置的那场DataTable中有这些属性:

  • 自动增量:真
  • AutoIncrementSeed:-1

最后一个确保如果您在数据表中插入新值,新的ID值将不会与现有的值冲突