WinForms DataGridView - обновить базу данных - PullRequest
3 голосов
/ 12 апреля 2010

Я знаю, что это базовая функция DataGridView, но по какой-то причине я просто не могу заставить его работать. Я просто хочу, чтобы DataGridView в моей форме Windows отправлял любые изменения, внесенные в нее, в базу данных, когда пользователь нажимает кнопку «Сохранить».

Я заполняю DataGridView в соответствии с функцией, вызванной выбором пользователя в DropDownList следующим образом:

using (SqlConnection con = new SqlConnection(conString))
{
    con.Open();
    SqlDataAdapter ruleTableDA = new SqlDataAdapter("SELECT rule.fldFluteType AS [Flute], rule.fldKnife AS [Knife], rule.fldScore AS [Score], rule.fldLowKnife AS [Low Knife], rule.fldMatrixScore AS [Matrix Score], rule.fldMatrix AS [Matrix] FROM   dbo.tblRuleTypes rule WHERE rule.fldMachine_ID = '1003'", con);
    DataSet ruleTableDS = new DataSet();
    ruleTableDA.Fill(ruleTableDS);
    RuleTable.DataSource = ruleTableDS.Tables[0];
}

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

using (SqlDataAdapter ruleTableDA = new SqlDataAdapter("SELECT rule.fldFluteType AS [Flute], rule.fldKnife AS [Knife], 
       rule.fldScore AS [Score], rule.fldLowKnife AS [Low Knife],
       rule.fldMatrixScore AS [Matrix Score], rule.fldMatrix AS [Matrix]
       FROM dbo.tblRuleTypes rule WHERE rule.fldMachine_ID = '1003'", con))
    {
        SqlCommandBuilder commandBuilder = new SqlCommandBuilder(ruleTableDA);
        DataTable dt = new DataTable();
        dt = RuleTable.DataSource as DataTable;
        ruleTableDA.Fill(dt);
        ruleTableDA.Update(dt);
    }

Хорошо, поэтому я отредактировал код, выполнив следующее: создайте команды, создайте DataTable на основе DataGridView (RuleTable), заполните DataAdapter с помощью DataTable и обновите базу данных. Теперь ruleTableDA.Update (dt) выдает исключение «Нарушение параллелизма: команда UpdateCommand затронула 0 из ожидаемых 1 записей.»

Ответы [ 3 ]

5 голосов
/ 12 апреля 2010

Я считаю, что здесь есть несколько проблем: Следует помнить, что когда вы загружаете свою сетку, она уже указывает на набор данных / набор. Когда вы вводите в сетку, изменения временно сохраняются в таблице данных, которая связана с сеткой. Следовательно, вы не хотите создавать таблицу данных при каждом сохранении, поскольку изменения, внесенные в существующую таблицу данных, игнорируются. Вторая проблема заключается в том, что вам, вероятно, не нужно каждый раз создавать источник привязки, поскольку, как и в первом пункте, если сетка показывает данные, уже существует источник привязки, с которым она связана. Третья проблема заключается в том, что класс SQLCommandBuilder имеет такие методы, как GetInsertCommand, GetUpdateCommand и т. Д., Которые необходимо использовать для фактического получения соответствующих команд.

using (SqlDataAdapter ruleTableDA = new SqlDataAdapter("SELECT rule.fldFluteType AS [Flute], rule.fldKnife AS [Knife], 
       rule.fldScore AS [Score], rule.fldLowKnife AS [Low Knife],
       rule.fldMatrixScore AS [Matrix Score], rule.fldMatrix AS [Matrix]
       FROM dbo.tblRuleTypes rule WHERE rule.fldMachine_ID = '1003'", con))
    {
        SqlCommandBuilder commandBuilder = new SqlCommandBuilder(ruleTableDA);
        DataTable dt = new DataTable();
        dt = RuleTable.DataSource as DataTable;
        //ruleTableDA.Fill(dt);
        ruleTableDA.Update(dt);
    }
2 голосов
/ 12 апреля 2010

Документация MSDN гласит, что команды обновления / удаления / вставки устанавливаются автоматически при ручной установке команды SelectCommand. Он не упоминает, что он делает то же самое, когда вы создаете его с помощью SqlDataAdapter. Попробуйте добавить эти строки после создания SqlCommanduBuilder.

ruleTableDA.UpdateCommand = commandBuilder.GetUpdateCommand()
ruleTableDA.InsertCommand = commandBuilder.GetInsertCommand()
ruleTableDA.DeleteCommand = commandBuilder.GetDeleteCommand()
0 голосов
/ 12 апреля 2010

Это может понадобиться для получения команды обновления

ruleTableDA.UpdateCommand = commandBuilder.GetUpdateCommand();
...