2009-09-01 11 views
4

複数のプロジェクトをOracleデータベースを使用してC#で展開しています。このC#でOracleストアドプロシージャへの安全なバインドを入力しますか?

  • は、データベース構造が
  • 再利用することができますを変更すると、それが簡単に維持できるようになり、データベース内のデータベース・ロジックのすべてを保つように私は、Oracleのストアドプロシージャ内のデータベース・ロジックをすべて実装したいと思いますより簡単なプログラミング言語間でのストアドプロシージャの

私はSYS_REFCURSORを使用して行を返すと私は手動でSYS_REFCURSORとして結果のデータバインドが何かを返すことができませんどこテストコードが実行されている - 安全で入力しないでそのすなわち

私の質問は - ストアドプロシージャの戻り値の型に正しい型を定義し、その型に正しくC#コードで正しくバインドできる方法はありますか?

私のPL/SQLプロシージャはこのようになります。戻り部分は型の安全ではありません。私は別のOracleパッケージからそれを再使用したい場合、それは

PROCEDURE get_risk (p_process_id IN NUMBER, p_risk OUT sys_refcursor); 

をチェックする正しい型を持っていないし、私のC#のコードは、次のようになります。私はいくつかのクラスから一緒にこれをまとめましたのでうまくいけば意味があります。私はDBの呼び出しからデータを抽出するとき、私は手動でデータ型を定義しています - 私は、Oracleデータ型が

// setup procedure call 
_oracleCommand = new OracleCommand("risk_pkg.get_risk", _conn.OracleConnection); 
_oracleCommand.Parameters.Add(new OracleParameter("p_process_id", OracleDbType.Int64, processId, ParameterDirection.Input)); 
_oracleCommand.Parameters.Add(new OracleParameter("p_risk", OracleDbType.RefCursor, null, ParameterDirection.Output)); 

_oracleDataAdapter = new OracleDataAdapter(_oracleCommand); 
_dataSet = new DataSet(); 

// call Oracle 
_oracleDataAdapter.Fill(_dataSet); 

// extract data - hand coded binding 
Int64 dbRiskId = (Int64)_dataSet.Tables[0].Rows[0][_dataSet.Tables[0].Columns["risk_id"]]; 
Int64 dbClientId = (Int64)_dataSet.Tables[0].Rows[0][_dataSet.Tables[0].Columns["client_id"]]; 

return new Risk(dbRiskId, dbClientId); 

ある。これは必ずしも問題ではありませんどのようなC#コードで知っておく必要があります - 私はしたいですPL/SQLを返す方法をより明確にし、C#コードをOracleのデータ型を知らなくてもいいようにする方法があるかどうかを知る - データベース構造の変更から私をカプセル化する -

これは実用的な解決策であるようです。私はまだ私のOracleプロシージャが戻り値の型を明示的に定義していないことに少しは満足していませんが、その人生は

答えて

2

です。

可能な戻り値を提供するために返される型はObjectです。手動で変換する必要があります。しかし、コンバージョンのコードを生成することができます。このメタ情報を持つテーブルまたはファイルを定義します。ストアドプロシージャはどのタイプを返しますか.Netタイプで変換されます。このメタ情報を使用してC#コードを作成します。

RefCursorsをDataTableに記入します。テーブルフィールドを適切なメンバ変数に割り当てるコードは、私たちのメタテーブルから生成されます。

+0

これは方法です。Oracleのプロシージャで戻り値の型を完全に定義できる方法を探していました。これにより、手続き型と安全に会話する他のコードも安全になります。私は、私が持っている問題は、私がインターフェイスを完全に定義していないことだと思います。データ型が実際に何であるか知っていれば、通常関数を書いてオブジェクトを返しません。 –

+0

はい、そのインターフェイスを定義します。私たちはOracleとSQL Serverをサポートしています。私たちは、DB固有のものを気にする両方のクラスを持っています。どちらも同じインターフェースを実装しています。 –

+0

OracleからSYS_REFCURSORとしてデータを戻しますか? –

1

私はこれをSQLサーバーで行うためにT4テキストテンプレートを使用しました。信じられないほどうまくいく。

+0

さらに詳しい情報がありますか? –

関連する問題