【问题标题】:Excel SQL Statement error - the connection for viewing your linked Microsoft Excel ... was lostExcel SQL 语句错误 - 查看链接的 Microsoft Excel ... 的连接丢失
【发布时间】:2016-02-23 14:12:14
【问题描述】:

我有一个 Excel 工作表,它通过 ODBC 连接到一个 Oracle 数据库,该数据库引入了发票数据。然后,我尝试使用 SQL 语句从同一工作簿中的另一个工作表中读取 Excel 工作表中的数据,该语句使用定义下载(链接)数据的 Excel 范围。

没有 WHERE 子句的 SQL 语句可以正常工作。当我添加在日期字段上设置条件的 WHERE 子句时,我得到了这篇文章主题中列出的错误。我相信我在日期字段的 SQL 语句中使用的语法是正确的——因为如果我复制下载的数据并将其作为值粘贴到另一个工作表中,然后针对此复制的数据处理 SQL 语句,则 SQL 语句有效.此外,如果我在 WHERE 子句中选择要使用的其他(非日期)字段,则代码可以工作。

下面是代码。 (范围名称“InvoiceData”定义 SQL 语句将读取的数据集)。如果您对如何纠正有任何想法,请告诉我。我的备份计划是简单地将数据复制/粘贴为值 - 但这会使文件变得相当大。

代码最后一条语句出现“用于查看链接的Microsoft Excel的连接...丢失”的错误信息。

Function OpenRangeRS(rng As Range) As Recordset
'**Returns as recordset for the passed in range or range name
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim sDBPath As String
Dim sRangeAddress As String

Dim sFile As String
Dim sConnect As String
Dim sSQL As String
Dim dReportDate As Date

sDBPath = ThisWorkbook.FullName

sConnect = "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & sDBPath & ";HDR=Yes';"
       cn.Open sConnect


dReportDate = Range("SelectedDate")

sSQL = "SELECT * FROM [InvoiceData] "
sSQL = sSQL & " WHERE Invoice_Date = " & "#" & dReportDate & "#"

rs.Open sSQL, sConnect

【问题讨论】:

    标签: sql excel date vba


    【解决方案1】:

    在我打开的 Excel 文件中查询工作表之前,我遇到了同样的错误并使用简单的 Range("").ClearFormats 解决了它。

    【讨论】:

    • Range("").ClearFormats 工作。谢谢你,@Geoff
    【解决方案2】:

    我同意这可能是日期格式。我建议将其格式化为明确的日期格式

    dReportDate = Format(Range("SelectedDate"), "yyyymmdd")
    

    确保它与语言无关

    【讨论】:

      【解决方案3】:

      我赌的是日期格式。但是,有几点值得说明,可能对您有用,也可能没用:

      1. 您可以在 ADODB 中使用参数化查询,这将帮助您控制查询 (http://www.unixwiz.net/techtips/sql-injection.html),并且在您的情况下,将有助于更轻松地管理日期格式。
      2. 我更喜欢使用Value2 读取Excel 日期值,然后在VBA 代码中将日期转换为我想要的格式。如果有人更改单元格本身的日期格式,这将保护您 (What is the difference between .text, .value, and .value2?)
      3. 如果函数或连接关闭,从函数返回RecordSet 有时会出现问题。我更喜欢在打开和关闭数据库的例程中处理Recordset,并在必要时返回处理后的数据。例如,如果您正在写入工作表,那么我宁愿将Recordset 读入Variants 的数组中,适当大小,然后返回。

      我不确定下面的代码是否会回答您的具体问题,但它可能会有所帮助并提供了三点的示例:

      Function OpenRangeRS(rng As Range) As Variant
          Dim cn As ADODB.Connection
          Dim cmd As ADODB.Command
          Dim prm As ADODB.Parameter
          Dim rs As ADODB.Recordset
          Dim sDBPath As String
          Dim sConnect As String
          Dim sSQL As String
          Dim hDateValue As Double
          Dim dReportDate As Date
          Dim output() As Variant
          Dim i As Long
      
          'Open the connection
          Set cn = New ADODB.Connection
          sDBPath = ThisWorkbook.FullName
          sConnect = "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & sDBPath & ";HDR=Yes';"
          cn.Open sConnect
      
          'Format date value as required for db
          'Note: prob not needed for parameterised query but shown here in case you stick to unparameterised
          hDateValue = ThisWorkbook.Worksheets("Sheet1").Range("A1").Value2 '~~> define as needed
          dReportDate = Format(CDate(hDateValue), "dd/mm/yyyy")
      
          'Define the command object and append parameter
          Set cmd = New ADODB.Command
          cmd.ActiveConnection = cn
          sSQL = "SELECT * FROM [InvoiceData] WHERE Invoice_Date = ?"
          cmd.CommandText = sSQL
          Set prm = cmd.CreateParameter(, adDate, adParamInput, , dReportDate)
          cmd.Parameters.Append prm
      
          'Open the recordset object
          Set rs = cmd.Execute
      
          '... do whatever you need to with the recordset
          If Not rs.EOF Then
              ReDim output(1 To rs.RecordCount, 1 To 3)
              i = 1
              Do Until rs.EOF
                  output(i, 1) = i
                  output(i, 2) = rs!SomeField
                  output(i, 3) = rs!OtherField
                  rs.MoveNext
                  i = i + 1
              Loop
              OpenRangeRS = output
          End If
      
      
          'Tidy up
          Set prm = Nothing
          Set cmd = Nothing
          rs.Close
          cn.Close
      End Function
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-24
        • 1970-01-01
        • 2016-11-17
        • 2017-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多