web-dev-qa-db-ja.com

C#からOracleストアドプロシージャを呼び出しますか?

C#からOracleのストアドプロシージャを呼び出す方法

25
Rohan

Microsoft OracleClient Developers向けにOracleが設定したこのODPサイトをご覧ください。 http://www.Oracle.com/technetwork/topics/dotnet/index-085703.html

また、C#からOracleへのストアドプロシージャの呼び出しを開始できるサンプルコードも以下にあります。 PKG_COLLECTION.CSP_COLLECTION_HDR_SELECTは、パラメーターPUNIT、POFFICE、PRECEIPT_NBRを受け入れ、T_CURSORで結果を返すOracle上に構築されたストアドプロシージャです。

using Oracle.DataAccess;
using Oracle.DataAccess.Client;

public DataTable GetHeader_BySproc(string unit, string office, string receiptno)
{
    using (OracleConnection cn = new OracleConnection(DatabaseHelper.GetConnectionString()))
    {
        OracleDataAdapter da = new OracleDataAdapter();
        OracleCommand cmd = new OracleCommand();
        cmd.Connection = cn;
        cmd.InitialLONGFetchSize = 1000;
        cmd.CommandText = DatabaseHelper.GetDBOwner() + "PKG_COLLECTION.CSP_COLLECTION_HDR_SELECT";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.Add("PUNIT", OracleDbType.Char).Value = unit;
        cmd.Parameters.Add("POFFICE", OracleDbType.Char).Value = office;
        cmd.Parameters.Add("PRECEIPT_NBR", OracleDbType.Int32).Value = receiptno;
        cmd.Parameters.Add("T_CURSOR", OracleDbType.RefCursor).Direction = ParameterDirection.Output;

        da.SelectCommand = cmd;
        DataTable dt = new DataTable();
        da.Fill(dt);
        return dt;
    }
}
32
hyperkittie

これで、C#からプロシージャを呼び出すために必要な手順が得られました。

   //GIVE PROCEDURE NAME
   cmd = new OracleCommand("PROCEDURE_NAME", con);
   cmd.CommandType = CommandType.StoredProcedure;

   //ASSIGN PARAMETERS TO BE PASSED
   cmd.Parameters.Add("PARAM1",OracleDbType.Varchar2).Value = VAL1;
   cmd.Parameters.Add("PARAM2",OracleDbType.Varchar2).Value = VAL2;

   //THIS PARAMETER MAY BE USED TO RETURN RESULT OF PROCEDURE CALL
   cmd.Parameters.Add("vSUCCESS", OracleDbType.Varchar2, 1);
   cmd.Parameters["vSUCCESS"].Direction = ParameterDirection.Output;

   //USE THIS PARAMETER CASE CURSOR IS RETURNED FROM PROCEDURE
   cmd.Parameters.Add("vCHASSIS_RESULT",OracleDbType.RefCursor,ParameterDirection.InputOutput); 

   //CALL PROCEDURE
   con.Open();
   OracleDataAdapter da = new OracleDataAdapter(cmd);
   cmd.ExecuteNonQuery();

   //RETURN VALUE
   if (cmd.Parameters["vSUCCESS"].Value.ToString().Equals("T"))
   {
      //YOUR CODE
   }
   //OR
   //IN CASE CURSOR IS TO BE USED, STORE IT IN DATATABLE
   con.Open();
   OracleDataAdapter da = new OracleDataAdapter(cmd);
   da.Fill(dt);

お役に立てれば

17
Rohan

基本的には、次のコマンドを使用した非クエリコマンドと同じメカニズムです。

  • command.CommandText =ストアドプロシージャの名前
  • command.CommandType = CommandType.StoredProcedure
  • Spが必要とするパラメーターの数だけcommand.Parameters.Addを呼び出します
  • command.ExecuteNonQuery

たくさんの例がありますが、Googleが最初に返すのは this one です

SPが関数の場合、戻り値パラメーターはパラメーターコレクションの最初になければなりません。

5
vc 74

このコードは、Oracleストアドプロシージャを呼び出す私にとってうまく機能します

ソリューションエクスプローラー>参照の追加> .Netでプロジェクト名を右クリックし、名前空間を追加して参照を追加します。

using System.Data.OracleClient;
using System.Data;

次に、このコードをイベントハンドラーに貼り付けます

        string str = "User ID=username;Password=password;Data Source=Test";
        OracleConnection conn = new OracleConnection(str);
        OracleCommand cmd = new OracleCommand("stored_procedure_name", conn);
        cmd.CommandType = CommandType.StoredProcedure;
        --Ad parameter list--
        cmd.Parameters.Add("parameter_name", "varchar2").Value = value;
        ....
        conn.Open();
        cmd.ExecuteNonQuery();

そしてその完了... C#でのハッピーコーディング

4
Abdul

Oracleへの接続はいです。 usingステートメントを使用したクリーンなコードを次に示します。他の多くのサンプルは、作成するオブジェクトのIDisposableメソッドを呼び出しません。

using (OracleConnection connection = new OracleConnection("ConnectionString"))
    using (OracleCommand command = new OracleCommand("ProcName", connection))             
    {
          command.CommandType = CommandType.StoredProcedure;
          command.Parameters.Add("ParameterName", OracleDbType.Varchar2).Value = "Your Data Here";
          command.Parameters.Add("SomeOutVar", OracleDbType.Varchar2, 120);
          command.Parameters["return_out"].Direction = ParameterDirection.Output;
          command.Parameters.Add("SomeOutVar1", OracleDbType.Varchar2, 120);
          command.Parameters["return_out2"].Direction = ParameterDirection.Output;
          connection.Open();
          command.ExecuteNonQuery();
          string SomeOutVar = command.Parameters["SomeOutVar"].Value.ToString();
          string SomeOutVar1 = command.Parameters["SomeOutVar1"].Value.ToString();
    }
3
Robert Stokes

.Netからバージョン4まででは、これはSQL Server Stored Procsの場合と同じ方法で実行できますが、以下が必要であることに注意してください。

using System.Data.OracleClient;

ここにシステム要件がいくつかあります シナリオで問題ないことを確認する必要があります。

Microsoftは 。Net 4の時点でこの名前空間を非推奨 であるため、将来サードパーティのプロバイダーが必要になります。これを念頭に置いて、Word Goから Oracle Data Provider for .Net (ODP.NET)を使用することをお勧めします。これには、Microsoftクラスにはない最適化があります。他のサードパーティオプションもありますが、Oracleは.Net開発者を維持することに強い関心を持っているため、彼らは良いはずです。

2
Steve Townsend

の代わりに

cmd = new OracleCommand("ProcName", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("ParName", OracleDbType.Varchar2, ParameterDirection.Input).Value = "foo";

次の構文も使用できます。

cmd = new OracleCommand("BEGIN ProcName(:p0); END;", con);
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add("ParName", OracleDbType.Varchar2, ParameterDirection.Input).Value = "foo";

注:cmd.BindByName = False(これがデフォルトです)コマンドストリングに記述されているのと同じ順序でパラメーターを追加する必要がありますが、実際の名前は関係ありません。ために cmd.BindByName = Trueパラメータ名は一致する必要があり、順序は関係ありません。

関数呼び出しの場合、コマンド文字列は次のようになります。

cmd = new OracleCommand("BEGIN :ret := ProcName(:ParName); END;", con);
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add("ret", OracleDbType.RefCursor, ParameterDirection.ReturnValue);    
cmd.Parameters.Add("ParName", OracleDbType.Varchar2, ParameterDirection.Input).Value = "foo";
// cmd.ExecuteNonQuery(); is not needed, otherwise the function is executed twice!
var da = new OracleDataAdapter(cmd);
da.Fill(dt);
1