Добавить новую строку в форме с привязкой к данным с Oracle Sequence в качестве первичного ключа

2

Я подключаю С# к Oracle 11g. У меня есть DataTable, который я заполняю с использованием Oracle Data Adapter.

OracleDataAdapter da;
DataTable dt = new DataTable();

da = new OracleDataAdapter("SELECT * FROM Author", con);
da.Fill(dt);

У меня есть несколько текстовых полей, в которых у меня есть привязка к различным строкам в таблице данных.

txtAuthorID.DataBindings.Add("Text", dt, "AUTHORID");
txtFirstName.DataBindings.Add("Text", dt, "FIRSTNAME");
txtLastName.DataBindings.Add("Text", dt, "LASTNAME");
txtAddress.DataBindings.Add("Text", dt, "ADDRESS");
txtTelephone.DataBindings.Add("Text", dt, "TELEPHONE");
txtEmailAddress.DataBindings.Add("Text", dt, "EMAIL");

У меня также есть DataGridView под текстовыми полями, отображающими содержимое DataTable.

dgvAuthor.DataSource = dt;

Теперь, когда я хочу добавить новую строку, я делаю

bm.AddNew();

где bm определяется в Form_Load как

BindingManagerBase bm;
bm = this.BindingContext[dt];

И когда нажата кнопка сохранения после ввода и проверки всей информации, я делаю

this.BindingContext[dt].EndCurrentEdit();

try
{
da.Update(dt);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

Однако проблема возникает, когда я обычно вводю строку в базу данных (используя SQL Plus), я использую my_pk_sequence.nextval для первичного ключа. Но как я могу указать, что при добавлении новой строки в этот метод?

Я поймаю это исключение ORA-01400: cannot insert NULL into ("SYSMAN".AUTHOR.AUTHORID"), что очевидно, потому что ничего не было указано для первичного ключа. Как обойти это? Thanx много вперед:)

Теги:
ora-01400

1 ответ

2
Лучший ответ

Одним из решений является создание триггера, который автоматически генерирует значение для вставки.
Что-то вроде этого:

CREATE OR REPLACE TRIGGER trigger_name 
   BEFORE INSERT ON SYSMAN.AUTHOR.AUTHORID 
   REFERENCING 
      OLD AS OLD 
      NEW AS NEW 
   FOR EACH ROW      
   BEGIN
       SELECT my_sequence.NEXTVAL
       INTO :NEW.AUTHORID
       FROM DUAL;
   END;

Изменить:

Вот цитата из Википедии в таблице DUAL:

Таблица DUAL представляет собой специальную таблицу с одной строкой, представленную по умолчанию во всех установках базы данных Oracle.

Так как таблица DUAL важна в ORACLE, вот некоторые ресурсы, где вы можете узнать об этом:

  • 0
    Круто :) Один вопрос, что такое Dual? :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню