我写了一个sql函数,它返回一个标量:如果密码正确则为1,否则为0。
CREATE FUNCTION check_credential( @User_IN nvarchar(50), @Pwd_IN nvarchar(50))
RETURNS int
AS
BEGIN
DECLARE @PwdRES int
DECLARE @PWD_DB varbinary(255)
IF (@User_IN is not null and @User_IN != '' and @Pwd_IN is not null and @Pwd_IN != '' )
begin
SELECT @PWD_DB = password FROM myTable WHERE username = @User_IN
SET @PwdRES = pwdcompare(@Pwd_IN, @PWD_DB )
end
ELSE
SET @PwdRES = 0
RETURN @PwdRES
END
这是正常的。
我正在使用以下代码调用sql函数:
Dim conn As SqlConnection
Dim sqlcmd As SqlCommand
Dim da As SqlClient.SqlDataAdapter
Dim table As DataTable
Dim Result As Integer
conn = New SqlConnection(ConnectionString)
sqlcmd = New SqlClient.SqlCommand()
sqlcmd.Connection = conn
conn.Open()
sqlcmd.CommandType = CommandType.StoredProcedure
sqlcmd.CommandText = "check_credential"
sqlcmd.Parameters.Add(New SqlClient.SqlParameter("@username", Utilities.NothingToDBNull(user)))
sqlcmd.Parameters.Add(New SqlClient.SqlParameter("@password", Utilities.NothingToDBNull(password)))
此时我想执行sqlcmd并获取返回值。
答案 0 :(得分:3)
function
与stored procedure
将您的函数转换为存储过程或将命令更改为
"select dbo.check_credential(@username, @password)"
将CommandType设置为Text
并使用ExecuteScalar
Result = Convert.ToInt32(cmd.ExecuteScalar())
答案 1 :(得分:1)
使@PwdRES为output参数。还要在代码中将参数声明为输出,然后在命令执行后它将包含函数返回的值:
sqlcmd.Parameters.Add("@PwdRES ", SqlDbType.Int)
sqlcmd.Parameters("@PwdRES ").Direction = ParameterDirection.Output)
您需要将您的函数转换为存储过程(或添加调用该函数的存储过程)以使其工作我认为。
答案 2 :(得分:0)
在这种情况下,您需要定义一个output
参数。
在SQL函数中:
@Value int output, // Define it in the Parameters
在此参数中获取计算值
@value = 0
现在在C#代码中:
SqlParameter user = cmd.Parameters.Add("@value", SqlDbType.int);
user.Direction = ParameterDirection.Output;
您可以在此检查用户是0还是1