如何输入Jet OLE DB查询

时间:2010-07-28 15:39:28

标签: sql excel scripting

背景:

我正在使用Excel 2003

我有2个Excel文件(源,列表),其中一个基本上是我的源数据。第二个是我使用excel“导入外部数据”功能来获取第二张表中的数据。然后我使用modifiy查询允许我使用SQL查询我的数据并限制我正在显示的数据。

我的SQL查询:

SELECT * 
  FROM ['Master List$'] 
 WHERE [Name] Like "Brent%";

我的问题是,我希望将单元格A1作为我查询的输入。所以在A1中我希望“Brent”替换第一个WHERE条件。

我希望找到一些东西,我将能够更改一个单元格,并能够刷新单元格A1中的任何数据。

有人有想法吗?

感谢。

我的连接字符串是这样的:

Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;
Data Source=C:\My Data\Master List\Master List.xls;
Mode=Share Deny Write;Extended Properties="HDR=YES;";
Jet OLEDB:System database="";Jet OLEDB:Registry Path="";
Jet OLEDB:Engine Type=35;Jet OLEDB:Database Locking Mode=0;
Jet OLEDB:Global Partial Bulk Ops=2;
Jet OLEDB:Global Bulk Transactions=1;
Jet OLEDB:New Database Password="";
Jet OLEDB:Create System Database=False;
Jet OLEDB:Encrypt Database=False;
Jet OLEDB:Don't Copy Locale on Compact=False;
Jet OLEDB:Compact Without Replica Repair=False;
Jet OLEDB:SFP=False

1 个答案:

答案 0 :(得分:0)

您错误地在查询中省略了FROM关键字。

因为您正在查询Excel工作簿,所以最好确保它已关闭;如果使用OLE DB,您应该知道the dreaded memory leak bug。还要注意Excel如何确定数据类型,这可能会让NULL出现意外情况变得有些奇怪;更多详情请见Dick's Blog

您尚未指定工作表,因此我假设它名为Sheet1

您的大部分连接字符串都由默认值组成,可以删除。

因为这是一个编程站点而你问的是Excel,所以VBA如何:

Sub ExcelExample()

  Const CONN_STRING As String = _
      "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;" & _
      "Data Source=C:\My Data\Master List\Master List.xls;" & _
      "Mode=Share Deny Write;Extended Properties=""HDR=YES;"";" & _
      "Jet OLEDB:System database="""";Jet OLEDB:Registry Path="""";" & _
      "Jet OLEDB:Engine Type=35;Jet OLEDB:Database Locking Mode=0;" & _
      "Jet OLEDB:Global Partial Bulk Ops=2;" & _
      "Jet OLEDB:Global Bulk Transactions=1;" & _
      "Jet OLEDB:New Database Password="""";" & _
      "Jet OLEDB:Create System Database=False;" & _
      "Jet OLEDB:Encrypt Database=False;" & _
      "Jet OLEDB:Don't Copy Locale on Compact=False;" & _
      "Jet OLEDB:Compact Without Replica Repair=False;" & _
      "Jet OLEDB:SFP=False"""

  Const SQL_TEXT As String = _
      "SELECT * FROM ['Master List$'] WHERE [Name] Like ?;"

  Dim cmd
  Set cmd = CreateObject("ADODB.Command")

  With cmd
    .ActiveConnection = CONN_STRING
    .CommandText = SQL_TEXT

    Dim param
    Set param = CreateObject("ADODB.Parameter")

    With param
      .Direction = 1  ' adParamInput
      .Type = 202  ' adVarWChar
      .Size = 255
      .Attributes = 64  ' adParamNullable
      .Value = ThisWorkbook.Worksheets("Sheet1").Range("A1").Value & "%"
    End With

    .Parameters.Append param
  End With

  Dim rs
  Set rs = CreateObject("ADODB.Recordset")

  With rs

    Set .Source = cmd
    .Open

    ' Do stuff with recordset...

  End With

End Sub

更新

连接字符串的哪些部分无用?大部分!例如,默认用户是Admin,但Jet工作组文件为空字符串,因为Excel不使用Jet安全性。我认为可以在不改变行为的情况下减少连接字符串:

  Const CONN_STRING As String = _
      "Provider=Microsoft.Jet.OLEDB.4.0;" & _
      "Data Source=C:\My Data\Master List\Master List.xls;" & _
      "Extended Properties=""HDR=YES;"";"