DataAdapter.Update

JeSert
Дата: 02.04.2005 13:09:34
cmInsert = new OleDbCommand("INSERT INTO Предметы(subject_name_rus, subject_name_eng) VALUES(@subject_name_rus, @subject_name_eng)", coJDiploma);
			cmInsert.Parameters.Add(new OleDbParameter("@subject_name_rus", OleDbType.VarChar, 255, ParameterDirection.Input, false, 0, 0, "subject_name_rus", DataRowVersion.Original, null));
			cmInsert.Parameters.Add(new OleDbParameter("@subject_name_eng", OleDbType.VarChar, 255, ParameterDirection.Input, false, 0, 0, "subject_name_eng", DataRowVersion.Original, null));
			cmUpdate = new OleDbCommand("UPDATE Предметы SET subject_name_rus=@subject_name_rus AND subject_name_eng=@subject_name_eng WHERE id=@id", coJDiploma);
			cmUpdate.Parameters.Add(new OleDbParameter("@id", OleDbType.Integer, 10, ParameterDirection.Input, false, 0, 0, "id", DataRowVersion.Original, null));
			cmUpdate.Parameters.Add(new OleDbParameter("@subject_name_rus", OleDbType.VarChar, 255, ParameterDirection.Input, false, 0, 0, "subject_name_rus", DataRowVersion.Original, null));
			cmUpdate.Parameters.Add(new OleDbParameter("@subject_name_eng", OleDbType.VarChar, 255, ParameterDirection.Input, false, 0, 0, "subject_name_eng", DataRowVersion.Original, null));
			cmDelete = new OleDbCommand("DELETE * FROM Предметы WHERE id=@id", coJDiploma);
			cmDelete.Parameters.Add(new OleDbParameter("@id", OleDbType.Integer, 10, ParameterDirection.Input, false, 0, 0, "id", DataRowVersion.Original, null));
			daJDiploma.InsertCommand = cmInsert;
			daJDiploma.UpdateCommand = cmUpdate;
			daJDiploma.DeleteCommand = cmDelete;
код сохранения
foreach(ListViewItem lvi in lvAllSubjects.Items)
			{
				if(lvi.SubItems[2].Text != "0")
				{
					dsSubjects.Tables["Предметы"].Select("id="+lvi.SubItems[2].Text)[0][1] = lvi.SubItems[0].Text;
					dsSubjects.Tables["Предметы"].Select("id="+lvi.SubItems[2].Text)[0][2] = lvi.SubItems[1].Text;
				}
				else
					dsSubjects.Tables["Предметы"].Rows.Add(new object[]{null, lvi.Text, lvi.SubItems[1].Text});
			}
			daJDiploma.Update(dsSubjects.Tables["Предметы"]);
ошибка
System.Data.DBConcurrencyException: Concurrency violation: the UpdateCommand affected 0 records.
вопрос простой из-за чего?
кузя
Дата: 02.04.2005 13:33:53
похоже, что ты используешь OleDb. там параметры - позиционные, т.е. их надо добвлять в коллекцию в поряке, в котором они встречаются в SQL запросе.
например для Update:
@subject_name_rus
@subject_name_eng
@id

ЗЫ
как правило используют знак вопроса для параметров (?), хотя некоторые провайдеры понимают и @
кузя
Дата: 02.04.2005 13:38:10
+
для параметров с новыми значениями нужно использовать текущую версию DataRow. оригинальная версия - только для параметров, входящих в WHERE кляузу (поиск)
JeSert
Дата: 02.04.2005 13:45:37
мг, спасибо щас попробуем
кузя
Дата: 02.04.2005 13:52:54
обрати внимание на синтаксис
UPDATE Предметы SET subject_name_rus=@subject_name_rus AND subject_name_eng=@subject_name_eng WHERE id=@id
наверное, должна быть запятая
JeSert
Дата: 02.04.2005 14:26:11
да записи престали дублироватся и остальные глюки ушли, а вот ? вместо @ не понемает, странно.
кузя
Дата: 02.04.2005 14:27:59
например, для INSERT
INSERT INTO Предметы(subject_name_rus, subject_name_eng) VALUES(?, ?) 
JeSert
Дата: 02.04.2005 14:44:00
ну AND он понимает только что в самом Access проверял
для Insert ? просто писать не указывая имени параметра?
это из-зи того что они ты говориш в коллекции в поряке идут?
JeSert
Дата: 02.04.2005 14:46:55
а как сдесь
cmInsert.Parameters.Add(new OleDbParameter("@subject_name_rus", OleDbType.VarChar, 255, ParameterDirection.Input, false, 0, 0, "subject_name_rus", DataRowVersion.Current, null));
будет выглядеть тогда
кузя
Дата: 02.04.2005 14:51:15
без разницы. параметры позиционные и имя параметра (ограничение - уникальнсть) - только для себя, чтобы удобно было вытаскивать по этому имени из коллекции.