2010-07-26 20 views
2

这工作:如何从表值函数创建一个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.

+0

可能会感兴趣:http://www.w3schools.com/ado/met_comm_createparameter.asp – Fionnuala 2010-07-27 09:26:06

回答

0

是的,您可以使用具有表函数的参数。

rst.Open "SELECT * FROM dbo.ftblTest(@Param1,@Param2,@Param3)", CP.Connection, adOpenKeyset, adLockReadOnly 

在打开数据库连接之前添加参数并设置它们的值。

+0

不确定我应该怎么做。我会为我的问题添加例子。 – 2010-07-28 23:37:35

+0

查看@Remou添加的链接。这似乎显示了如何添加参数的语法。 – mrdenny 2010-07-29 02:28:53

+0

看了看并添加了Parameters.Append位,但它仍然不起作用。请参阅上面的新示例代码。 – 2010-07-29 03:00:20

0

不要在参数名称中使用@,也不要在命令文本中按名称列出参数。我一直使用存储过程来完成这个任务,所以我不确定这个命令文本是如何处理的。

尝试:

。CreateParameter “输入”,adInteger,adParamInput,4

和:

.CommandText = “dbo.ftblTest()”

或者:

.CommandText = “dbo.ftblTest”

+0

我删除了@从创建参数,尝试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

相关问题