-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) целостности - исходный ключ
не найден.
Тоже пока не знаю, что делать..
-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.
-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: спасибо, с ключом разобралась. |
-----------------------------------------------------
Такая мысль меня посещала. Надо попробовать.
Хотя хотелось бы без выкрутасов. Есть компонент, значит должен работать.
Кроме того, при вызове сиквенса дополнительной командой, возможна потеря значения при неудавшемся инсерте.