powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / DataAdapter перезагрузка DataSet после AccepChanges
15 сообщений из 15, страница 1 из 1
DataAdapter перезагрузка DataSet после AccepChanges
    #39488872
Syrex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Использую БД Oracle с триггером в столбце ID

Таблица:
ID - number
NAME - varchar

Далее есть форма с DataGridView и стандартной связкой через OracleDataAdapter:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
DataSet ds=new DataSet();
DataTable dt =new DataTable("table1")
ds.Aables.Add(dt)
OracleDataAdapter da= new OracleDataAdapter("select * from table1", con);
OracleCommandBuilder cmd=new OracleCommandBuilder(da)
da.Fill(dt);
dataGridView.DataSource=ds;
dataGridView.DataMemeber=dt.TableName;



Далее добавляю новые строки в DataGridView и передаю обновление в БД
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
if (ds.GetChanges() != null) {
    try {                    
        daArgs.Update(ds.Tables[dtArgs.TableName]);
        ds.AcceptChanges();        
    }
    catch (Exception exm) {
        ds.RejectChanges();
        MessageBox.Show(exm.Message);
    }
}



И вопрос: Как мне теперь обновить данные в DataSet, чтобы появилось значение в поле ID ?

Как это сделать правильно?
Может чего-то не дописал ври инициализации DataSet ?
...
Рейтинг: 0 / 0
DataAdapter перезагрузка DataSet после AccepChanges
    #39488887
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Syrex,

Дэвид Сеппа, "Программирование на ADO.NET 2.0", глава 11 "Сложные случаи обновления данных".

Вкратце, после вставки данных нужно сделать select нового id.

Вот только непонятно: id должен автогенерироваться при вставке (insert), а не при обновлении (update).
...
Рейтинг: 0 / 0
DataAdapter перезагрузка DataSet после AccepChanges
    #39488897
Syrex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня пока что есть только одно решение, но как-то это неправильно

сделать
Код: c#
1.
2.
dt.Clear();
da.Fill(dt)
...
Рейтинг: 0 / 0
DataAdapter перезагрузка DataSet после AccepChanges
    #39488909
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В MSSQL если делаешь типизированный DataSet в дизайнере, то студия сама в InsertCommand, после INSERT... вставляет SELECT
...
Рейтинг: 0 / 0
DataAdapter перезагрузка DataSet после AccepChanges
    #39488911
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем ты делаешь .AcceptChanges после Update.
...
Рейтинг: 0 / 0
DataAdapter перезагрузка DataSet после AccepChanges
    #39488929
Syrex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fortibransaВ MSSQL если делаешь типизированный DataSet в дизайнере, то студия сама в InsertCommand, после INSERT... вставляет SELECT
- В том-то и проблема - у меня Oracle

Если правильно помню, da.Update - это передача в БД
а ds.AcceptChanges - фиксация изменений в DataSet

Вроде все правильно, если нет - прошу направить кодом или линком
...
Рейтинг: 0 / 0
DataAdapter перезагрузка DataSet после AccepChanges
    #39488937
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SyrexfortibransaВ MSSQL если делаешь типизированный DataSet в дизайнере, то студия сама в InsertCommand, после INSERT... вставляет SELECT
- В том-то и проблема - у меня Oracle

Если правильно помню, da.Update - это передача в БД
а ds.AcceptChanges - фиксация изменений в DataSet

Вроде все правильно, если нет - прошу направить кодом или линкомНе правильно понял. Update выполняет что надо в зависимости от State записи, Delete? Insert Update и далее выполняется AcceptChanges.

Ты попробуй создать типизированный DataSet если у тебя есть в студии соответствующие типы для Oracle, они вообще-то должны быть.

А так, тебе тогда надо как-то идентифицировать запись, (еще один ключь), ну и select ее.
...
Рейтинг: 0 / 0
DataAdapter перезагрузка DataSet после AccepChanges
    #39488951
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот например, студия нагенерила.
Код: c#
1.
2.
3.
this._adapter.InsertCommand.CommandText = "INSERT INTO [Ispolnitel] ([UserName], [SName], [FName], [UserNumber], [Short])" +
"VALUES (@UserName, @SName, @FName, @UserNumber, @Short);" +
"\r\nSELECT ID, UserName, SName, FName, UserNumber, Short FROM Ispolnitel WHERE (ID = SCOPE_IDENTITY())";
...
Рейтинг: 0 / 0
DataAdapter перезагрузка DataSet после AccepChanges
    #39488962
Syrex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.
Интересный запрос получился
...
Рейтинг: 0 / 0
DataAdapter перезагрузка DataSet после AccepChanges
    #39488999
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fortibransaВот например, студия нагенерила.
Код: c#
1.
WHERE (ID = SCOPE_IDENTITY())";


Стремно это для многопользовательского режима... И весьма странно, что такое "студия нагенерила", ведь в t-sql есть output starting with 2008, а для более ранних версий можно сделать триггер "after insert" с "select * from inserted".
...
Рейтинг: 0 / 0
DataAdapter перезагрузка DataSet после AccepChanges
    #39489001
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRfortibransaВот например, студия нагенерила.
Код: c#
1.
WHERE (ID = SCOPE_IDENTITY())";


Стремно это для многопользовательского режима...
А, виноват, не прав. Вовсе не стремно))) "Returns the last identity value inserted into an identity column in the same scope. A scope is a module: a stored procedure, trigger, function, or batch."
...
Рейтинг: 0 / 0
DataAdapter перезагрузка DataSet после AccepChanges
    #39489005
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причем SELECT после INSERT по всем полям, по видимому, мало-ли что у Вас там в триггерах и пр.
...
Рейтинг: 0 / 0
DataAdapter перезагрузка DataSet после AccepChanges
    #39489006
Syrex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там банальный триггер на вызов сиквенса
...
Рейтинг: 0 / 0
DataAdapter перезагрузка DataSet после AccepChanges
    #39489400
WitC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fortibransaВот например, студия нагенерила.
Код: c#
1.
2.
3.
this._adapter.InsertCommand.CommandText = "INSERT INTO [Ispolnitel] ([UserName], [SName], [FName], [UserNumber], [Short])" +
"VALUES (@UserName, @SName, @FName, @UserNumber, @Short);" +
"\r\nSELECT ID, UserName, SName, FName, UserNumber, Short FROM Ispolnitel WHERE (ID = SCOPE_IDENTITY())";



в ДатаАдаптере ещё свойство включить надо:
Свойство DataAdapter.AcceptChangesDuringUpdate

и в селекте только одно поле ИД оставить...
...
Рейтинг: 0 / 0
DataAdapter перезагрузка DataSet после AccepChanges
    #39489922
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WitCfortibransaВот например, студия нагенерила.
Код: c#
1.
2.
3.
this._adapter.InsertCommand.CommandText = "INSERT INTO [Ispolnitel] ([UserName], [SName], [FName], [UserNumber], [Short])" +
"VALUES (@UserName, @SName, @FName, @UserNumber, @Short);" +
"\r\nSELECT ID, UserName, SName, FName, UserNumber, Short FROM Ispolnitel WHERE (ID = SCOPE_IDENTITY())";



в ДатаАдаптере ещё свойство включить надо:
Свойство DataAdapter.AcceptChangesDuringUpdate

и в селекте только одно поле ИД оставить...Эта хрень вообще-то включена по умолчанию и там нихрена не редактируется, студия все вернет так как она считает нужным.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / DataAdapter перезагрузка DataSet после AccepChanges
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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