Как заменить таблицу базы данных на таблицу данных - PullRequest
1 голос
/ 10 мая 2011

Я пытаюсь заменить таблицу (FooTable) в моем источнике данных ( SQL CE База данных) на DataTable (которая связывается с DataGrid). Причина, по которой я хочу это сделать: после заполнения базы данных до DataSet (который показывает все строки в DataGrid), я могу редактировать, удалять и добавлять несколько строк в DataTable. Вместо того, чтобы обновлять свои изменения в DataSource (SQL CE) каждый раз, когда я изменял DataTable, я хочу сделать это коллективно в конце сеанса.

Мой подход прост:

  1. `УДАЛИТЬ` все данные из моей таблицы источников данных (FooTable) (я использую ** SQL CE **, поэтому` TRUNCATE` недоступен)
  2. ВСТАВИТЬ данные `DataTable's 'в пустую таблицу источников данных

Ниже приведен мой код C #

/* Truncate the DataSource Table */
SqlCeCommand delCmd = new SqlCeCommand("DELETE FROM FooTable", conn)
conn.Open();
delCmd.ExecuteNonQuery();
conn.Close();

/* Insert DataTable into an empty DataSource Table */
string ins = @"INSERT INTO FooTable (FooName) values (@fooName)";
SqlCeCommand cmd = new SqlCeCommand(ins, conn);
da.InsertCommand = cmd;
da.Update(ds, "FooTable");

Коды работают, если я добавляю или удаляю строки в DataTable, но когда я редактирую определенную строку в DataTable и вставляю таблицу в свой DataSource, я получаю следующую ошибку

"Для обновления требуется допустимая команда UpdateCommand при передаче коллекции DataRow с измененными строками."

Я не понимаю, почему я получаю эту ошибку. Я уже очистил все строки в моей таблице DataSource, и мой DataSource не должен знать, что есть измененные строки, но вставляет все строки DataTable как новые строки.

Или есть простой способ "ЗАМЕНИТЬ" таблицу DataSource с помощью DataTable?

[Изменено]

Я попытался установить RowState вручную, как показано ниже:

foreach (DataRow row in dt.Rows)
{
   row.RowState = DataRowState.Added;
}

но RowState доступен только для чтения и не может быть записан.

[РЕДАКТИРОВАНИЕ - 2-е] Я попытался установить его с помощью SetAdded ()

foreach (DataRow row in dt.Rows)
{
   row.SetAdded();
}

Тогда я получаю следующую ошибку: « SetAdded и SetModified могут вызываться только для DataRows с неизмененным DataRowState. »

Все равно не удалось заставить его работать ...

[отредактировано - 3-е] Итак, наконец, настройте его на работу со следующим кодом:

using (SqlCeCommand insCmd = new SqlCeCommand(@"INSERT INTO FooTable (FooName) VALUES (@fooName)", conn))
{
    insCmd.Parameters.Add("@fooName", SqlDbType.NVarChar, 10, "FooName");

    dt.AcceptChanges();
    foreach (DataRow row in dt.Rows)
    {
        row.SetAdded();
    }

    da.InsertCommand = insCmd;
    da.Update(ds, "FooTable");
}

1 Ответ

2 голосов
/ 10 мая 2011

DataTable отслеживает RowState с внутренней стороны.
При изменении существующей строки ее RowState становится Modified, поэтому DataAdapter пытается выполнить команду UPDATE.

Вам нужно вызвать метод SetAdded() в измененных строках, чтобы установить для RowState s значение Added вместо Modified.

...