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

Я соединяю C # с Oracle 11g.У меня есть DataTable, который я заполняю с помощью адаптера данных Oracle.

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 as

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 Ответ

2 голосов
/ 13 июня 2010

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

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 вот несколько ресурсов, где вы можете узнать об этом:

...