2011-09-22 7 views
1

私はこのストアドプロシージャC#:パラメータ化されていないストアドプロシージャクエリの出力パラメータを取得しますか?

CREATE PROCEDURE [dbo].[TestProcedure] 
    @param1 int = 0 
    ,@param2 int = 0 
    ,@total_sales int = 5 OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SET @total_sales = @total_sales * 5 
    SELECT * FROM SomeTable 
END 

とC#

string strSQL = @" 
       DECLARE @RC int 
       DECLARE @param1 int 
       DECLARE @param2 int 
       DECLARE @total_sales int 

       -- TODO: Set parameter values here. 
       SET @param1 = 1 
       SET @param2 = 2 

       EXECUTE @RC = [TestDB].[dbo].[TestProcedure] 
        @param1 
        ,@param2 
        ,@total_sales OUTPUT"; 

そして今、私は、出力値を取得したい、が、入力クエリをパラメータ化なしでこの文字列を持っています!

私はこの試みた:(パラメータ@total_salesは、パラメータリストではありません)

using (System.Data.SqlClient.SqlCommand cmd = (System.Data.SqlClient.SqlCommand)idbConn.CreateCommand()) 
{ 
    cmd.CommandText = strSQL; 
    cmd.Transaction = (System.Data.SqlClient.SqlTransaction)idbtTrans; 

    iAffected = cmd.ExecuteNonQuery(); 
    idbtTrans.Commit(); 

    string strOutputParameter = cmd.Parameters["@total_sales"].Value.ToString(); 
    Console.WriteLine(strOutputParameter); 
} // End Using IDbCommand 

をそして、これは例外をスローします。

パラメータ化されていないストアドプロシージャコールで出力パラメータを取得するにはというクエリをパラメータなしで出力するにはどうすればよいですか?

+2

パラメータ化の嫌悪感は何ですか? – canon

+0

antisanity:データベースアクセスのための独自のメソッドがあり、SQL文字列が自動的に作成されます。私はいくつかのパラメータを追加するだけで、もう一度それを分解することを開始したくありません。 –

+1

@Quandary:SqlClientで既に提供されている機能をクラスで利用できるようにするために、別にしたくないですか? – canon

答えて

6

短い回答:できません。

長い回答:より標準的な方法でADO.NETを使用して、出力パラメータなどを活用する必要があります。

+2

あなたはおそらく、残念なことにおそらく正しいでしょう。(IDL) –

1

まあ、わからないこれが役立つ場合が、次は技術的には可能である:あなたのTSQLスクリプトで

、情報メッセージを高めるためにRAISERRORを使用しています。これを使用して、変数の名前と値に関する情報を返すことができます。例えば

DECLARE @Msg NVARCHAR(200) 
SET @Msg = 'totalsales=5' -- construct string of form : VariableName=ValueAsString 
RAISERROR(@Msg, 10, 1) 

C#では、これらのメッセージを捕捉するためにSqlConnection.InfoMessageイベントを使用します。返された文字列を解析して名前と値を抽出します。それはパラメータ値を返すラウンドアバウトの方法ですが、うまくいくでしょう。

関連する問題