2011-09-22 2 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"; 

А теперь я хочу, чтобы получить выходное значение, но без параметризующих входного запроса!

Я попытался это:

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

Какое у вас отвращение к параметризации? – canon

+0

antisanity: У меня есть собственные методы доступа к базе данных, и строка SQL создается автоматически. Я не хочу снова разглядывать его, просто чтобы добавить некоторые параметры. –

+1

@Quandary: Вы не хотите разделять его, чтобы позволить вашему классу использовать функциональность, уже предоставленную SqlClient? – canon

ответ

6

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

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

+2

Возможно, вы, вероятно, правы. –

1

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

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

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

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