Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 DataAdapter.Update  [new]
JeSert
Member

Откуда: Украина
Сообщений: 809
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.
вопрос простой из-за чего?
2 апр 05, 13:09    [1436151]     Ответить | Цитировать Сообщить модератору
 Re: DataAdapter.Update  [new]
кузя
Member

Откуда:
Сообщений: 1703
похоже, что ты используешь OleDb. там параметры - позиционные, т.е. их надо добвлять в коллекцию в поряке, в котором они встречаются в SQL запросе.
например для Update:
@subject_name_rus
@subject_name_eng
@id

ЗЫ
как правило используют знак вопроса для параметров (?), хотя некоторые провайдеры понимают и @
2 апр 05, 13:33    [1436178]     Ответить | Цитировать Сообщить модератору
 Re: DataAdapter.Update  [new]
кузя
Member

Откуда:
Сообщений: 1703
+
для параметров с новыми значениями нужно использовать текущую версию DataRow. оригинальная версия - только для параметров, входящих в WHERE кляузу (поиск)
2 апр 05, 13:38    [1436184]     Ответить | Цитировать Сообщить модератору
 Re: DataAdapter.Update  [new]
JeSert
Member

Откуда: Украина
Сообщений: 809
мг, спасибо щас попробуем
2 апр 05, 13:45    [1436186]     Ответить | Цитировать Сообщить модератору
 Re: DataAdapter.Update  [new]
кузя
Member

Откуда:
Сообщений: 1703
обрати внимание на синтаксис
UPDATE Предметы SET subject_name_rus=@subject_name_rus AND subject_name_eng=@subject_name_eng WHERE id=@id
наверное, должна быть запятая
2 апр 05, 13:52    [1436196]     Ответить | Цитировать Сообщить модератору
 Re: DataAdapter.Update  [new]
JeSert
Member

Откуда: Украина
Сообщений: 809
да записи престали дублироватся и остальные глюки ушли, а вот ? вместо @ не понемает, странно.
2 апр 05, 14:26    [1436227]     Ответить | Цитировать Сообщить модератору
 Re: DataAdapter.Update  [new]
кузя
Member

Откуда:
Сообщений: 1703
например, для INSERT
INSERT INTO Предметы(subject_name_rus, subject_name_eng) VALUES(?, ?) 
2 апр 05, 14:27    [1436228]     Ответить | Цитировать Сообщить модератору
 Re: DataAdapter.Update  [new]
JeSert
Member

Откуда: Украина
Сообщений: 809
ну AND он понимает только что в самом Access проверял
для Insert ? просто писать не указывая имени параметра?
это из-зи того что они ты говориш в коллекции в поряке идут?
2 апр 05, 14:44    [1436245]     Ответить | Цитировать Сообщить модератору
 Re: DataAdapter.Update  [new]
JeSert
Member

Откуда: Украина
Сообщений: 809
а как сдесь
cmInsert.Parameters.Add(new OleDbParameter("@subject_name_rus", OleDbType.VarChar, 255, ParameterDirection.Input, false, 0, 0, "subject_name_rus", DataRowVersion.Current, null));
будет выглядеть тогда
2 апр 05, 14:46    [1436249]     Ответить | Цитировать Сообщить модератору
 Re: DataAdapter.Update  [new]
кузя
Member

Откуда:
Сообщений: 1703
без разницы. параметры позиционные и имя параметра (ограничение - уникальнсть) - только для себя, чтобы удобно было вытаскивать по этому имени из коллекции.
2 апр 05, 14:51    [1436252]     Ответить | Цитировать Сообщить модератору
 Re: DataAdapter.Update  [new]
JeSert
Member

Откуда: Украина
Сообщений: 809
я имею введу нужно @ или ?ставить в
cmInsert.Parameters.Add(new OleDbParameter("@subject_name_rus", OleDbType.VarChar, 255, ParameterDirection.Input, false, 0, 0, "subject_name_rus", DataRowVersion.Current, null));
2 апр 05, 15:01    [1436259]     Ответить | Цитировать Сообщить модератору
 Re: DataAdapter.Update  [new]
кузя
Member

Откуда:
Сообщений: 1703
можешь указывать все что угодно :)
это имя - ТОЛЬКО ДЛЯ ТВОЕГО УДОБСТВА РАБОТЫ С КОЛЛЕКЦИЕЙ ПАРАМЕТРОВ. OleDb его не использует.
2 апр 05, 15:07    [1436269]     Ответить | Цитировать Сообщить модератору
 Re: DataAdapter.Update  [new]
JeSert
Member

Откуда: Украина
Сообщений: 809
Гуд, все прекрасно заработало InsertCommand выполняется
но я в затруднении со следующим DeleteCommand по какому принципу работает с удаленными из таблицы записями??
2 апр 05, 15:51    [1436313]     Ответить | Цитировать Сообщить модератору
 Re: DataAdapter.Update  [new]
кузя
Member

Откуда:
Сообщений: 1703
для каждой записи в состоянии DataRowState.Deleted выбирается из оригинального состояния значение id и выдается DELETE.
2 апр 05, 16:05    [1436323]     Ответить | Цитировать Сообщить модератору
 Re: DataAdapter.Update  [new]
JeSert
Member

Откуда: Украина
Сообщений: 809
у меня не работает ни DeleteCommand, ни UpdateCommand
2 апр 05, 16:11    [1436326]     Ответить | Цитировать Сообщить модератору
 Re: DataAdapter.Update  [new]
кузя
Member

Откуда:
Сообщений: 1703
выкладывай текст программы (как в первом посте)
2 апр 05, 16:12    [1436330]     Ответить | Цитировать Сообщить модератору
 Re: DataAdapter.Update  [new]
кузя
Member

Откуда:
Сообщений: 1703
+
судя по всему ты используешь Access и поле Id в твоей таблице - это Autonumber.
как ты возвращаешь его значение в DataTable после вставки (INSERT) новой записи в БД ?
2 апр 05, 16:46    [1436378]     Ответить | Цитировать Сообщить модератору
 Re: DataAdapter.Update  [new]
JeSert
Member

Откуда: Украина
Сообщений: 809
выкладываю
dsSubjects = new DataSet("AllSubjects");
coJDiploma = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source=jdiploma.mdb");
daJDiploma = new OleDbDataAdapter();
cmInsert = new OleDbCommand("INSERT INTO Предметы(subject_name_rus, subject_name_eng) VALUES(?, ?)", coJDiploma);
cmInsert.Parameters.Add(new OleDbParameter("@subject_name_rus", OleDbType.VarChar, 255, ParameterDirection.Input, false, 0, 0, "subject_name_rus", DataRowVersion.Current, null));
cmInsert.Parameters.Add(new OleDbParameter("@subject_name_eng", OleDbType.VarChar, 255, ParameterDirection.Input, false, 0, 0, "subject_name_eng", DataRowVersion.Current, null));
cmUpdate = new OleDbCommand("UPDATE Предметы SET subject_name_rus=? AND subject_name_eng=? WHERE id=?", coJDiploma);
cmUpdate.Parameters.Add(new OleDbParameter("@subject_name_rus", OleDbType.VarChar, 255, ParameterDirection.Input, false, 0, 0, "subject_name_rus", DataRowVersion.Current, null));
cmUpdate.Parameters.Add(new OleDbParameter("@subject_name_eng", OleDbType.VarChar, 255, ParameterDirection.Input, false, 0, 0, "subject_name_eng", DataRowVersion.Current, null));
cmUpdate.Parameters.Add(new OleDbParameter("@id", OleDbType.Integer, 10, ParameterDirection.Input, false, 0, 0, "id", DataRowVersion.Original, null));
cmDelete = new OleDbCommand("DELETE * FROM Предметы WHERE 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;
вот с Update ПРоблемы
lvi.Text = dlg_edit.SubjectNameRus;
lvi.SubItems[1].Text = dlg_edit.SubjectNameEng;
dsSubjects.Tables["Предметы"].Select("id="+lvi.SubItems[2].Text)[0].ItemArray[1] = dlg_edit.SubjectNameRus;
dsSubjects.Tables["Предметы"].Select("id="+lvi.SubItems[2].Text)[0].ItemArray[2] = dlg_edit.SubjectNameEng;
просто неудобство с ListView работать и еще при таком раскладе получается что записи в базел и в таблице вместо строк выдает 0 или -1, а почему не знаю
2 апр 05, 17:46    [1436438]     Ответить | Цитировать Сообщить модератору
 Re: DataAdapter.Update  [new]
кузя
Member

Откуда:
Сообщений: 1703
dsSubjects.Tables["Предметы"].Select("id="+lvi.SubItems[2].Text)[0].ItemArray[1] = dlg_edit.SubjectNameRus;
не понял, что это значит.

dsSubjects.Tables["Предметы"].Select("id="+lvi.SubItems[2].Text) - получешь массив DataRow
[0] - берешь из массива первую строку
ItemArray - получаешь временный массив значений полей строки
[1]=... во временном массиве меняешь значение

НО в DataRow никаких значений не заносишь. все твои исправления - просто в воздух (во временный массив).

в первом посте было лучше :)

и остался вопрос: как ты возвращаешь значение поля Id в DataTable после вставки (INSERT) новой записи в БД ?

---
и еще, попробуй вместо OleDbType.VarChar использовать OleDbType.VarWChar.
2 апр 05, 19:00    [1436500]     Ответить | Цитировать Сообщить модератору
 Re: DataAdapter.Update  [new]
JeSert
Member

Откуда: Украина
Сообщений: 809
кузя
НО в DataRow никаких значений не заносишь. все твои исправления - просто в воздух (во временный массив).

будем теперь знать исправлю то я уже чудил как мог.
кузя
и остался вопрос: как ты возвращаешь значение поля Id в DataTable после вставки (INSERT) новой записи в БД ?

понятия не имею, а зачем это делать, если я понял вопрос правильно то:
все изменения у меня происходят когда пользователь закрывает окно.
2 апр 05, 19:38    [1436549]     Ответить | Цитировать Сообщить модератору
 Re: DataAdapter.Update  [new]
кузя
Member

Откуда:
Сообщений: 1703
JeSert
...и еще при таком раскладе получается что записи в базе и в таблице вместо строк выдает 0 или -1, а почему не знаю
это числовые значения для False и True в Acceess (булевый тип). может это наведет тебя на какие нибудь мысли ?
2 апр 05, 19:46    [1436561]     Ответить | Цитировать Сообщить модератору
 Re: DataAdapter.Update  [new]
JeSert
Member

Откуда: Украина
Сообщений: 809
морачую голову себе и другим а ничего не получается UpdateCOmmand не работает я изменил на 1 вариант в отладке показывает что добавил в DataSet
кстати что значит в Watch когда значение красным выделено
2 апр 05, 19:57    [1436575]     Ответить | Цитировать Сообщить модератору
 Re: DataAdapter.Update  [new]
JeSert
Member

Откуда: Украина
Сообщений: 809
c 0, -1 получается закономерность, у меня в ListView 2 Columns если ввожу значение в левый тогда 0, если в правый - -1
2 апр 05, 20:01    [1436583]     Ответить | Цитировать Сообщить модератору
 Re: DataAdapter.Update  [new]
кузя
Member

Откуда:
Сообщений: 1703
если проект не очень большой - сархивируй (лучше zip) только тексты и выложи здесь. дальше уже нужно смотреть его работу.
2 апр 05, 22:18    [1436671]     Ответить | Цитировать Сообщить модератору
 Re: DataAdapter.Update  [new]
JeSert
Member

Откуда: Украина
Сообщений: 809
вот эта формачка

К сообщению приложен файл (AllSubjects.zip - 4Kb) cкачать
3 апр 05, 11:39    [1436909]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить