使用 ADO .NET 调用 SQL 函数

Posted

技术标签:

【中文标题】使用 ADO .NET 调用 SQL 函数【英文标题】:Call SQL Function using ADO .NET 【发布时间】:2012-09-11 07:35:14 【问题描述】:

我想在 SQL Server 中创建调用函数,它接收两个参数并返回一个整数。当我调用存储过程时,我使用以下代码:

    sqlcmd.CommandType = CommandType.StoredProcedure
    sqlcmd.CommandText = "PROCEDURE_NAME"

    sqlcmd.Parameters.Add(New SqlClient.SqlParameter("@param1", Utilities.NothingToDBNull(user)))
    sqlcmd.Parameters.Add(New SqlClient.SqlParameter("@param2", Utilities.NothingToDBNull(password)))
    da = New SqlClient.SqlDataAdapter()
    da.SelectCommand = sqlcmd
    table = New DataTable()
    da.Fill(table)

在这种情况下,我有一个存储过程返回的表。如果我想使用返回标量值而不是存储过程的函数会有什么变化?

【问题讨论】:

可能您正在寻找[如何从 ado.net 调用 TSQL 函数][1] [1]:***.com/questions/4145329/… @John 但我只想返回标量值!为什么要使用存储过程?你确定我不能直接调用Function吗? @Cuong 我尝试了你的代码,但没有返回正确的值。 错误信息显示:ParameterDirection 'ReturnValue' specified for parameter '@RETURN_VALUE' not è支持的。有表值的参数只支持ParameterDirection.Input。 如果您的 SP/Command 中有 RETURN @RETURN_VALUE 行,那么我的回答应该会有所帮助。 【参考方案1】:

您不能直接调用该函数,只允许StoredProcedureText (查询) 和TableDirect。既然你已经暴露了存储过程,为什么不创建一个具有该功能的过程呢?

在您的 C# 代码中,您可以使用命令对象的 ExecuteScalar

sqlcmd.CommandType = CommandType.StoredProcedure
sqlcmd.CommandText = "PROCEDURE_NAME"
sqlcmd.Parameters.Add(New SqlClient.SqlParameter("@param1", Utilities.NothingToDBNull(user)))
sqlcmd.Parameters.Add(New SqlClient.SqlParameter("@param2", Utilities.NothingToDBNull(password)))

Dim obj as Object = sqlcmd.ExecuteScalar() 
' obj hold now the value from the stored procedure.

您的存储过程现在应该如下所示,

CREATE PROCEDURE PROCEDURE_NAME
    @param1 VARCHAR(15),
    @param2 VARCHAR(15)
AS
BEGIN
    SELECT function_name(@param1, @param2)
    FROM...
    WHERE....
END

【讨论】:

【参考方案2】:

如果要返回单个值,可以使用 SELECT 查询调用函数

sql 服务器代码

CREATE FUNCTION Test
(
  @p1 varchar(10),
  @p2 varchar(10)
)
RETURNS varchar(20)
AS
BEGIN
  RETURN @p1 + @p2
END

vb.net 代码

Using cnn As New SqlClient.SqlConnection("Your Connection String")
  Using cmd As New SqlClient.SqlCommand("SELECT dbo.Test(@p1,@p2)", cnn)
    cmd.Parameters.AddWithValue("@p1", "1")
    cmd.Parameters.AddWithValue("@p2", "2")

    Try
      cnn.Open()
      Console.WriteLine(cmd.ExecuteScalar.ToString)  //returns 12
    Catch ex As Exception
      Console.WriteLine(ex.Message)
    End Try
  End Using
End Using

【讨论】:

【参考方案3】:

如果要将存储过程中的值作为单行单列结果集返回,请使用SqlCommand.ExecuteScalar 方法。

我的首选方法是实际使用已用TSQL RETURN语句相应编写的存储过程的返回值,并调用SqlCommand.ExecuteNonQuery

在 MSDN 上都提供了示例,但针对您的具体情况,

Dim returnValue As SomeValidType

Using connection = New SqlConnection(connectionString))
    SqlCommand command = New SqlCommand() With _
        
            CommandType = CommandType.StoredProcedure, _
            CommandText = "PROCEDURE_NAME" _
        

    command.Parameters.Add(New SqlParameter() With _
        
            Name = "@RC", _
            DBType = SomeSQLType, _
            Direction = ParameterDirection.ReturnValue  _ // The important bit
        
    command.AddWithValue("@param1", Utilities.NothingToDBNull(user))
    command.AddWithValue("@param2", Utilities.NothingToDBNull(password))

    command.Connection.Open()
    command.ExecuteNonQuery()

    returnValue = CType(command.Parameters["@RC"].Value, SomeValidType)
End Using

顺便说一句,您会注意到在 .Net 4.5 中有这些函数的方便异步版本,但我担心这超出了问题的范围。

【讨论】:

SqlCommand 命令 = 新 SqlCommand(queryString, 连接)。在这一行中,queryString 是什么? @Joseph82,我编辑了答案以更接近您的 OP。

以上是关于使用 ADO .NET 调用 SQL 函数的主要内容,如果未能解决你的问题,请参考以下文章

调用函数时将 CommandType 设置为 StoredPROcedure

如何使用 ado.net 调用存储过程

ADO.NET 中参数化 SQL 命令的最终形式

在 ADO.NET 中使用 ODBC 调用预定义的 Access 查询

使用asp.net mv在ado.net中选择带有where子句的查询

SQL Server 2008 中的事务问题