如何从表值函数创建一个ADODB记录与命名参数
Dim rst As New ADODB.Recordset
rst.Open "SELECT * FROM dbo.ftblTest(1,2,3)", CP.Connection, adOpenKeyset, adLockReadOnly
但是这将是更好的做到这一点:
rst.Open "SELECT * FROM dbo.ftblTest(@Param1=1,@Param2=2,@Param3=3)", CP.Connection, adOpenKeyset, adLockReadOnly
如果我尝试第二种方法我得到的错误:“参数未提供功能ftblTest”
是否有可能使用具有多语句表值函数的命名参数?
编辑1:实施例中加入使用Command对象
首先SQL
create function ftblTest (@Input int)
RETURNS @Results TABLE (
OutputField int
)
AS
BEGIN
INSERT INTO @Results SELECT @Input
Return
End
一些代码(从Access 2003 ADP内运行,以正确的SQL连接DB)
Public Sub test()
Dim rst As New ADODB.Recordset
Dim cmd As New ADODB.Command
'method 1 works
rst.Open "SELECT * FROM dbo.ftblTest(2)", CurrentProject.Connection, adOpenKeyset, adLockReadOnly
Debug.Print rst.Fields(0)
rst.Close
With cmd
.ActiveConnection = CurrentProject.Connection
.CommandType = adCmdTable
'method 2 works
.CommandText = "dbo.ftblTest(3)"
Set rst = cmd.Execute
Debug.Print rst.Fields(0)
'method 3 fails
.CreateParameter "@Input", adInteger, adParamInput, , 4
.CommandText = "dbo.ftblTest(@Input)"
Set rst = cmd.Execute 'error here:-2147217900 Must declare the scalar variable "@Input".
Debug.Print rst.Fields(0)
End With
End Sub
我该怎么办获取命名参数在方法3中工作?
编辑2:测试代码修改为使用Parameters.Append
Public Sub test()
Dim rst As New ADODB.Recordset
Dim cmd As New ADODB.Command
Dim p As New ADODB.Parameter
With cmd
.ActiveConnection = CurrentProject.Connection
.CommandType = adCmdTable
'Parameter Append method fails
p = .CreateParameter("@Input", adInteger, adParamInput, , 4)
Debug.Print p.Name, p.Type = adInteger, p.Direction = adParamInput, p.SIZE, p.Value 'note that name not set!
With p
.Name = "@Input"
.Type = adInteger
.Direction = adParamInput
.SIZE = 4 'this shouldn't be needed
.Value = 4
End With
Debug.Print p.Name, p.Type = adInteger, p.Direction = adParamInput, p.SIZE, p.Value 'properties now set
.Parameters.Append p
.CommandText = "dbo.ftblTest(@Input)"
Set rst = cmd.Execute 'error here:-2147217900 Must declare the scalar variable "@Input".
Debug.Print rst.Fields(0)
End With
End Sub
这仍然无法正常工作。
编辑3:我删除了@从创建参数
的建议,并试图在CommandText 3种方式,得到了3个不同的错误:
.CommandText = "dbo.ftblTest"
错误:参数不为函数提供'dbo.ftblTest'。
.CommandText = "dbo.ftblTest()"
错误:为过程或函数dbo.ftblTest提供的参数数量不足。
.CommandText = "dbo.ftblTest(Input)"
错误:“输入”不是公认的表格提示选项。如果它的目的是作为表值函数或CHANGETABLE函数的参数,请确保将数据库兼容模式设置为90.
是的,您可以使用具有表函数的参数。
rst.Open "SELECT * FROM dbo.ftblTest(@Param1,@Param2,@Param3)", CP.Connection, adOpenKeyset, adLockReadOnly
在打开数据库连接之前添加参数并设置它们的值。
不确定我应该怎么做。我会为我的问题添加例子。 – 2010-07-28 23:37:35
查看@Remou添加的链接。这似乎显示了如何添加参数的语法。 – mrdenny 2010-07-29 02:28:53
看了看并添加了Parameters.Append位,但它仍然不起作用。请参阅上面的新示例代码。 – 2010-07-29 03:00:20
不要在参数名称中使用@,也不要在命令文本中按名称列出参数。我一直使用存储过程来完成这个任务,所以我不确定这个命令文本是如何处理的。
尝试:
。CreateParameter “输入”,adInteger,adParamInput,4
和:
.CommandText = “dbo.ftblTest()”
或者:
.CommandText = “dbo.ftblTest”
我删除了@从创建参数,尝试CommandText 3种方式,并得到3个不同的错误: .CommandText =“dbo.ftblTest” 错误:参数未提供函数'dbo.ftblTest'。 .CommandText =“dbo.ftblTest()” 错误:为过程或函数dbo.ftblTest提供的参数数量不足。 .CommandText =“dbo.ftblTest(Input)” 错误:“输入”不是公认的表格提示选项。如果它的目的是作为表值函数或CHANGETABLE函数的参数,请确保将数据库兼容模式设置为90。 – 2010-07-30 03:19:03
可能会感兴趣:http://www.w3schools.com/ado/met_comm_createparameter.asp – Fionnuala 2010-07-27 09:26:06