|
Проблема с обновлением
|
|||
---|---|---|---|
#18+
Есть форма, связанная с Dataset и отображающая поэлементно одну запись с заданным id. (напр., на форме - набор текстовых полей, связанных с соотв. столбцами таблицы). Изменяю данные в полях. Потом пытаюсь применить изменения, но данные не меняются в базе!!! код при обновлении - стандартный daPersons.Update(dsPersons,"Persons"); код для заполнения примерно такой: daPersons.SelectCommand.Parameters["@id"].Value = id; daPersons.Fill(dsPersons,"Persons"); Note. Перед обновлением смотрел на состояние записей - у всех стоит Unchanged. В чем проблема??? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2004, 04:28 |
|
Проблема с обновлением
|
|||
---|---|---|---|
#18+
Значит комитите изменения перед вызовом метода Update. Привидите больше кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2004, 07:28 |
|
Проблема с обновлением
|
|||
---|---|---|---|
#18+
По всей видимости не хватает FbCommandBuilder (FB - это просто провайдер такой, читай Ole) Вот как это работатет у меня: this.AddConnection(); FbDataAdapter dataAdapter = new FbDataAdapter(); dataAdapter.SelectCommand = new FbCommand("Select ID,SENDER,DATA,PARSERED From archive Where PARSERED = 0 Order By ID", this.myConnection); DataSet dataSet= new DataSet(); dataAdapter.Fill(dataSet,"archive"); // this.dataVarArray = new DataVar(); // this.Device = new DeviceUtils(); int[] id_array = new int[1000]; j = 0; foreach(DataTable dTable in dataSet.Tables) { // For each row, print the values of each column. foreach(DataRow myRow in dTable.Rows) { if(myRow[dTable.Columns["SENDER"]].ToString().Length != 0) { Device.dataArchive = Convert.ToString(myRow[dTable.Columns["Data"]]); this.Device.adress = Convert.ToString(myRow[dTable.Columns["Sender"]]); id_array[j] = Convert.ToInt32(myRow[dTable.Columns["ID"]]); this.GetDeviceId(Device.adress); this.GetNodesID(); this.ParseData(); myRow["PARSERED"] = 1; j++; } } } FbCommandBuilder builder = new FbCommandBuilder(dataAdapter); try { dataAdapter.Update(dataSet,"archive"); } catch(System.InvalidOperationException e) { MessageBox.Show("Update error: "+e); } this.CloseConnection(); ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2004, 12:37 |
|
Проблема с обновлением
|
|||
---|---|---|---|
#18+
а помоему не хватает просто BindingContext[имя датасета, "имя таблицы"].EndCurrentEdit(); ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2004, 13:44 |
|
Проблема с обновлением
|
|||
---|---|---|---|
#18+
Может не хватать чего угодно (или чего то лишком) пока код не увидим не определимся. >Note. Перед обновлением смотрел на состояние записей - у всех стоит Unchanged. 2 aoalex Из чего можно сделать вывод что Builder тут совсем ни причем. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2004, 13:58 |
|
Проблема с обновлением
|
|||
---|---|---|---|
#18+
Тогда вопрос такой: если стоит unchanged и нет builder`a оно произведет обновление просто по update ? У меня так не проходило (наверное и не могло) И на счет BindingContext, оно испоьлзуется для control`ов на практике или есть и другие варианты? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2004, 14:24 |
|
Проблема с обновлением
|
|||
---|---|---|---|
#18+
>Тогда вопрос такой: если стоит unchanged и нет builder`a оно произведет обновление просто по update ? У меня так не проходило (наверное и не могло) Можно вполне обойтись без CommandBuilder'а. Есть он или нет дело десятое, если стоит unchanged то обновлять и нечего. >И на счет BindingContext, оно испоьлзуется для control`ов на практике или есть и другие варианты? Есть - можно вообще ничего ни с чем не связывать а делать все в ручную. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2004, 14:40 |
|
Проблема с обновлением
|
|||
---|---|---|---|
#18+
Делаю daPersons на выборку одной записи из таблицы - запись задается параметром @id. в конструкторе формы - заполняется датасет: id=1; daPersonOne.SelectCommand.Parameters["@id"].Value = id; daPersonOne.Fill(dsPerson,"Persons"); После запуска формы - в поля загрузились данные этой записи. Поля связаны механизмом DataBinding с соотв. столбцами датасета Потом изменяю какое-то поле и нажимаю кнопку Update, полный код обработчика: string lname=""; DataRowState st; foreach (DataRow r in dvPerson.Table.Rows) { lname = (string)r["lastName"]; st = r.RowState; // Unchanged } //dsPerson.AcceptChanges(); //daPersonOne.UpdateCommand.Parameters["@id"].Value = id; daPersonOne.Update(dsPerson,"Persons"); пробовал и с AcceptChanges и с присвоением параметра нужного id НЕ работает ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2004, 15:18 |
|
Проблема с обновлением
|
|||
---|---|---|---|
#18+
BindingContext[имя датасета, "имя таблицы"].EndCurrentEdit(); Это помогло!!!! В итоге код для обновления: BindingContext[dsPerson, "Persons"].EndCurrentEdit(); daPersonOne.Update(dsPerson,"Persons"); Спасибо !!! ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2004, 15:22 |
|
Проблема с обновлением
|
|||
---|---|---|---|
#18+
еще вопрос в продожение темы Update Зачем Адаптер в команде Update создает куча лишних параметров, когда достаточно одного id? this.sqlUpdateCommand1.CommandText = @"UPDATE Persons SET tableNumber = @tableNumber, lastName = @lastName, firstName = @firstName, middleName = @middleName, birthdate = @birthdate WHERE (id = @Original_id) AND (birthdate = @Original_birthdate OR @Original_birthdate IS NULL AND birthdate IS NULL) AND (firstName = @Original_firstName) AND (lastName = @Original_lastName) AND (middleName = @Original_middleName OR @Original_middleName IS NULL AND middleName IS NULL) AND (tableNumber = @Original_tableNumber); SELECT id, tableNumber, lastName, firstName, middleName, birthdate FROM Persons WHERE (id = @id)"; Не проще ли огромный Where в Update заменить на WHERE (id = @id) ??? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2004, 15:31 |
|
Проблема с обновлением
|
|||
---|---|---|---|
#18+
>Не проще ли огромный Where в Update заменить на WHERE (id = @id) Если хотите в Where только первичный ключ, то при конфигурировании DataAdapter в Advanced Options снимите флажок Use Optimistic concurrency. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2004, 15:55 |
|
Проблема с обновлением
|
|||
---|---|---|---|
#18+
>пробовал и с AcceptChanges и с присвоением параметра нужного id AcceptChanges ставить нужно после Update если хотите чтобы что нибудь отправилось на обновление. Так то же не будет обновления, не смотря на EndCurrentEdit. Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.03.2004, 16:00 |
|
|
start [/forum/topic.php?fid=17&msg=32464264&tid=1354169]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
300ms |
get topic data: |
13ms |
get forum data: |
4ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 413ms |
0 / 0 |