Я пытаюсь заменить таблицу (FooTable) в моем источнике данных ( SQL CE База данных) на DataTable
(которая связывается с DataGrid
). Причина, по которой я хочу это сделать: после заполнения базы данных до DataSet
(который показывает все строки в DataGrid
), я могу редактировать, удалять и добавлять несколько строк в DataTable
. Вместо того, чтобы обновлять свои изменения в DataSource (SQL CE
) каждый раз, когда я изменял DataTable, я хочу сделать это коллективно в конце сеанса.
Мой подход прост:
- `УДАЛИТЬ` все данные из моей таблицы источников данных (FooTable) (я использую ** SQL CE **, поэтому` TRUNCATE` недоступен)
- ВСТАВИТЬ данные `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");
}