2

我正在将 C# 与 Oracle 11g 连接起来。我有一个使用 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 中定义为

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

4

1 回答 1

2

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

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 中很重要,因此您可以从以下资源中了解它:

于 2010-06-13T17:28:35.287 回答