gpt4 book ai didi

c# - 使用 Oracle 序列作为主键在数据绑定(bind)表单中添加新行

转载 作者:太空宇宙 更新时间:2023-11-03 11:47:31 25 4
gpt4 key购买 nike

我正在将 C# 与 Oracle 11g 连接起来。我有一个使用 Oracle 数据适配器填充的数据表。

OracleDataAdapter da;
DataTable dt = new DataTable();

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

我的数据绑定(bind)到数据表中各行的文本框很少。

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") 这很明显,因为没有为主键指定任何内容。如何解决这个问题?提前多谢 :)

最佳答案

一种解决方案是创建触发器,在插入时自动生成值。
像这样:

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 表的引述:

The DUAL table is a special one-row table present by default in all Oracle database installations.

由于 DUAL 表在 ORACLE 中很重要,这里有一些您可以了解它的资源:

关于c# - 使用 Oracle 序列作为主键在数据绑定(bind)表单中添加新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3033101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com