Передача значения динамически в SQL Server через VBA - PullRequest
0 голосов
/ 09 июня 2018

Отказ от ответственности: я новичок в VBA.

Я надеюсь передать значение в запросе SQL (30881570) через поле на листе Excel.Я пробовал несколько разных вещей.

Private Sub cmdImport_Click()

    Call cmdClear_Click

    Dim conn As New ADODB.Connection, cmd As New ADODB.Command, rs As New ADODB.Recordset

    With conn
        .ConnectionString = _
            "Provider=SQLOLEDB; " & _
            "Data Source=PRGTAPPDBSWC019; " & _
            "Initial Catalog=DETEP;" & _
            "Integrated Security=SSPI;"
        .Open
    End With

    With cmd
        .ActiveConnection = conn
        .CommandText = "SELECT * FROM [dbo].[tbl_PMHeader] WHERE [PMHeader_PM_NUM] = '30881570'"
        .CommandType = adCmdText
    End With

    Set rs.Source = cmd
    rs.Open

    'Need this to populate header row, starting at specified Range
    For intColIndex = 0 To rs.Fields.Count - 1
        Range("B1").Offset(0, intColIndex).Value = rs.Fields(intColIndex).Name
    Next

    'This is where your data table will be copied to
    ActiveSheet.Range("B2").CopyFromRecordset rs

    Worksheets("Sheet1").Columns("B:BB").AutoFit

    Worksheets("Sheet1").Range("A25").Formula = "=COUNTA(B:B)-1"

End Sub

Ответы [ 2 ]

0 голосов
/ 12 июня 2018
Private Sub cmdImport_Click()
    Dim conn As New ADODB.Connection
    Dim cmd As New ADODB.Command
    Dim rs As New ADODB.Recordset
    Dim sqlStr As String



    With conn
        .ConnectionString = _
            "Provider=SQLOLEDB; " & _
            "Data Source=PRGTAPPDBSWC019; " & _
            "Initial Catalog=DETEP;" & _
            "Integrated Security=SSPI;"
        .Open
    End With

    orderno = Sheets("Sheet1").Range("A22")
    strSql = "SELECT * FROM [dbo].[tbl_PMHeader] " & _
        "WHERE [PMHeader_PM_NUM] = " & orderno


    With cmd
        .ActiveConnection = conn
        .CommandText = strSql
        .CommandType = adCmdText
    End With

    'Call cmdClear_Click

    Set rs.Source = cmd
    rs.Open

    'Need this to populate header row, starting at specified Range
    For intColIndex = 0 To rs.Fields.Count - 1
        Range("B1").Offset(0, intColIndex).Value = rs.Fields(intColIndex).Name
    Next

    'This is where your data table will be copied to
    ActiveSheet.Range("B2").CopyFromRecordset rs

    Worksheets("Sheet1").Columns("B:BB").AutoFit

    Worksheets("Sheet1").Range("A25").Formula = "=COUNTA(B:B)-1"

 End Sub
0 голосов
/ 09 июня 2018

Похоже, что вы уже передаете это значение в качестве критерия для оператора WHERE запроса.

Если вы спрашиваете, как заменить это значение на листе, вот один из способов:

.CommandText = "SELECT * FROM [dbo].[tbl_PMHeader] " & _
    "WHERE [PMHeader_PM_NUM] = '" & Sheets("mySheet").Range("A1") & "'"

... где ваш рабочий лист имеет имя mySheet, а значение находится в ячейке A1.

Это самый простой метод, потенциально подходящий для внутреннего использования доверенными сторонами,но если в значении есть ' одинарные кавычки, вы получите ошибку.

В худшем случае этот метод оставляет вас открытыми для SQL-инъекций атак.В зависимости от ваших потребностей (и является ли это просто школьным заданием), вам лучше использовать запрос параметра .


См. Также:

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