我有这个存储过程
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不在参数列表中)。
如何在非参数化存储过程调用中检索输出参数而不参数化查询?
答案 0 :(得分:6)
简短的回答:你做不到。
长答案:您需要以更标准的方式使用ADO.NET,以便利用输出参数等内容。
答案 1 :(得分:1)
嗯,不确定这是否有帮助,但以下技术上是可行的:
在TSQL脚本中,使用RAISERROR引发信息性消息。您可以使用它来返回有关变量名称和值的信息。 e.g。
DECLARE @Msg NVARCHAR(200)
SET @Msg = 'totalsales=5' -- construct string of form : VariableName=ValueAsString
RAISERROR(@Msg, 10, 1)
在C#中,使用SqlConnection.InfoMessage事件来捕获这些消息。解析返回的字符串以提取名称和值。返回参数值将是一种迂回的方式,但它会起作用。