3

ここ数時間、ADO.NET を使用した .NET アプリケーションを介して、Oracle データベースで (少なくとも SQL SERVER の場合は) 最も単純なことを実行しようとしています。無理そうです。

SQL SERVER の場合、SqlCommand オブジェクトがあると仮定して、この単純なタスクを実行します

comm.CommandText = @"
   DECLARE @next_id INT
   SET @next_id = (SELECT ISNULL(MAX(id_col),0) FROM TABLE_1) + 1
   INSERT INTO TABLE_1 (id_col, col1, ...) VALUES (@next_id, val1, ...)
   SELECT @next_id";
int id = Convert.ToInt32(comm.ExecuteScalar());

これにより、テーブル TABLE_1 に新しいレコードが挿入され、C# コードの "id" 変数に新しい ID が返されます。

4 つの簡単なステップ

  • 変数を宣言する
  • 次に使用可能な ID に設定します
  • 新しい変数を含むレコードを挿入します
  • 変数の値を返す

わかりました、Oracleクエリで変数を宣言することができました。また、私は(思う)それに値を与えることができました(SELECT INTOを使用)

この変数の値をC#に戻すにはどうすればよいですか? Oracle SQLの出力ストリームに変数の値を選択するにはどうすればよいですか?

ID 列を取り戻すためのより良い方法があることは知っていますが、それはここでの問題ではありません。まったく違う例かもしれません。質問は簡単です。: .net アプリ内から実行される Oracle SQL スクリプト内で変数を宣言しました。Oracleクエリから変数の値をC#に戻すにはどうすればよいですか? 上記のコードと同等の Oracle ADO.NET クエリは何ですか?

4

1 に答える 1

4

ODP.NET(OracleのOracle Data Accessコンポーネント)を使用することをお勧めします。

この例を以下に示します。ODP.NETでは、実行しているプロシージャまたはステートメントのパラメータに対応するパラメータの方向(入力、入出力、出力、戻り値)を確立できることに注意してください。この例では、戻り値を取得しています。これは、シーケンスとトリガーを介してdbによって生成されるIDです(.NETアプリに関する限り自動的に作成されます)。

int event_id = 0;
using (OracleConnection oraConn = new OracleConnection(connStr))
{
    string cmdText = @"insert into EVENT
        (EVENT_NAME, EVENT_DESC)
        values
        (:EVENT_NAME, :EVENT_DESC)
        RETURNING EVENT_ID INTO :EVENT_ID
        ";

    using (OracleCommand cmd = new OracleCommand(cmdText, oraConn))
    {
        oraConn.Open();
        OracleTransaction trans = oraConn.BeginTransaction();
        try
        {
            OracleParameter prm = new OracleParameter();
            cmd.BindByName = true;
            prm = new OracleParameter("EVENT_NAME", OracleDbType.Varchar2); 
            prm.Value = "SOME NAME"; cmd.Parameters.Add(prm);

            prm = new OracleParameter("EVENT_DESC", OracleDbType.Varchar2); 
            prm.Value = "SOME DESC"; cmd.Parameters.Add(prm);

            prm = new OracleParameter( "EVENT_ID"
                                     , OracleDbType.Int32
                                     , ParameterDirection.ReturnValue); 
            cmd.Parameters.Add(prm);

            cmd.ExecuteNonQuery();
            trans.Commit();
            // return value
            event_id = ConvertFromDB<int>(cmd.Parameters["EVENT_ID"].Value);
        }
        catch
        {
            trans.Rollback();
            throw;
        }
        finally
        {
            trans.Dispose();
        }
        oraConn.Close();
    }
} 

ConvertFromDBは、戻り値を同等の.NET(この場合はint)にキャストするための単なる汎用です。

お役に立てば幸いです。

編集:

ODP.NETで値の配列を簡単にバインド(および戻り値の配列を取得)できます。

using (OracleConnection oraConn = new OracleConnection(connStr))
{
    string cmdText = @"insert into TEST_EVENT
        (EVENT_NAME, EVENT_DESC)
        values
        (:EVENT_NAME, :EVENT_DESC)
        RETURNING EVENT_ID INTO :EVENT_ID
        ";

    using (OracleCommand cmd = new OracleCommand(cmdText, oraConn))
    {
        oraConn.Open();
        OracleTransaction trans = oraConn.BeginTransaction();
        try
        {
            string[] event_names = new string[2];
            string[] event_descs = new string[2];
            int[] event_ids = new int[2];

            event_names[0] = "Event1";
            event_descs[0] = "Desc1";

            event_names[1] = "Event2";
            event_descs[1] = "Desc2";

            OracleParameter prm = new OracleParameter();
            cmd.Parameters.Clear();
            cmd.ArrayBindCount = 2;
            cmd.BindByName = true;

            prm = new OracleParameter("EVENT_NAME", OracleDbType.Varchar2); 
            prm.Value = event_names; cmd.Parameters.Add(prm);

            prm = new OracleParameter("EVENT_DESC", OracleDbType.Varchar2); 
            prm.Value = event_descs; cmd.Parameters.Add(prm);

            prm = new OracleParameter( "EVENT_ID"
                                     , OracleDbType.Int32
                                     , ParameterDirection.ReturnValue); 
            cmd.Parameters.Add(prm);


            cmd.ExecuteNonQuery();
            trans.Commit();
            // get return values

            event_ids = (int[])(cmd.Parameters["EVENT_ID"].Value);
        }
        catch
        {
            trans.Rollback();
            throw;
        }
        finally
        {
            trans.Dispose();
        }
        oraConn.Close();
    }
}
于 2012-08-31T13:29:27.937 に答える