Я подключаю С# к 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 много вперед:)
Одним из решений является создание триггера, который автоматически генерирует значение для вставки.
Что-то вроде этого:
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, вот некоторые ресурсы, где вы можете узнать об этом: