C#からOracleのストアドプロシージャを呼び出す方法
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;
}
}
これで、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);
お役に立てれば
基本的には、次のコマンドを使用した非クエリコマンドと同じメカニズムです。
CommandType.StoredProcedure
たくさんの例がありますが、Googleが最初に返すのは this one です
SPが関数の場合、戻り値パラメーターはパラメーターコレクションの最初になければなりません。
このコードは、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#でのハッピーコーディング
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();
}
.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開発者を維持することに強い関心を持っているため、彼らは良いはずです。
の代わりに
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);