从存储过程返回一个SQL @参数到我的应用程序



在我发布之前我已经调查了这个问题,并找到了一些我试图应用的解决方案,但没有运气在它的工作。

我有一个将记录插入数据库的存储过程。我想返回一个值作为状态(我已经看到,在return中只能返回一个int,在这种情况下是可以的)。

ALTER PROCEDURE [dbo].[_example] 
-- Add the parameters for the stored procedure here
@Parameters)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @Example int
DECLARE @retVal int = 0
IF (@example is null)
BEGIN
SET @retVal +=1;
END

return @retVal
END

在我的c#代码中,我这样写:

public static int ExecuteSPWithReturnValue(string queryString)//not returning the value correctly
{
connection.Open();
SqlCommand command = new SqlCommand(queryString, connection)
{
CommandTimeout = 0
};
SqlParameter retVal = command.Parameters.Add("@retVal", SqlDbType.Int);
retVal.Direction = ParameterDirection.ReturnValue;
command.ExecuteNonQuery();
int result = (int)retVal.Value;
connection.Close();
return result;
}

我从另一个类中像这样调用它:

int returnStatus;
returnStatus = SQLUtility.ExecuteSPWithReturnValue("EXEC dbo._example " +
"@param1= '" + string + "'," +
"@param2= '" + string + "'," +
"@param3 = '" + string + "'," +
"@param4 ='" + string + "'");

但无论如何它都会返回0。我知道参数的值在0-3之间,但它没有被传递到int return Status中。

为什么?

问题似乎是您正在通过临时批处理发送,而不返回值。

您可以将批处理更改为

DECLARE @retval int;
EXEC @retval = dbo._example .....
RETURN @retval;

但是使用CommandType.StoredProcedure直接执行这个过程要好得多。这也避免了讨厌的SQL注入。

还请注意,您应该使用using来处理连接和命令对象,不要缓存它们

public static int ExecuteSPWithReturnValue(string queryString, bool isProcedure, params SqlParameter[] parameters)
{
using (var connection = new SqlConnection(myConnectionString))
using (SqlCommand command = new SqlCommand(queryString, connection))
{
if(isProcedure)
command.CommandType = CommandType.StoredProcedure;
command.CommandTimeout = 0;
command.Parameters.AddRange(parameters);
var retVal = command.Parameters.Add("@retVal", SqlDbType.Int);
retVal.Direction = ParameterDirection.ReturnValue;
connection.Open();
command.ExecuteNonQuery();
return (int)retVal.Value;
}

最新更新