2

C#をOracle11gに接続しています。OracleDataAdapterを使用して入力するDataTableがあります。

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

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テーブルに関するウィキペディアからの引用は次のとおりです。

DUAL表は、すべてのOracleデータベースのインストールにデフォルトで存在する特別な1行の表です。

ORACLEではテーブルが重要であるため、DUALテーブルについて学ぶことができるリソースを次に示します。

于 2010-06-13T17:28:35.287 に答える