Автогенерация ID при добавлении данных из DataSet в БД
От: ZORK Россия www.zorkaltsev.com
Дата: 18.12.02 16:24
Оценка:
Возможно ли организовать добавление строк в БД из DataSet’а используя DataAdapter, так что бы ID'и для новых строк генерировались в момент добавления, и полученные новые ID были присвоены соответствующим записям в DataSet’е. Насколько я сейчас понимаю– без stored procedures и писанного руками кода, который будет обновлять ID в DataSet, такое сделать невозможно.

Этот вопрос можно сформулировать несколько по другому: Возможно ли решить задачу добавления записей с генерацией ID используя только DataAdapter, созданный визуально, или необходим дополнительный код.

В настоящее время я разбираюсь с MS SQL, но решение для Oracle также интересно.

Спасибо,
zork
Думать надо ...головой :)
Re: Автогенерация ID при добавлении данных из DataSet в БД
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 18.12.02 16:28
Оценка:
Здравствуйте, ZORK, Вы писали:

ZOR>Возможно ли организовать добавление строк в БД из DataSet’а используя DataAdapter, так что бы ID'и для новых строк генерировались в момент добавления, и полученные новые ID были присвоены соответствующим записям в DataSet’е.


Нужно генерировать новый ID именно на стороне сервера? Или можно и в самом DataSet-е?
... << RSDN@Home 1.0 beta 3 >>
Re[2]: Автогенерация ID при добавлении данных из DataSet в Б
От: ZORK Россия www.zorkaltsev.com
Дата: 18.12.02 16:36
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG>Нужно генерировать новый ID именно на стороне сервера? Или можно и в самом DataSet-е?


Я пока делаю 2-х уровневое решение — у меня aspx и доступ к БД на одном сервере. Хотелось бы чтобы новые ID придумывал сам сервер — иначе, насколько я понимаю, надо же еще что-нить городить, чтоб получить уникальные ID для DataSet'а
Думать надо ...головой :)
Re: Автогенерация ID при добавлении данных из DataSet в БД
От: Roman Avramov  
Дата: 18.12.02 16:44
Оценка:
Здравствуйте, ZORK, Вы писали:

ZOR>Возможно ли организовать добавление строк в БД из DataSet’а используя DataAdapter, так что бы ID'и для новых строк генерировались в момент добавления, и полученные новые ID были присвоены соответствующим записям в DataSet’е. Насколько я сейчас понимаю– без stored procedures и писанного руками кода, который будет обновлять ID в DataSet, такое сделать невозможно.


ZOR>Этот вопрос можно сформулировать несколько по другому: Возможно ли решить задачу добавления записей с генерацией ID используя только DataAdapter, созданный визуально, или необходим дополнительный код.



Я сделал так:
1. Для колонки в DataTable, соответствующей primary key, ставим AutoIncrement = true; AutoIncrementSeed = -10; AutoIncrementStep = -1. Это позволяет генерить временные ключи, я их использую до сохранения записи в базу. Собсно, можно сделать их и положительными.
2. Вешаем обработчик на dataAdapter.RowUpdated и в нем вытаскиваем сгенерированное значение ключа (для Jet и MSSQL это SELECT @@IDENTITY через тот же коннекшн, для Oracle сообразишь сам). Прописываем его в DataRow.

Для MSSQL можно и проще — в InsertCommand.CommandText дописывашь тот же SELECT @@IDENTITY, и говоришь UpdatedRowSource = UpdateRowSource.FirstReturnedRecord.
Re[3]: Автогенерация ID при добавлении данных из DataSet в Б
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 18.12.02 16:44
Оценка:
Здравствуйте, ZORK, Вы писали:

ZOR>Я пока делаю 2-х уровневое решение — у меня aspx и доступ к БД на одном сервере. Хотелось бы чтобы новые ID придумывал сам сервер — иначе, насколько я понимаю, надо же еще что-нить городить, чтоб получить уникальные ID для DataSet'а


Если использовать в качестве id — GUID, то проблемы с уникальностью не возникнут.
... << RSDN@Home 1.0 beta 3 >>
Re: Автогенерация ID при добавлении данных из DataSet в БД
От: Oganes  
Дата: 18.12.02 17:26
Оценка:
Здравствуйте, ZORK, Вы писали:

ZOR>Возможно ли организовать добавление строк в БД из DataSet’а используя DataAdapter, так что бы ID'и для новых строк генерировались в момент добавления, и полученные новые ID были присвоены соответствующим записям в DataSet’е. Насколько я сейчас понимаю– без stored procedures и писанного руками кода, который будет обновлять ID в DataSet, такое сделать невозможно.


ZOR>Этот вопрос можно сформулировать несколько по другому: Возможно ли решить задачу добавления записей с генерацией ID используя только DataAdapter, созданный визуально, или необходим дополнительный код.


ZOR>В настоящее время я разбираюсь с MS SQL, но решение для Oracle также интересно.


ZOR>Спасибо,

ZOR>zork

Если у тебя таблица создана с ID int identity

(например)
CREATE TABLE [Test] (
    [TestID] [tinyint] IDENTITY (1, 1) NOT NULL ,
    [TestName] [varchar] (50) COLLATE Cyrillic_General_CI_AS NOT NULL ,
--...

) ON [PRIMARY]
GO




то при атвогенерации кода для DataAdapter в VS.NET можно выбрать опции, чтобы генерировался sql код, который после вставки делает select, который возвращает ID. Или(если нужно uniqueidentifier использовать в качестве ID) пишешь хранимую процедуру


Create procedure TestInsert
@testID uniqueidentifier output,
@testName varchar(10)
as
set @testID = newid()
insert into
test
(Testid, testname)
values
(@testid, @testname)
go


И потом делаешь mapping для dataadapter-а.
Re[2]: Автогенерация ID при добавлении данных из DataSet в Б
От: Аноним  
Дата: 20.12.02 12:32
Оценка:
Здравствуйте, Oganes, Вы писали:

O>(например)

O>[sql]
O>CREATE TABLE [Test] (
O> [TestID] [tinyint] IDENTITY (1, 1) NOT NULL ,
O> [TestName] [varchar] (50) COLLATE Cyrillic_General_CI_AS NOT NULL ,
O>--...

Спасибо. IDENTITY оказалось главное чего мне не хватало. Я создавал БД через Visio, просто говоря что поле ID это parent key, и не понял что там еще есть диалог второго уровня, в котором надо отметить check box говорящий для MS SQL что это поле еще и IDENTITY — я думал что того что я сказал что это parent key уже достаточно, оказалось что нет. Вообщем, кагда я с этим разобрался, Studio .Net стала для Adapter'а генерировать код, который правильно получает обратно ID.
Re[2]: Автогенерация ID при добавлении данных из DataSet в Б
От: DavidA  
Дата: 04.01.03 08:47
Оценка:
У меня есть таблица на MS SQL 7.0 TypDoc,в который один из столбцов IdTypDoc имеет тип :crash: автоинкримента,
данные в DateGrid я получаю следующем образом:


private SqlConnection conn;
private DataSet dsTypDoc;
private SqlDataAdapter sdaTypDoc;
private DataView dv;
private SqlCommandBuilder scbBuild;

..........................
..........................
conn=new SqlConnection(CLogSql.ConnectString);//CLogSql.ConnectString-статистическое свойство класса хранит строку соединения с SQL сервером
conn.Open();

dsTypDoc=new DataSet("ListTypDoc");

sdaTypDoc=new SqlDataAdapter("ListTypDoc",conn);
sdaTypDoc.SelectCommand.CommandType=CommandType.StoredProcedure;
scbBuild=new SqlCommandBuilder(sdaTypDoc);
sdaTypDoc.Fill(dsTypDoc,"ListTypDoc");

dv=new DataView(dsTypDoc.Tables["ListTypDoc"]);
dv.AllowDelete=false;
dv.AllowEdit=false;
dv.AllowNew=false;
DataGrid.DataSource=dv;

добавляю запись следующим образом:

.........................
DataRow Row=dsTypDoc.Tables["ListTypDoc"].NewRow();
Row["TypDoc"]="паспорт";
dsTypDoc.Tables["ListTypDoc"].Rows.Add(Row);
sdaTypDoc.Update(dsTypDoc,"ListTypDoc");
DataGrid.CurrentRowIndex=dsTypDoc.Tables["ListTypDoc"].Rows.Count-1;

при добавление записи ,у меня в стольбце IdTypDoc новой записи стоит Null,
и значение сгенерированное сервером отображается,толькло при повторном считывание данных,
когда я повтороно открываю форму

Как мне это побороть?
Re[3]: Автогенерация ID при добавлении данных из DataSet в Б
От: ZORK Россия www.zorkaltsev.com
Дата: 04.01.03 15:10
Оценка:
Здравствуйте, DavidA, Вы писали:

DA>Как мне это побороть?


Посмотри что там генерируется в InsertCommand. В тексте SQL должно быть обратное чтение данных. Как пример:

INSERT INTO Collocation(ID, State) VALUES (@ID, @State); 
SELECT ID, State FROM Collocation WHERE (ID = @ID)


И свойство UpdateRowSource в InsertCommand должно быть both

-zork
Думать надо ...головой :)
Re: Автогенерация ID при добавлении данных из DataSet в БД
От: vedmalex Россия  
Дата: 05.01.03 08:01
Оценка:
Здравствуйте, ZORK, Вы писали:

ZOR>Этот вопрос можно сформулировать несколько по другому: Возможно ли решить задачу добавления записей с генерацией ID используя только DataAdapter, созданный визуально, или необходим дополнительный код.


ZOR>В настоящее время я разбираюсь с MS SQL, но решение для Oracle также интересно.


Для Oracle есть достаточно постой способ генерации ID — использование Oracle Sequences в триггере/процедуре и функции или в процедуре ставки данных.
Это триггер.
create or replace trigger gen_id_trg
  before insert on dept  
  for each row
declare
 begin
  select some_table_seq.nextval into :new.some_table_id from dual;
end gen_id_trg;

а в inserte еще легче:
insert into some_table (id, name)
values (some_table_seq.nextval, 'Some Name');

при использовании триггера вставку модно выполнять таким образом:
insert into some_table (id, name)
values (0, 'Some Name');

Одно НО — в теле процедуры sequense можно использовать только в конструкциях эквивалентных запросам, объясню на примере:
такая конструкция хотя и не вызовет ошибки но работать не будет
declare
some_var number; 
begin
...
 some_var:=some_table_seq.nextval;
...
end some_proc;

необходим применять код показанный в примере триггера.
... << RSDN@Home 1.0 beta 4 >>
Re[4]: Автогенерация ID при добавлении данных из DataSet в Б
От: DavidA  
Дата: 05.01.03 09:07
Оценка:
Здравствуйте, ZORK, Вы писали:

ZOR>Здравствуйте, DavidA, Вы писали:


DA>>Как мне это побороть?


ZOR>Посмотри что там генерируется в InsertCommand. В тексте SQL должно быть обратное чтение данных. Как пример:


ZOR>
ZOR>INSERT INTO Collocation(ID, State) VALUES (@ID, @State); 
ZOR>SELECT ID, State FROM Collocation WHERE (ID = @ID)
ZOR>


ZOR>И свойство UpdateRowSource в InsertCommand должно быть both


ZOR>-zork


Спасибо попробовал получилось
Re[2]: Автогенерация ID при добавлении данных из DataSet в Б
От: ZORK Россия www.zorkaltsev.com
Дата: 05.01.03 23:24
Оценка:
Здравствуйте, vedmalex, Вы писали:

V> ...


Насколько я понял все эти примеры только про добавление новых записей, и они не отвечают на вопрос о том как сразу после записи получить обратно новый ID, полученный из sequence, чтобы сохранить его в записи DataSet'а. Или я что-то пропустил?

Другими словами, вопрос: как сделать для Oracle то что для MS SQL пишется так:

INSERT INTO Collocation(ID, State) VALUES (@ID, @State); 
SELECT @@IDENTITY AS ID


, где @@IDENTITY значение присвоенное identity-полю INSERT'ом. При этом выполняя матоде ExecuteScalar() для InsertStatement содержащий приведенный выше SQL-код, обратно получаем то самое новое @@IDENTITY.

-zork
Думать надо ...головой :)
Re[3]: Автогенерация ID при добавлении данных из DataSet в Б
От: vedmalex Россия  
Дата: 06.01.03 10:11
Оценка:
Здравствуйте, ZORK, Вы писали:

ZOR>Здравствуйте, vedmalex, Вы писали:


V>> ...


ZOR>Насколько я понял все эти примеры только про добавление новых записей, и они не отвечают на вопрос о том как сразу после записи получить обратно новый ID, полученный из sequence, чтобы сохранить его в записи DataSet'а. Или я что-то пропустил?


ZOR>Другими словами, вопрос: как сделать для Oracle то что для MS SQL пишется так:


ZOR>
ZOR>INSERT INTO Collocation(ID, State) VALUES (@ID, @State); 
ZOR>SELECT @@IDENTITY AS ID
ZOR>


ZOR>, где @@IDENTITY значение присвоенное identity-полю INSERT'ом. При этом выполняя матоде ExecuteScalar() для InsertStatement содержащий приведенный выше SQL-код, обратно получаем то самое новое @@IDENTITY.


я не совсем понял конечно тескт TSQL но что то вроде этого
create or replace procedure make_ins(IDs out Number, State in varchar2) as
declare 
begin
    select some_table_seq.nextval into IDs from dual;
    insert into collocation(ID,State) values (IDs,'State');
end;

Можно так. Но опятьже это в хранимой процедуре.
дело в том что
при всавке данных с использованием sequense вы можете использовать
....
some_table_seq.currval;
....

но никто не гарантирует что в этот момент ктонибудь не вставил данные в эту же таблицу.
таким образом у sequence есть два метода nextval и currval для получения соответственно следующего значения и текущего, причем при вызове nextval выполняется автоматический инкремент текущего значения.
Можно так же использовать cod control sequences т.е. сами создаете объект типа таблица
где полями являются текущее значение, шаг, максимальное значение и алгоритм инкремента после достижения максимального значения и работаете.
Я надеюсь что ответил наиболее полно на ваш вопрос.
... << RSDN@Home 1.0 beta 4 >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.