使用 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】:
您不能直接调用该函数,只允许StoredProcedure
、Text
(查询) 和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 中使用 ODBC 调用预定义的 Access 查询