sequence

-ant-
Дата: 06.06.2005 13:43:09
Подскажите пожалуйста, как при вставке записи в БД ORACLE, вызвать для поля ID - sequence.nextval.
Запрос:
----------------------------------------------------
insert into tablename (id,name,nom,counter,year)
values (ND_SEQ_S.Nextval, 'Name 1',5,0,'05.06.2005')
----------------------------------------------------
Есть oledbdataadapter, dataset и datagrid.
InsertCommand
-----------------------------------------
INSERT INTO TABLENAME
(ID, NAME, NOM, COUNTER, YEAR)
VALUES (ND_SEQ_S.NEXTVAL, ?, ?, ?, ?,)
------------------------------------------

При вставке предупреждает, что поле ID не может быть null. Как правильно написать?
Lyrene
Дата: 09.06.2005 16:39:43
У тебя после последнего знака вопроса в insert-команде запятая лишняя, но проблема не из-за этого, наверное.

В книжке Дэвида Сеппы написано именно так, как ты пытаешься сделать. У меня тоже это сделать не получается, но выдает другую ошибку:
ORA-02291: нарушено ограничение (PGR.R_5) целостности - исходный ключ
не найден.

Тоже пока не знаю, что делать..
forlog
Дата: 10.06.2005 16:42:31
Как вариант. Присваивать значение полю из sequence в триггере на таблице.
Andrew IF
Дата: 14.06.2005 22:49:21
SQL> create sequence nd_seq_s;

Последовательность создана.

SQL> create table tablename (id number, name varchar2(10));

Таблица создана.

SQL> insert into tablename (id, name) values (nd_seq_s.nextval,'+');

1 строка создана.

SQL> insert into tablename (id, name) values (nd_seq_s.nextval,'-');

1 строка создана.

SQL> insert into tablename (id, name) values (nd_seq_s.nextval,'=');

1 строка создана.

SQL> commit;

Фиксация обновлений завершена.

SQL> select * from tablename;

        ID NAME           
---------- ---------- 
         1 +                
         2 -   
         3 =
Andrew IF
Дата: 14.06.2005 22:56:31
Lyrene
У тебя после последнего знака вопроса в insert-команде запятая лишняя, но проблема не из-за этого, наверное.

В книжке Дэвида Сеппы написано именно так, как ты пытаешься сделать. У меня тоже это сделать не получается, но выдает другую ошибку:
ORA-02291: нарушено ограничение (PGR.R_5) целостности - исходный ключ
не найден.

Тоже пока не знаю, что делать..


http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96525/e2100.htm

ORA-02291 integrity constraint (string.string) violated - parent key not found
Cause: A foreign key value has no matching primary key value.
Action: Delete the foreign key or add a matching primary key.
-ant-
Дата: 16.06.2005 12:54:15
Andrew IF
SQL> create sequence nd_seq_s;

Последовательность создана.

SQL> create table tablename (id number, name varchar2(10));

Таблица создана.

SQL> insert into tablename (id, name) values (nd_seq_s.nextval,'+');

1 строка создана.

SQL> insert into tablename (id, name) values (nd_seq_s.nextval,'-');

1 строка создана.

SQL> insert into tablename (id, name) values (nd_seq_s.nextval,'=');

1 строка создана.

SQL> commit;

Фиксация обновлений завершена.

SQL> select * from tablename;

        ID NAME           
---------- ---------- 
         1 +                
         2 -   
         3 =

--------------------------------------------
Кхе... вопрос не об этом.

Ошибка в передаче параметра - что-то вроде "Parametr[0] 'ID' has no default value".

Пробовал юзать ХП, но почему то она не видна в DataAdapter.
Lyrene
Дата: 16.06.2005 13:58:24
А если отдельным запросом получить sequence.nextval и передать параметром в команду вставки? Вот так:

System.Data.OleDb.OleDbCommand cmdGetID = new OleDbCommand("SELECT SEQ.NEXTVAL FROM DUAL", this.conn);
conn.Open();
int curID = Convert.ToInt16(cmdGetID.ExecuteScalar());
conn.Close();

// считаем, что параметры уже созданы и среди них есть параметр "ID"
this.DataAdapter.InsertCommand.Parameters["ID"].Value = curID;
this.DataAdapter.Update(DataSet, DataTable);

И тогда текст команды на вставку такой:

this.DataAdapter.InsertCommand = new OleDbCommand("INSERT INTO TABLENAME
(ID, NAME, NOM, COUNTER, YEAR) VALUES (?, ?, ?, ?, ?)", this.conn);

У меня так работает.

2Andrew IF: спасибо, с ключом разобралась.
Lyrene
Дата: 16.06.2005 13:59:27
А если отдельным запросом получить sequence.nextval и передать параметром в команду вставки? Вот так:

System.Data.OleDb.OleDbCommand cmdGetID = new OleDbCommand("SELECT SEQ.NEXTVAL FROM DUAL", this.conn);
conn.Open();
int curID = Convert.ToInt16(cmdGetID.ExecuteScalar());
conn.Close();

// считаем, что параметры уже созданы и среди них есть параметр "ID"
this.DataAdapter.InsertCommand.Parameters["ID"].Value = curID;
this.DataAdapter.Update(DataSet, DataTable);

И тогда текст команды на вставку такой:

this.DataAdapter.InsertCommand = new OleDbCommand("INSERT INTO TABLENAME
(ID, NAME, NOM, COUNTER, YEAR) VALUES (?, ?, ?, ?, ?)", this.conn);

У меня так работает.

2Andrew IF: спасибо, с ключом разобралась.
Роман Дынник
Дата: 16.06.2005 14:29:14

лучше сиквенс отдельным запросом получать


Posted via ActualForum NNTP Server 1.2

-ant-
Дата: 17.06.2005 13:13:04
Lyrene
А если отдельным запросом получить sequence.nextval и передать параметром в команду вставки? Вот так:

System.Data.OleDb.OleDbCommand cmdGetID = new OleDbCommand("SELECT SEQ.NEXTVAL FROM DUAL", this.conn);
conn.Open();
int curID = Convert.ToInt16(cmdGetID.ExecuteScalar());
conn.Close();

// считаем, что параметры уже созданы и среди них есть параметр "ID"
this.DataAdapter.InsertCommand.Parameters["ID"].Value = curID;
this.DataAdapter.Update(DataSet, DataTable);

И тогда текст команды на вставку такой:

this.DataAdapter.InsertCommand = new OleDbCommand("INSERT INTO TABLENAME
(ID, NAME, NOM, COUNTER, YEAR) VALUES (?, ?, ?, ?, ?)", this.conn);

У меня так работает.

2Andrew IF: спасибо, с ключом разобралась.

-----------------------------------------------------
Такая мысль меня посещала. Надо попробовать.
Хотя хотелось бы без выкрутасов. Есть компонент, значит должен работать.
Кроме того, при вызове сиквенса дополнительной командой, возможна потеря значения при неудавшемся инсерте.