【问题标题】:Retrieve all of query containing semi-colons检索所有包含分号的查询
【发布时间】:2019-12-06 19:47:24
【问题描述】:

我正在尝试通过 VBA 中的 ADODB 记录集从 SQL 中提取数据。当 SQL 查询包含分号时,我正在努力从 SQL 查询的每个部分获取结果。想知道是否有任何方法可以做到这一点,而无需将我的查询拆分为单独的查询(以消除分号问题)并为每个查询使用单独的记录集。

请参阅下面的简单示例。当我运行它时,F2=1,G2=Failed - 我想要 F2=1,G2=2。

' Sub to test using semi-colons in SQL queries
Sub getDataSimple0(server As String, database As String)

  ' Initialise variables
  Dim con As ADODB.Connection
  Dim rs As ADODB.Recordset

  Set con = New ADODB.Connection
  Set rs = New ADODB.Recordset

  ' Open Connection using Windows Authentication
  con.ConnectionString = "Provider=SQLOLEDB;Data Source=" & server & ";Initial Catalog=" & database & ";Trusted_connection=Yes;Integrated Security=SSPI;Persist Security Info=True;"
  con.Open

  ' Open recordset
  rs.Open "SELECT 1; SELECT 2", con

  ' Add data to worksheet
  Range("F2").CopyFromRecordset rs

  rs.NextRecordset
  If rs.State > adStateClosed Then
    Range("G2").CopyFromRecordset rs
  Else
    Range("G2").Value = "Failed"
  End If

  ' Close connection
  con.Close

End Sub

【问题讨论】:

    标签: excel vba adodb


    【解决方案1】:

    我会通过以下方式来解决它。

    ' Sub to test using semi-colons in SQL queries
    Sub getDataSimple0(server As String, database As String)
    
      ' Initialise variables
      Dim con As ADODB.Connection
      Dim rs As ADODB.Recordset
      Dim SQL_String As String
      Dim SQL_Array() As String
      Dim i As Integer
    
      Set con = New ADODB.Connection
      Set rs = New ADODB.Recordset
    
      ' Open Connection using Windows Authentication
      con.ConnectionString = "Provider=SQLOLEDB;Data Source=" & server & ";Initial Catalog=" & database & ";Trusted_connection=Yes;Integrated Security=SSPI;Persist Security Info=True;"
      con.Open
    
      'Multiple queries
      SQL_String = "SELECT 1; SELECT 2"
    
      'Split into array
      SQL_Array = Split(SQL_String, ";")
    
      'Add data to worksheet
      For i = LBound(SQL_Array) To UBound(SQL_Array)
    
         rs.Open SQL_Array(i), con
         Range("F2").Offset(0, i).CopyFromRecordset rs
    
      Next i
    
    
      ' Close connection
      con.Close
    
    End Sub
    

    在这里,我获取多个查询并将它们拆分为一个数组,然后循环遍历。假设您想要 F 列及以后的列中的输出。

    【讨论】:

    • 当我运行这个时,G2 是空白的(不是 2)。我认为您需要在.CopyFromRecordset 行下添加Set rs = rs.NextRecordset(由乔纳森威尔科克建议)。不过,数组的使用很好。感谢您的建议。
    • 啊,我明白你现在的意思了,虽然我认为你在.CopyFromRecordset 之后仍然需要rs.Close 以避免错误
    • @hodgenovice,你可能是对的。我没有机会亲自测试代码。
    【解决方案2】:

    我相信你需要将 rs 设置为 NextRecordset 的结果,所以代码如下所示:

    ' Sub to test using semi-colons in SQL queries
    Sub getDataSimple0(server As String, database As String)
    
      ' Initialise variables
      Dim con As ADODB.Connection
      Dim rs As ADODB.Recordset
    
      Set con = New ADODB.Connection
      Set rs = New ADODB.Recordset
    
      ' Open Connection using Windows Authentication
      con.ConnectionString = "Provider=SQLOLEDB;Data Source=" & server & ";Initial Catalog=" & database & ";Trusted_connection=Yes;Integrated Security=SSPI;Persist Security Info=True;"
      con.Open
    
      ' Open recordset
      rs.Open "SELECT 1; SELECT 2", con
    
      ' Add data to worksheet
      Range("F2").CopyFromRecordset rs
    
      Set rs = rs.NextRecordset
      If rs.State > adStateClosed Then
        Range("G2").CopyFromRecordset rs
      Else
        Range("G2").Value = "Failed"
      End If
    
      ' Close connection
      con.Close
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-25
      • 2013-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多