0

DB2データベースのクエリに使用するラッパーがあります。ラッパーを設定する方法では、接続はクエリメソッド内で作成および破棄されます。このようにして、私のラッパーのコンシューマーは、接続の管理(開閉)について心配する必要がありません。ストアドプロシージャを使用してこれを行う方法はありますか?一部のユーザーはアウトバウンドパラメーターを送信しますが、上記のクエリで行ったように、これらのパラメーターをデータテーブルに変換する方法はありますか?

    /// <summary>
    /// Query A database and return a DataTable of strings with no null
    /// </summary>
    /// <param name="txtQuery">The Query</param>
    /// <param name="list">the paramaters for the query</param>
    /// <returns>Datatable with results</returns>
    public DataTable Query(string txtQuery, params string[] list)
    {
     //create return ovject
        DataTable dt = new DataTable();
        //pull dbconnection out of pool
        using (var conn = new DB2Connection(connectionstring))
        {
            //open connection
            if (!OpenConn(conn))
            {
                throw new Exception(“failed to connect”);
            }
            try
            {
                //query db
                using (DB2Command cmd = new DB2Command())
                {
                    cmd.Connection = conn;
                    cmd.CommandText = txtQuery;
                    for (int i = 0; i < list.Length; i++)
                    {
                        DB2Parameter param = new DB2Parameter(i.ToString(), list[i]);
                        cmd.Parameters.Add(param);
                    }
                    //fill datatable
                    using (DB2DataAdapter adap = new DB2DataAdapter())
                    {
                        adap.SelectCommand = cmd;
                        adap.Fill(dt);
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }                
        }
       return dt;
    }
4

1 に答える 1

3

それを行うのは簡単ではありませんが、それは可能です。DB2Parameterは、この回答のSqlParameterと本質的に同じであると想定しています...

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter.aspxおよび関連するページは、私がここで言っていることの後で(またはその間に)読むのに役立ちます。

基本的に、出力パラメータを使用してプロシージャを呼び出す場合は、通常と同じ方法でプロシージャを呼び出します。出力パラメーターの場合、通常どおりオブジェクトを渡しますがDirection、パラメーターオブジェクトには、出力パラメーターであることを指定できるプロパティがあります。

プロシージャで適切なexecuteメソッドを呼び出すと、それらの出力パラメータの値が入力され、パラメータオブジェクトから取得できます。

それらをDataTableに配置するのはあなた次第です。データテーブルを作成し、出力パラメーターごとに列を追加してから、すべての値を含む行を追加できます。

これに関する主な問題は、もちろん、データベース呼び出しを設定するときに、適切に方向を設定できるように、何かを返すためにどのパラメーターが適切であるかを知る必要があることです。文字列配列だけを渡す場合、これはほぼ確実に不可能になります。

これに対する最善のアプローチは、他の人がコメントで示唆しているように、すべてのデータをデータセットとして返すことです。現在出力パラメーターを使用している既存のプロシージャーには、出力パラメーターをキャプチャーして、上記のように処理できるselectステートメントにそれらを入れるラッパー・プロシージャーを作成することができます。

もう1つのオプションは、Queryメソッドの呼び出し元に、使用しているパラメーター(inやoutなど)に関する詳細を渡してもらうことです。個人的には、この種のコードが単純になるため、出力パラメーターを使用するよりも、すべてのデータをselectとして返す方が好きです。

于 2012-11-20T16:01:42.017 に答える