通过VBA动态传递值到SQL Server

时间:2018-06-08 22:19:06

标签: sql sql-server excel vba excel-vba

免责声明:我是VBA的新手。

对于下面的代码,我希望通过excel表上的字段传递SQL查询(30881570)中的值。有人可以指导我怎么做吗?我尝试了一些不同的东西,但没有一个对我有用。

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 :(得分:0)

您似乎已将该值作为查询WHERE声明的条件传递。

如果你问如何用工作表中的值替换它,可以采用以下方法:

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

...您的工作表名为mySheet,其值在单元格A1中。

这是最简单的方法,可能适用于受信任方的内部使用,但如果该值中包含任何'单引号,则会出现错误。

最糟糕的情况是,此方法会让您对 SQL Injection 攻击持开放态度。取决于您的需求(以及这是否只是一项学校作业),您可能更适合使用参数查询

另见:

答案 1 :(得分:0)

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