次の問題があります。データベースにシーケンスとトリガーがあり、それらは機能します。これは、C#の挿入関数がIDを挿入せず、残りの列を挿入することを意味します。問題は、IDをパラメーターにバインドできないことです。ある種の更新として挿入後にヒットするテーブルからすべてを選択する別の関数があります。その関数は正しいIDを取得しますが、挿入時にクラスのパラメーターにバインドされていないため、後で失われると思います。
これが私のInsertIntoです:
transaction = oleCon.BeginTransaction();
oleComd = new OleDbCommand();
oleComd.Connection = oleCon;
oleComd.Transaction = transaction;
oleComd.CommandText = "Insert into OBJEKTI" +
"(NAZIV_OBJEKTA, SIFRA_MJESTA, SIFRA_REGION)" + "Values(:naziv, :mjesto, :region)";
oleComd.Parameters.AddWithValue(":naziv", objekti.NazivObjekta);
oleComd.Parameters.AddWithValue(":mjesto", objekti.Sifra_Mjesta);
oleComd.Parameters.AddWithValue(":region", objekti.Sifra_Region);
oleComd.ExecuteNonQuery();
transaction.Commit();
oleCon.Close();
そして、これが私のトリガーです:
create or replace
TRIGGER "OBJEKTI_ID_TRIG"
BEFORE INSERT ON "OBJEKTI"
FOR EACH ROW
DECLARE
BEGIN
SELECT OBJEKAT_ID_SEQ.NEXTVAL
INTO :NEW.OBJEKAT_ID
FROM DUAL;
END;
とにかく、皆さんが私を助けてくれることを本当に願っています。
私も今RETURNINGステートメントを試しましたが、コンパイルしてエラーなしで通過しますが、それでもキーは0として返されます(データベースではそうではありませんが、チェックしました)
oleComd.CommandText = "Insert into OBJEKTI" +
"(NAZIV_OBJEKTA, SIFRA_MJESTA, SIFRA_REGION)" + "Values(:naziv, :mjesto, :region) RETURNING (OBJEKAT_ID) into (:id)";
oleComd.Parameters.AddWithValue(":naziv", objekti.NazivObjekta);
oleComd.Parameters.AddWithValue(":mjesto", objekti.Sifra_Mjesta);
oleComd.Parameters.AddWithValue(":region", objekti.Sifra_Region);
oleComd.Parameters.AddWithValue(":id", objekti.ObjekatId);
編集:
私はこのコードをテストしました:
set serveroutput ON;
DECLARE
varid NUMBER;
BEGIN
Insert into OBJEKTI (NAZIV_OBJEKTA, SIFRA_MJESTA, SIFRA_REGION) Values('dino', 1, 1)
RETURNING OBJEKAT_ID INTO varid;
dbms_output.put_line (varid);
END;
そして、これは機能します。varidは、挿入でreturningを使用しても機能するはずであることを示していますが、それでも0が含まれているためではありません。
したがって、問題は
OleComd.Parameters.AddWithValue
関数ですが、これを機能させるために使用する他の関数がわかりません。
EDIT2:
したがって、Oracleフォーラムからの助けを借りて、私もこれを試しました。
oleComd.CommandText = "Insert into OBJEKTI" +
"(NAZIV_OBJEKTA, SIFRA_MJESTA, SIFRA_REGION)" + " Values(:naziv, :mjesto, :region ) RETURNING OBJEKAT_ID INTO :id";
oleComd.Parameters.AddWithValue(":naziv", objekti.NazivObjekta);
oleComd.Parameters.AddWithValue(":mjesto", objekti.Sifra_Mjesta);
oleComd.Parameters.AddWithValue(":region", objekti.Sifra_Region);
//oleComd.Parameters.Add(":id", OleDbType.).Direction = ParameterDirection.Output;
OleDbParameter id = new OleDbParameter();
id.ParameterName = "id";
id.OleDbType = OleDbType.Integer;
id.Direction = ParameterDirection.Output;
oleComd.Parameters.Add(id);
objekti.ObjekatId = Convert.ToInt32(id.Value);
しかし、もう一度私はどこにも行きませんでした。パラメータidの値をnullとして報告しています。私はそれを取得しません。
誰かが助けてくれることを願っています
EDIT3
私の最近の試みでは、これはリーダーのエラーで失敗します:「行/列にデータが存在しません」
transaction = oleCon.BeginTransaction();
oleComd = new OleDbCommand();
oleComd.Connection = oleCon;
oleComd.Transaction = transaction;
oleComd.CommandText = "Insert into OBJEKTI" +
"(NAZIV_OBJEKTA, SIFRA_MJESTA, SIFRA_REGION)" + " Values(:naziv, :mjesto, :region )";
oleComd.Parameters.AddWithValue(":naziv", objekti.NazivObjekta);
oleComd.Parameters.AddWithValue(":mjesto", objekti.Sifra_Mjesta);
oleComd.Parameters.AddWithValue(":region", objekti.Sifra_Region);
oleComd.ExecuteNonQuery();
transaction.Commit();
//oleCon2.Open();
transaction2 = oleCon.BeginTransaction();
oleComd2 = new OleDbCommand();
oleComd2.Connection = oleCon;
oleComd2.Transaction = transaction2;
oleComd2.CommandText = "select Objekat_ID from OBJEKTI where NAZIV_OBJEKTA=:naziv";
oleComd2.Parameters.AddWithValue(":naziv", objekti.NazivObjekta);
OleDbDataReader Reader = oleComd2.ExecuteReader();
objekti.ObjekatId = Convert.ToInt32(Reader["OBJEKAT_ID"]);
Reader.Close();
oleComd2.ExecuteNonQuery();
transaction2.Commit();