2016-02-26 91 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值將不會與現有的值衝突