VB6 + SQL-сервер. Как выполнить запрос с именованными параметрами с помощью ADODB.Command? - PullRequest
3 голосов
/ 10 июля 2009

Я пытался выполнить параметризованный запрос с помощью ADODB.Command. Я знаю, что могу использовать "?" для параметров, но мои запросы довольно большие, и я действительно не хочу отслеживать точный порядок параметров. Я пробовал что-то вроде следующего:

objCmd.CommandType = adCmdText
objCmd.CommandText = "SELECT ... WHERE field1=@p_Field1 ...."    
Dim objParam As ADODB.Parameter
Set objParam = objCmd.CreateParameter("@p_Field1" ...)
objCmd.Parameters.Append objParam
...
objCmd.Open

Это работает для параметров хранимой процедуры (очевидно, установка CommandType = adCmdStoredProc), но я не могу сделать это внутри хранимой процедуры из-за динамической природы самого запроса. Когда я пытаюсь выполнить запрос, я получаю сообщение об ошибке:

 Must declare the scalar variable "@p_Field1"

Есть ли другой способ обойти это, который не включает использование хранимых процедур или (argh) конкатенацию значений параметров в самом запросе и не использует параметры вообще?

Ответы [ 5 ]

7 голосов
/ 29 января 2014

Вы можете сделать это, чтобы позволить вам повторно использовать параметры

objCmd.CommandText = "declare @var1 int, @var2 int, @var3 int; " & _
    "select @var1 = ?, @var2 = ?, @var3 = ?;" & _
    "select ... where field1 = @var1 or field4 = @var1 or field2 = @var2 ... "

и добавьте параметры в обычном порядке.

3 голосов
/ 21 августа 2009

Похоже, ADODB.Command не поддерживает именованные параметры.

2 голосов
/ 10 июля 2009

Прошло довольно много времени с тех пор, как я использовал VB6, но вы пытались установить для свойства NamedParameters объекта Command значение True?

т.

objCmd.NamedParameters = True
0 голосов
/ 03 августа 2011

Это не идеально, но ... Это класс-оболочка, который я создал, который позволяет создавать запросы именованных параметров ...

Ниже этот код является демо. Самым большим преимуществом сейчас является то, что вы должны выполнять операторы setParameter в правильном порядке, как объявлено.

Class SQLBuilder

Private Sub Class_Initialize(  )
    Set internal_commandObject = Server.CreateObject("ADODB.Command")
End Sub

Private internal_sql
Private internal_parameters
private internal_commandObject

Public Property Let CommandType(ByVal value)
    internal_commandObject.CommandType = value
End Property

Public Property Get CommandType
    CommandType = internal_commandObject.CommandType
End Property

Public Property Let Prepared(ByVal value)
    internal_commandObject.Prepared = value
End Property

Public Property Get Prepared
    Prepared = internal_commandObject.Prepared
End Property

Public Property Get SQLCommandObject
Set SQLCommandObject = internal_commandObject
End Property

Public Property Let SQLCommandObject(ByVal value)
Set internal_commandObject = value
End Property

Public Property Get CommandText
    CommandText = internal_commandObject.CommandText
End Property

Public Property Let CommandText(ByVal sqlStatement)
    GetSQLParameters sqlStatement
    internal_commandObject.CommandText =  internal_sql
End Property

Public Property Get Parameters
    Set Parameters = internal_parameters
End Property


Public Function SetParameter(name,datatype,direction,size,value)

 internal_commandObject.Parameters.Append internal_commandObject.CreateParameter(name,datatype,direction,size,value)
End Function 

Private Sub GetSQLParameters(sql)
    internal_commandObject.NamedParameters = true
    Set RegExObj = New RegExp

    With RegExObj
        .Global = true
        .Multiline = true
        .Pattern = "@\S+"
        .IgnoreCase = true
    End With

    Set internal_parameters =  CreateObject("Scripting.Dictionary")

    With internal_parameters
        For each item in RegExObj.Execute(sql) 
        if Not .Exists(item.value) then  
            .Add item.value,item.value
        end if
        Next

    End With
    internal_sql = RegExObj.Replace(sql,"?")
End Sub


End Class

    Dim Temp
Dim mySqlBuilder 
Set mySqlBuilder = new SQLBuilder

With mySqlBuilder
    set .SQLCommandObject.ActiveConnection =PropConnection
.CommandText = "select LegalDescription from STAGE.DataLegalDescription where FISCAL_YEAR = @FISCAL_YEAR AND  AccountNumber = @ACCOUNT_NUMBER"
.Prepared = true
.SetParameter "@FISCAL_YEAR",adInteger,adParamInput,4, Cint(Year)
.SetParameter "@ACCOUNT_NUMBER",adVarChar,adParamInput,13, AccountNumber
End With

    RSProp.Open mySqlBuilder.SQLCommandObject
0 голосов
/ 21 марта 2011

Единственный способ, которым я знаю, как это сделать - это создать? в качестве параметра, например

В вашем примере:

objCmd.CommandText = "SELECT ... WHERE field1=@p_Field1 ...."    

изменить на:

objCmd.CommandText = "SELECT ... WHERE field1 = ?"    
objCmd.NamedParameters = True
Dim objParam As ADODB.Parameter
Set objParam = objCmd.CreateParameter("@AnyName",,,,Value)
objCmd.Parameters.Append objParam

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...