Добавить новую строку в форме с привязкой к данным с 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, вот некоторые ресурсы, где вы можете узнать об этом:
- ДВОЙНОЙ стол из Википедии
- Спроси Тома "Все о ДВОЙНОМ СТОЛЕ"
- Stackru: Что такое двойная таблица в Oracle?
- Запрос Google: Oracle Dual Table
- Статьи по документации Oracle: