1

このストアドプロシージャがあります

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";

そして今、私は出力値を取得したいのですが、入力クエリをパラメータ化せずに

私はこれを試しました:

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

そして、これは例外をスローします(パラメーター@total_salesはパラメーターリストにありません)。

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

4

2 に答える 2

6

簡単な答え:できません。

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

于 2011-09-22T13:26:07.440 に答える
1

まあ、これが役立つかどうかはわかりませんが、技術的には次のことが可能です:

TSQLスクリプトで、RAISERRORを使用して情報メッセージを生成します。これを使用して、変数の名前と値に関する情報を返すことができます。例えば

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

C#では、SqlConnection.InfoMessageイベントを使用して、これらのメッセージをキャッチします。返された文字列を解析して、名前と値を抽出します。これは、パラメーター値を返すための回り道ですが、機能します。

于 2011-09-24T01:22:34.177 に答える