1

次の問題があります。データベースにシーケンスとトリガーがあり、それらは機能します。これは、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();
4

1 に答える 1