Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / DataAdapter перезагрузка DataSet после AccepChanges / 15 сообщений из 15, страница 1 из 1
14.07.2017, 10:21
    #39488872
Syrex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataAdapter перезагрузка DataSet после AccepChanges
Добрый день.
Использую БД 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
14.07.2017, 10:36
    #39488887
petalvik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataAdapter перезагрузка DataSet после AccepChanges
Syrex,

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

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

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

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

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

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

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

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

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

А так, тебе тогда надо как-то идентифицировать запись, (еще один ключь), ну и select ее.
...
Рейтинг: 0 / 0
14.07.2017, 11:38
    #39488951
fortibransa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataAdapter перезагрузка DataSet после AccepChanges
Вот например, студия нагенерила.
Код: 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
14.07.2017, 11:48
    #39488962
Syrex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataAdapter перезагрузка DataSet после AccepChanges
Спасибо.
Интересный запрос получился
...
Рейтинг: 0 / 0
14.07.2017, 12:30
    #39488999
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataAdapter перезагрузка DataSet после AccepChanges
fortibransaВот например, студия нагенерила.
Код: c#
1.
WHERE (ID = SCOPE_IDENTITY())";


Стремно это для многопользовательского режима... И весьма странно, что такое "студия нагенерила", ведь в t-sql есть output starting with 2008, а для более ранних версий можно сделать триггер "after insert" с "select * from inserted".
...
Рейтинг: 0 / 0
14.07.2017, 12:32
    #39489001
LR
LR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataAdapter перезагрузка DataSet после AccepChanges
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
14.07.2017, 12:35
    #39489005
fortibransa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataAdapter перезагрузка DataSet после AccepChanges
Причем SELECT после INSERT по всем полям, по видимому, мало-ли что у Вас там в триггерах и пр.
...
Рейтинг: 0 / 0
14.07.2017, 12:36
    #39489006
Syrex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataAdapter перезагрузка DataSet после AccepChanges
Там банальный триггер на вызов сиквенса
...
Рейтинг: 0 / 0
14.07.2017, 22:30
    #39489400
WitC
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataAdapter перезагрузка DataSet после AccepChanges
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
17.07.2017, 07:02
    #39489922
fortibransa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DataAdapter перезагрузка DataSet после AccepChanges
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
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / DataAdapter перезагрузка DataSet после AccepChanges / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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