Я использую SqlDataAdapter для обновления моей таблицы данных, которую я запросил из базы данных в другом методе, и в этом методе были обновлены столбцы, 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;
}
Ошибка
Он заканчивается со следующей ошибкой в уловах блоке:
нарушения PRIMARY KEY ограничение «PK_ACCTS». Невозможно вставить дубликат ключа в объекте 'dbo.IMPORTED_ACCOUNTS'.
Комментарий Почему она пытается вставить строки в базе данных, когда они должны быть обновлены, поскольку они уже существуют в базе данных? Каковы условия для метода adapter.Update (dTable), когда он запускает Update скорее Insert?
Не могу понять ... Помощь действительно ценится!
Проверьте 'RowState'' DataRows', который вы пытаетесь обновить. Если у них есть 'Добавлено 'rowstate - тогда dataadapter попытается вставить соответствующие записи. –
Я только что проверил свойство RowState и да, это имеет значение «Добавлено». Что мне теперь делать? Сделать его нулевым? – Sadiq
Вы проверили здесь: https: //msdn.microsoft.com/en-in/library/z1z2bkx2 (v = vs.110) .aspx – TheGameiswar