0

我写了一个 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 并获取返回值。

4

3 回答 3

3

Afunction与 a 不同stored procedure

将您的函数转换为存储过程或将您的命令更改为

"select dbo.check_credential(@username, @password)"

将 CommandType 设置为Text并使用ExecuteScalar

Result = Convert.ToInt32(cmd.ExecuteScalar())
于 2012-09-12T08:44:04.307 回答
1

使@PwdRES 成为输出参数。还要在代码中将参数声明为输出,然后它将包含命令执行后从函数返回的值:

sqlcmd.Parameters.Add("@PwdRES ", SqlDbType.Int)
sqlcmd.Parameters("@PwdRES ").Direction = ParameterDirection.Output)

我认为您需要将您的函数转换为存储过程(或添加调用该函数的存储过程)才能使其正常工作。

于 2012-09-12T08:46:45.333 回答
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

于 2012-09-12T08:45:41.413 回答