У меня есть служба WCF, которая принимает DataTable
и объединяет их в существующие данные. Раньше это требовало добавления строк, которые прекрасно работают, но с этим новым требованием удаления строк (независимо от того, существуют они или нет), у меня возникает проблема.Удалить строки из таблицы, не проверив, что они существуют, первые
В связи с тем, что количество строк, о которых идет речь, может быть довольно большим, как на сервере SQL, так и в DataTable
, я не хочу загружать существующие строки и сравнивать их с моим DataTable
.
Мой код выполняет следующие действия:
public Statistics ApplyChanges(DataTable changeData)
{
var stats = new Statistics();
if (changeData.IsEmpty)
{
Trace.WriteLine(string.Format("Client {0} had nothing to do; called ApplyChanges anyway. (Should normally not happen.)", ClientId));
return stats;
}
FooDataSet ds = new FooDataSet();
ds.Bar.Merge(changeData, false, MissingSchemaAction.Ignore);
foreach (var row in ds.Bar)
{
// This is the new requirement. If the incoming row's 'Value' is null,
// delete the row from the database, or, if the row doesn't exist, do
// nothing.
if (row.Field<string>("Value") == null)
row.Delete();
else
row.SetAdded();
}
int changesApplied;
using (var scope = new TransactionScope())
{
BarTableAdapter barAdapter = new BarTableAdapter();
changesApplied = barAdapter.Update(ds.Bar);
scope.Complete();
}
stats.ChangesApplied = changesApplied;
stats.ChangesFailed = ds.Bar.Count(r => r.HasErrors);
Trace.WriteLine(string.Format("Client {0} applied {1} changes, had {2} changes fail.", ClientId, changesApplied, stats.ChangesFailed));
return stats;
}
Теперь я (возможно, наивным) подумал, как с добавлением, что если строка не существует, то он будет либо игнорироваться, либо в худшем случае, имеют набор HasErrors
, но нет. Вместо этого, линия
changesApplied = barAdapter.Update(ds.Bar);
Выдает исключение, DBConcurrencyException
, со следующим сообщением: «нарушение Параллелизма: DeleteCommand затрагиваемой 0 из ожидаемых 1 записей.»
Я могу понять, почему это приятное уведомление, когда вы заботитесь о параллелизме, но мне это не нужно. Я просто хочу либо удалить строку, либо проигнорировать ее отсутствие.
Как вы знаете, если он существует или нет? Знает ли только база данных? –
Мне все равно, существует ли это или нет. Думаю, да? Дело в том, что вполне нормально запускать SQL, который удаляет строку, которая не существует (вы просто получите 0 затронутых строк), и это поведение, которое я хочу. – Alex