C #: Получить выходной параметр запроса не параметризованной хранимой процедуры? - PullRequest
1 голос
/ 22 сентября 2011

У меня есть эта хранимая процедура

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 отсутствует в списке параметров).

Как получить выходной параметр в непараметризованном вызове хранимой процедуры БЕЗ параметризации запроса ?

Ответы [ 2 ]

6 голосов
/ 22 сентября 2011

Краткий ответ: Вы не можете.

Длинный ответ: вам нужно использовать ADO.NET более стандартным способом, чтобы позволить вам использовать такие вещи, как выходные параметры.

1 голос
/ 24 сентября 2011

Ну, не уверен, поможет ли это, но технически возможно следующее:

В ваших скриптах TSQL используйте RAISERROR для создания информационных сообщений. Вы можете использовать это, чтобы вернуть информацию об имени и значении переменных. например,

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

В C # используйте событие SqlConnection.InfoMessage, чтобы перехватить эти сообщения. Разобрать возвращенные строки, чтобы извлечь имена и значения. Это был бы окольный способ вернуть значения параметров, но это сработало бы.

...