【问题标题】:Call SQL Function using ADO .NET使用 ADO .NET 调用 SQL 函数
【发布时间】: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]:stackoverflow.com/questions/4145329/…
  • @John 但我只想返回标量值!为什么要使用存储过程?你确定我不能直接调用Function吗?
  • @Cuong 我尝试了你的代码,但没有返回正确的值。
  • 错误信息显示:ParameterDirection 'ReturnValue' specified for parameter '@RETURN_VALUE' not è支持的。有表值的参数只支持ParameterDirection.Input。
  • 如果您的 SP/Command 中有 RETURN @RETURN_VALUE 行,那么我的回答应该会有所帮助。

标签: sql vb.net function stored-procedures ado.net


【解决方案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。
      猜你喜欢
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多