Gur*_*epS 65 c# sql sql-server
我有以下查询:
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
Run Code Online (Sandbox Code Playgroud)
这个编译完全没问题.
在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;
Run Code Online (Sandbox Code Playgroud)
注意:异常处理会缩短以保持代码简短.每当我到达最后一行时,返回null.这段代码的逻辑错误是什么?
谢谢
Joe*_*orn 87
Mehrdad提出了一些好处,但我注意到的主要问题是你从未运行过查询 ......
SqlParameter retval = sqlcomm.Parameters.Add("@b", SqlDbType.VarChar);
retval.Direction = ParameterDirection.ReturnValue;
sqlcomm.ExecuteNonQuery(); // MISSING
string retunvalue = (string)sqlcomm.Parameters["@b"].Value;
Run Code Online (Sandbox Code Playgroud)
Meh*_*ari 62
retval.Direction = ParameterDirection.Output;
Run Code Online (Sandbox Code Playgroud)
ParameterDirection.ReturnValue应该用于程序的"返回值",而不是输出参数.它获取SQL RETURN语句返回的值(名称为参数@RETURN_VALUE).
而不是RETURN @b你应该SET @b = something
顺便说一句,返回值参数总是int,而不是字符串.
Ala*_*son 11
我在返回值方面遇到了很多麻烦,所以我最后只选择了一些东西.
解决方案只是在结尾处选择结果并在您的功能中返回查询结果.
在我的情况下,我正在进行存在检查:
IF (EXISTS (SELECT RoleName FROM dbo.Roles WHERE @RoleName = RoleName))
SELECT 1
ELSE
SELECT 0
Run Code Online (Sandbox Code Playgroud)
然后
using (SqlConnection cnn = new SqlConnection(ConnectionString))
{
SqlCommand cmd = cnn.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "RoleExists";
return (int) cmd.ExecuteScalar()
}
Run Code Online (Sandbox Code Playgroud)
您应该能够使用字符串值而不是int来执行相同的操作.
这是建立在Joel和Mehrdad的答案上的:你永远不会将参数绑定retval到sqlcommand.你需要一个
sqlcomm.Parameters.Add(retval);
Run Code Online (Sandbox Code Playgroud)
并确保您正在运行该命令
sqlcomm.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)
我也不确定为什么你有2个返回值字符串(returnValue和retunvalue).