我有以下查询:
set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER PROCEDURE [dbo].[Validate] @a varchar(50), @b varchar(50) output AS SET @Password = (SELECT Password FROM dbo.tblUser WHERE Login = @a) RETURN @b GO
这个编译完全没问题.
在C#中,我想执行此查询并获取返回值.
我的代码如下:
SqlConnection SqlConn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["MyLocalSQLServer"].ConnectionString.ToString()); System.Data.SqlClient.SqlCommand sqlcomm = new System.Data.SqlClient.SqlCommand("Validate", SqlConn); string returnValue = string.Empty; try { SqlConn.Open(); sqlcomm.CommandType = CommandType.StoredProcedure; SqlParameter param = new SqlParameter("@a", SqlDbType.VarChar); param.Direction = ParameterDirection.Input; param.Value = Username; sqlcomm.Parameters.Add(param); SqlParameter retval = sqlcomm.Parameters.Add("@b", SqlDbType.VarChar); retval.Direction = ParameterDirection.ReturnValue; string retunvalue = (string)sqlcomm.Parameters["@b"].Value;
注意:异常处理会缩短以保持代码简短.每当我到达最后一行时,返回null.这段代码的逻辑错误是什么?
谢谢
Mehrdad提出了一些好处,但我注意到的主要问题是你从未运行过查询 ......
SqlParameter retval = sqlcomm.Parameters.Add("@b", SqlDbType.VarChar); retval.Direction = ParameterDirection.ReturnValue; sqlcomm.ExecuteNonQuery(); // MISSING string retunvalue = (string)sqlcomm.Parameters["@b"].Value;
retval.Direction = ParameterDirection.Output;
ParameterDirection.ReturnValue
应该用于程序的"返回值",而不是输出参数.它获取SQL RETURN
语句返回的值(名称为参数@RETURN_VALUE
).
而不是RETURN @b
你应该SET @b = something
顺便说一句,返回值参数总是int
,而不是字符串.
我在返回值方面遇到了很多麻烦,所以我最后只选择了一些东西.
解决方案只是在结尾处选择结果并在您的功能中返回查询结果.
在我的情况下,我正在进行存在检查:
IF (EXISTS (SELECT RoleName FROM dbo.Roles WHERE @RoleName = RoleName)) SELECT 1 ELSE SELECT 0
然后
using (SqlConnection cnn = new SqlConnection(ConnectionString)) { SqlCommand cmd = cnn.CreateCommand(); cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "RoleExists"; return (int) cmd.ExecuteScalar() }
您应该能够使用字符串值而不是int来执行相同的操作.
这是建立在Joel和Mehrdad的答案上的:你永远不会将参数绑定retval
到sqlcommand
.你需要一个
sqlcomm.Parameters.Add(retval);
并确保您正在运行该命令
sqlcomm.ExecuteNonQuery();
我也不确定为什么你有2个返回值字符串(returnValue
和retunvalue
).