Не могу обновить данные в DataSet

JohnyDeath
Дата: 09.06.2010 15:28:49
В определенных условиях при попытки сохранения данных вываливается ошибка:
автор
"Нарушение параллелизма: UpdateCommand затронула 0 из ожидаемых 1 записей"


У меня на форме есть playersDataGridView, da - SqliteDataAdapter, ds - DataSet

При загрузке формы:
private void FormPlayersEdit_Load(object sender, EventArgs e)
{ 
string sql = "SELECT ID Код, Number Номер, Name Имя, BirthDate [Дата рождения], Discription Описание FROM Players";
da = new SQLiteDataAdapter(sql, tour.conn);
ds = new DataSet();
if (!RefreshView()) { return; }
SQLiteCommandBuilder cmdb = new SQLiteCommandBuilder(da);
da.UpdateCommand = cmdb.GetUpdateCommand();
  string UpdateCommandText = "UPDATE [Players] SET [Number] = @param1, [Name] = @param2, [BirthDate] = @param3, [Discription] = @param4 WHERE ([ID] = @param5)";
  da.UpdateCommand.CommandText = UpdateCommandText;
   
da.InsertCommand = cmdb.GetInsertCommand(true);
da.DeleteCommand = cmdb.GetDeleteCommand(true);
playersDataGridView.DataSource = ds.Tables[0].DefaultView;
playersDataGridView.Columns[0].Visible = false; 
}

сохраняю данные вот так:
private void SaveData()
       {
           this.Validate();
           this.playersDataGridView.EndEdit();
           try
           {
               this.da.Update(ds);
           }
           catch (Exception err)
           {
               Service.ErrorMessage("Не удалось сохранит данные по причине\:\n" + err.Message+
                   "\n"+da.UpdateCommand.CommandText
                   );
           }
       }

параллельно никто в базу ничего не пишет. Только я. Один.

уже сутки с этим бьюсь ((( Помогите, пожалуйста.
JohnyDeath
Дата: 09.06.2010 15:30:09
Причем в момент, когда я попадаю в исключение в da.UpdateCommand.CommandText почему-то попадает значение, которое генерируется изначально при
da.UpdateCommand = cmdb.GetUpdateCommand();
а именно:
UPDATE [Players] SET [Discription] = @Описание WHERE (([ID] = @Original_Код) AND ((@IsNull_Номер = 1 AND [Number] IS NULL) OR ([Number] = @Original_Номер)) AND ((@IsNull_Имя = 1 AND [Name] IS NULL) OR ([Name] = @Original_Имя)) AND ((@IsNull_Дата_рождения = 1 AND [BirthDate] IS NULL) OR ([BirthDate] = @Original_Дата_рождения)) AND ((@IsNull_Описание = 1 AND [Discription] IS NULL) OR ([Discription] = @Original_Описание)))
hstas
Дата: 09.06.2010 17:28:32
чтобы DataAdapter знал какие строки апдейтить, строки (DataRow) меняют свойство RowState на значение Modified. Смотрите в отладчике меняется ли RowState у строк где изменяется контент.
JohnyDeath
Дата: 09.06.2010 18:24:57
А можешь прям носом ткнуть, где смотреть это свойство? у какого объекта?

Пока методом тыка выкрутился так:
Добавил в конец функции SaveData() вызов вот этой:
bool RefreshView()
        {
            ds.Clear();
            try { da.Fill(ds); }
            catch (Exception err) { 
                MessageBox.Show("Не удалось отобразить данные по причине:\n" + err.Message);
                return false;
            }
            return true;
        }
Ясно, что решение дебильное, но как сделать иначе пока не знаю.
hstas
Дата: 10.06.2010 09:30:02
JohnyDeath
А можешь прям носом ткнуть, где смотреть это свойство? у какого объекта?


ds.Tables[0] - это DataTable. У него есть коллекция строк Rows (тип DataRow).
Когда происходит изменение данных - ты же знаешь какая строка меняется, вот и посмотри изменилось ли у нее RowState.
Судя по тексту ошибки - не изменилось. Вот и рой в этом направлении - почему.