Как использовать переменные в операторе вставки SQL напрямую - PullRequest
0 голосов
/ 29 июня 2019

У меня есть оператор SQL:

Dim Xdb As DAO.Database
Set Xdb = CurrentDb
Dim v1 As Integer
Dim v2 As String
With Me
    v1 = 1
    v2 = Trim(.txt2)
End With
Dim Sql As String
Sql = "Insert Into TblCustomers" _
& " (ID,FName)" _
& " Values " _
& " (1,'"& v2 &"')"

Я хочу использовать эту переменную "V2" в значении в выражении SQL, но без использования символа кавычек.

Как:

Sql = "Insert Into TblCustomers" _
& " (ID,FName)" _
& " Values " _
& " (1,v2)"

Как мне правильно установить переменную "V2"?

Ответы [ 2 ]

2 голосов
/ 29 июня 2019

Вам нужно использовать что-то вроде этого:

Dim cmdSQLInsert As ADODB.Command
Set cmdSQLInsert = New ADODB.Command

'Create the query
cmdSQLInsert.CommandText = "Insert Into TblCustomers(ID, FName) Values(?,?)"
cmdSQLInsert.CommandType = adCmdText
cmdSQLInsert.Prepared = True

'Create the parameters
'in this case we will create three parameters
'-----Param 1 (for Field ID)-------------
Dim gParam As ADODB.Parameter
Set gParam = New ADODB.Parameter
With gParam
    .Name = "ID"
    .Direction = adParamInput
    .Type = adInt
    .Value = 1
End With
cmdSQLInsert.Parameters.Append gParam

'-----Param 2 (for FName)-------------
Set gParam = Nothing
Set gParam = New ADODB.Parameter
With gParam
    .Name = "FName"
    .Direction = adParamInput
    .Type = adVarChar
    .Size = 50
    .Value = "FirstNameValue"
End With
cmdSQLInsert.Parameters.Append gParam

'Set the connection property of the command object
Set cmdSQLInsert.ActiveConnection = mySQLConnection

'Execute the command
cmdSQLInsert.Execute
0 голосов
/ 30 июня 2019

Этот вопрос действительно является дубликатом других вопросов (например, здесь и здесь ), поскольку многие новички в Access ожидают и хотят иметь возможность ссылаться на переменные VBA непосредственно изв операторах SQL.По сути, это одна и та же проблема, независимо от того, является ли она INSERT, UPDATE, SELECT и т.д.различные причины.Но очень мало комментариев и ответов касаются этой проблемы напрямую, поэтому вот другой вид ответа ...

Access SQL не может напрямую ссылаться на переменные модуля VBA. Однако есть пара альтернатив, которые могутработают, но у них есть свои недостатки.

  • Доступ к SQL может напрямую ссылаться на публичные функции, объявленные в модулях VBA.Поскольку функции VBA могут по существу обращаться к любой другой переменной или объекту и возвращать значение, он, безусловно, может возвращать значение переменной, которое в противном случае напрямую не доступно для SQL.
    • Самая важная проблема, которую необходимо осознать, заключается в том, что контекст, в котором вызывается такая функция, должен быть гарантирован до выполнения запроса.Если запрос, который ссылается на такую ​​функцию, когда-либо называется «не в порядке» (когда переменная не инициализирована должным образом), то это, конечно, приведет к ожидаемому поведению и / или неверным данным.

'* From within a VBA module *
Private moduleVariable As String

Public Sub MySub()
  moduleVariable
End Sub

Public Function GetModuleVariable() As String
  GetModuleVariable = moduleVariable
End Function

'--- Example SQL statement ---
'INSERT INTO TblCustomers (ID,FName) VALUES (1, GetModuleVariable())
  • Специальный объект, к которому можно получить доступ, называется TempVars ( документы здесь ).Он действительно был разработан для использования с макросами, но Access предоставляет его как объект, напрямую доступный из оператора SQL, так что это технически допустимо.
    • Самым большим недостатком является то, что значения хранятся как варианты VBA, и SQL не всегда интерпретирует их правильно.Использование явных функций преобразования может решить эту проблему.Пример демонстрирует это, заключая ссылку TempVars в CDbl().

'* From within a VBA module *
Public Sub MySub()
  TempVars.Add "myVariable", 123.45
End Sub

'--- Example SQL statement ---
'INSERT INTO products (ID, Amount) VALUES (100, CDbl(TempVars!myVariable))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...