2010-04-12 3 views
3

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

Я заселить 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 записей».

+0

показать полный ЗЕЬЕСТ. CommandBuilder не работает (тихо), когда есть JOIN или что-то в этом роде. –

+0

Хорошо, я добавил инструкцию SQL. –

+0

Нет такой вещи, как C# .NET. –

ответ

5

Я считаю, что здесь есть несколько проблем: Последовательность, которую следует иметь в виду, заключается в том, что при загрузке сетки она уже указана на набор данных/набор. При вводе в сетку изменения временно сохраняются в таблице данных, привязанной к сетке. Поэтому вы не хотите создавать таблицу данных каждый раз при сохранении, поскольку изменения, внесенные в существующую таблицу данных, игнорируются. Вторая проблема заключается в том, что вам, вероятно, не нужно создавать источник привязки каждый раз, потому что, как и первая точка, если сетка показывает данные, уже есть источник привязки, к которому он привязан. Третья проблема заключается в том, что класс 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); 
    } 
+0

Я заполняю DataGridView, чтобы реагировать на выбор пользователя в DropDownList. Этот выбор запускает функцию FillData(), которая заполняет DataGridView. Я уточню вопрос с помощью этого точного кода. –

+0

Из его кода видно, что он заполняет сетку вручную. – Amsakanna

+2

Вам не нужно снова заполнять свой тип данных в кнопке сохранения. Помните, что мы пытаемся сохранить то, что существует в текущем datatable для базы данных. Вы переписываете изменения пользователей перед отправкой в ​​базу данных. – Jeremy

2

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

ruleTableDA.UpdateCommand = commandBuilder.GetUpdateCommand() 
ruleTableDA.InsertCommand = commandBuilder.GetInsertCommand() 
ruleTableDA.DeleteCommand = commandBuilder.GetDeleteCommand() 
+0

Спасибо! Это создает команды. Тем не менее, я все еще получаю исключение нарушения параллелизма. –

+1

Удалить этот код ruleTableDA.Fill (дт); от вашего метода сохранения – Amsakanna

+0

Вы нажимаете гвоздь на голове, Veer, который соответствует тому, что объясняет Джереми выше: я заполняю данные и удаляю пользовательские изменения перед обновлением. Я взял это, и это работает как шарм. Большое спасибо, ребята. –

0

Возможно, вам это, чтобы получить обновление Command

ruleTableDA.UpdateCommand = commandBuilder.GetUpdateCommand();