Как создать набор записей ADODB из табличной функции с именованными параметрами - PullRequest
2 голосов
/ 27 июля 2010

Это работает:

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: Примеры, добавленные с использованием объекта команды

Сначала SQL

create function ftblTest (@Input int)
RETURNS @Results TABLE (
  OutputField int
  )
AS
BEGIN
INSERT INTO @Results SELECT @Input
Return
End

Некоторый код (запускается из ADP Access 2003, с подключением к правильной базе данных SQL)

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: я удалил @ из параметра создания

, как предложено, и попробовал 3 способа CommandText и получил 3 различных ошибки:

.CommandText = "dbo.ftblTest" 

ошибка: параметры не были предоставлены для функции 'dbo.ftblTest'.

.CommandText = "dbo.ftblTest()" 

ошибка: для процедуры или функции dbo.ftblTest было предоставлено недостаточное количество аргументов.

.CommandText = "dbo.ftblTest(Input)" 

Ошибка: «Ввод» не является опознанной табличной подсказкой.Если он предназначен в качестве параметра для табличной функции или функции CHANGETABLE, убедитесь, что для режима совместимости вашей базы данных установлено значение 90.

Ответы [ 2 ]

0 голосов
/ 30 июля 2010

Не используйте @ в имени вашего параметра и не перечисляйте параметр по имени в тексте команды.Я всегда делал это с помощью хранимой процедуры, поэтому я не совсем уверен, как именно описывается паранетез для текста команды.

try:

.CreateParameter "Input", adInteger,adParamInput,, 4

И:

.CommandText = "dbo.ftblTest ()"

Или:

.CommandText = "dbo.ftblTest"

0 голосов
/ 27 июля 2010

Да, вы можете использовать параметры с табличной функцией.

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

Прежде чем открывать соединение с базой данных, добавьте параметры и установите их значения.

...