【问题标题】:sql function with two parameters. Call from VB .NET带有两个参数的sql函数。从 VB .NET 调用
【发布时间】:2016-02-24 17:55:30
【问题描述】:

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

【问题讨论】:

    标签: sql vb.net function ado.net


    【解决方案1】:

    functionstored procedure 不同

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

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

    将 CommandType 设置为 Text 并使用 ExecuteScalar

    Result = Convert.ToInt32(cmd.ExecuteScalar())
    

    【讨论】:

    • 不能使用功能吗?
    • @Joseph82 将函数包装在存储过程中。
    • @Joseph82 为什么它是一个函数如此重要?
    • 好的,我在“select dbo.check_credential(@username, @password)”中更改了我的命令。现在如何将返回值分配给预定义变量(Dim Result As Integer)?
    • @podiluska 因为我正在使用很多功能......而且我无法在程序中全部转换
    【解决方案2】:

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

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

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

    【讨论】:

    【解决方案3】:

    在这种情况下,您需要定义一个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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 2013-09-24
      • 2020-10-02
      • 2018-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多