Моя сетка данных теряется при обновлении моей базы данных из набора данных сетки. Есть обходные пути? - PullRequest
0 голосов
/ 18 июня 2009

Я использую Datagrid Xceed, связанный с набором данных. Я хочу обновить базу данных при вызове RowEditEnd решетки данных. Проблема состоит в том, что во избежание нарушений параллелизма при обновлении мне необходимо очистить набор данных после обновления и заполнить его, как показано ниже:

public void UpdateDatabaseFromDataSet()
{
    adapter.Update(exampleDataSet);
    exampleDataSet.Clear();
    adapter.Fill(exampleDataSet);
}

Я думаю, что должен сделать это, потому что основной столбец автоинкремента моего набора данных "ID" не соответствует значениям, сгенерированным базой данных. Когда я очищаю набор данных, он очищает сетку данных и выбранную ячейку. Это очень раздражает, поскольку, если вы отредактируете ячейку и нажмете клавишу ввода или клавишу направления, ячейка и база данных обновятся нормально, но ваш выбор будет сброшен вместо перехода к следующей строке / ячейке. Это делает ввод данных вручную очень громоздким.

Вот метод, который создает набор данных:

public void InitDataSet(int tableid)
{
    cmd = new SQLiteCommand("SELECT * FROM table_" + tableid, con);
    adapter = new SQLiteDataAdapter(cmd);
    cb = new SQLiteCommandBuilder(adapter);

    try
    {

        exampleDataSet = new DataSet();

        adapter.Fill(exampleDataSet);
        prodDataSet.Tables[0].Columns[0].AutoIncrementSeed = -1;
        prodDataSet.Tables[0].Columns[0].AutoIncrementStep = -1;

        currenttableID = tableid;
    }
    catch (ApplicationException ex)
    {
        MessageBox.Show("Encountered an error.", "Error: " + ex.ToString());
    }
}

Обратите внимание, что я попытался установить для таблиц autoincrementseed и autoincrementsteps значение -1, но я все еще получаю нарушения параллелизма, если не пополняю набор данных.

Мне бы очень хотелось, чтобы моя таблица данных работала так, как она работает, если я не очищаю и не заполняю набор данных. Есть ли способ избежать нарушений параллелизма, с которыми я сталкиваюсь? Я поступаю неправильно?

Спасибо за вашу помощь. -Steven

Ответы [ 2 ]

1 голос
/ 19 июня 2009

Я не совсем понимаю всю проблему, но я мог бы дать вам кое-что
Когда вы не очищаете набор данных и вызываете «fill», он попытается «объединить» записи из БД с существующими записями. Ясно, что очистка заставляет вашу сетку обновиться ... потеря выбранной строки.

С
Adapter.FillLoadOption = LoadOption.PreserveChanges (или другое);
Вы можете влиять на то, как записи из БД, которые изменяются, объединяются с набором данных.


Теперь осталась одна проблема - определить новое значение autoinc , когда вставка произошла. Вы можете поймать Adapter.RowUpdated

void Adapter_RowUpdated(object sender, SqlRowUpdatedEventArgs e)
        {
            if (e.StatementType==StatementType.Insert)
            {

                Select last autoinc value with @@Identity  
                e.Row["ID"] = last autoinc value
            } 
        }

Итак:

  • Не очищать от данных
  • Поймать обновление строки и получить последнее значение autoinc в БД и вставить его в новую строку
  • Evt. Заполните вызов, чтобы увидеть, если другие пользователи внесли изменения
0 голосов
/ 27 июня 2009

Вот код, который работал для меня, и поместил его здесь для других.

Вот мой метод обновления поставщиков данных (обратите внимание, что мне удалось удалить дополнительный вызов заполнения):

public void UpdateDatabaseFromDataSet()
{
    adapter.Update(exampleDataSet);
}

А вот событие RowUpdated, которое я использую:

void adapter_RowUpdated(object sender, System.Data.Common.RowUpdatedEventArgs e)
{
    if (e.StatementType == StatementType.Insert)
    {
        SQLiteCommand cmdNewID = new SQLiteCommand("SELECT last_insert_rowid()", con);
        e.Row["RowID"] = cmdNewID.ExecuteScalar();
    }
}
...