c# DataTable, удаление добавленной строки

есть некоторые проблемы с наборами данных в c#, ​​которые представляют структуру и данные БД в sdf-файле. Я делаю автоматический тест с БД, поэтому я должен добавить несколько строк в таблицу, выполнить тест и удалить добавленные строки из таблицы.

Схема таблицы:

Num - ID, autoincrementing, primary key
Name - string
Photo - Image (binary)

Мой код:

    adapter.Fill(set);
    row1 = datatable.Rows.Add(null, "Name1", File.ReadAllBytes(@"Images\photo1.jpg"));
    row2 = datatable.Rows.Add(null, "Name2", File.ReadAllBytes(@"Images\photo2.jpg"));
    adapter.Update(set);

    ... perfoming test...

    adapter.Fill(set);
    row1.Delete();
    row2.Delete();
    adapter.Update(set);

Но добавленные строки все еще находятся в базе. я пытался использовать

datatable.Rows.Remove(row1);
datatable.Rows.Remove(row2);

но это вызывает исключение «нет такой строки» из-за неправильных значений «Число» в строке 1 и строке 2, которые отличаются от фактических автоматически увеличивающихся значений в БД.

  1. Как я могу получить истинные значения Num при добавлении строки?
  2. Есть ли более разумное решение проблемы «добавить строки» -> «выполнить что-то» -> «удалить добавленные строки»?

Заранее спасибо.


person Aleksei Petrov    schedule 21.03.2013    source источник
comment
я не уверен, но я думаю, что метод datatable.AcceptChanges может работать здесь для удаления этих удаленных строк из datatable.write datatable.AcceptChanges(); после удаления строк.   -  person Mogli    schedule 21.03.2013
comment
Попробуйте datatable.AcceptChanges(); после добавления строк в datatable   -  person freshbm    schedule 22.03.2013


Ответы (2)


Я сам нашел решение. Прежде всего, я создал SQL-запрос в БД, который добавляет строку и возвращает числовое значение новой строки:

INSERT INTO [Table] ([Name], [Photo]) VALUES (@Name, @Photo);
SELECT  @@IDENTITY

Я назвал его «InsertAndReturnIdentificator». И затем я использовал вставку (с этим новым запросом) и удаление строк в адаптере напрямую, без использования DataSet

private Nullable<decimal> row1;
private Nullable<decimal> row2;

row1 = adapter.InsertAndReturtIdentificator("Name1", File.ReadAllBytes(@"Images\Photo1.jpg")) as Nullable<decimal>;
row2 = adapter.InsertAndReturtIdentificator("Name2", File.ReadAllBytes(@"Images\Photo2.jpg")) as Nullable<decimal>;

... performing test ...

adapter.Delete(Decimal.ToInt32(row1.Value));
adapter.Delete(Decimal.ToInt32(row2.Value));
person Aleksei Petrov    schedule 22.03.2013

Я думаю, что проблема будет здесь:

row1 = datatable.Rows.Add(null, "Name1", File.ReadAllBytes(@"Images\photo1.jpg"));

Попробуйте заменить свои утверждения на:

int i = 0;
datatable.Rows.Add(i++, "Name1", File.ReadAllBytes(@"Images\photo1.jpg"));
datatable.Rows.Add(i++, "Name2", File.ReadAllBytes(@"Images\photo2.jpg"));

И удалить с

datatable.Rows[i].Delete();

Проверьте эти ссылки в MSDN:

person codingadventures    schedule 21.03.2013
comment
И если в базе данных уже есть строка со значениями поля Num 0 или 1, будет ошибка. Так что нельзя так. - person Aleksei Petrov; 22.03.2013