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

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

1 ответ

Решение

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

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 - это специальная таблица из одной строки, присутствующая по умолчанию во всех установках базы данных Oracle.

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

Другие вопросы по тегам