powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Проблема с обновлением
12 сообщений из 12, страница 1 из 1
Проблема с обновлением
    #32463035
mxsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть форма, связанная с Dataset и отображающая поэлементно одну запись с заданным id. (напр., на форме - набор текстовых полей, связанных с соотв. столбцами таблицы).
Изменяю данные в полях. Потом пытаюсь применить изменения, но данные не меняются в базе!!!
код при обновлении - стандартный
daPersons.Update(dsPersons,"Persons");

код для заполнения примерно такой:
daPersons.SelectCommand.Parameters["@id"].Value = id;
daPersons.Fill(dsPersons,"Persons");

Note. Перед обновлением смотрел на состояние записей - у всех стоит Unchanged.
В чем проблема???
...
Рейтинг: 0 / 0
Проблема с обновлением
    #32463082
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит комитите изменения перед вызовом метода Update. Привидите больше кода.
...
Рейтинг: 0 / 0
Проблема с обновлением
    #32463672
aoalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По всей видимости не хватает 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();
...
Рейтинг: 0 / 0
Проблема с обновлением
    #32463826
Dronopotamus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а помоему не хватает просто
BindingContext[имя датасета, "имя таблицы"].EndCurrentEdit();
...
Рейтинг: 0 / 0
Проблема с обновлением
    #32463868
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может не хватать чего угодно (или чего то лишком)
пока код не увидим не определимся.

>Note. Перед обновлением смотрел на состояние записей - у всех стоит Unchanged.

2 aoalex
Из чего можно сделать вывод что Builder тут совсем ни причем.
...
Рейтинг: 0 / 0
Проблема с обновлением
    #32463943
aoalex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тогда вопрос такой: если стоит unchanged и нет builder`a оно произведет обновление просто по update ?
У меня так не проходило (наверное и не могло)
И на счет BindingContext, оно испоьлзуется для control`ов на практике или есть и другие варианты?
...
Рейтинг: 0 / 0
Проблема с обновлением
    #32464003
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Тогда вопрос такой: если стоит unchanged и нет builder`a оно произведет обновление просто по update ?
У меня так не проходило (наверное и не могло)

Можно вполне обойтись без CommandBuilder'а.
Есть он или нет дело десятое, если стоит unchanged то обновлять и нечего.

>И на счет BindingContext, оно испоьлзуется для control`ов на практике или есть и другие варианты?

Есть - можно вообще ничего ни с чем не связывать а делать все в ручную.
...
Рейтинг: 0 / 0
Проблема с обновлением
    #32464124
mxsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Делаю 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

НЕ работает
...
Рейтинг: 0 / 0
Проблема с обновлением
    #32464142
mxsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BindingContext[имя датасета, "имя таблицы"].EndCurrentEdit();

Это помогло!!!!

В итоге код для обновления:

BindingContext[dsPerson, "Persons"].EndCurrentEdit();
daPersonOne.Update(dsPerson,"Persons");

Спасибо !!!
...
Рейтинг: 0 / 0
Проблема с обновлением
    #32464170
mxsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
еще вопрос в продожение темы 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)
???
...
Рейтинг: 0 / 0
Проблема с обновлением
    #32464251
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Не проще ли огромный Where в Update заменить на
WHERE (id = @id)

Если хотите в Where только первичный ключ, то при конфигурировании DataAdapter в Advanced Options снимите флажок Use Optimistic concurrency.
...
Рейтинг: 0 / 0
Проблема с обновлением
    #32464264
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>пробовал и с AcceptChanges и с присвоением параметра нужного id

AcceptChanges ставить нужно после Update если хотите чтобы что нибудь отправилось на обновление.

Так то же не будет обновления, не смотря на EndCurrentEdit.
Код: plaintext
1.
2.
3.
BindingContext[dsPerson,  "Persons" ].EndCurrentEdit(); 
dsPerson.AcceptChanges();
daPersonOne.Update(dsPerson, "Persons" ); 
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Проблема с обновлением
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]