excel - 如何从 Delphi 在 Excel 中设置 MySQL/ODBC 连接?

标签 excel delphi ole listobject

我想从 Delphi 创建一个新的 Excel 工作簿,但在从 Delphi 打开它之前,我首先要设置与现有 MySQL 数据库的 ODBC 连接,并设置查询。
然后当它打开时,它将立即提取数据。
我尝试的是首先在 Excel 中记录宏,然后查看它是如何在 VBA 中建立连接的。
然后我尝试在 Delphi 中复制 VBA。
这是我尝试过的:

var
xls, wb : OLEVariant;
begin
  xls := CreateOLEObject('Excel.Application'); {initialize an instance of Excel}
  wb := xls.Workbooks.Add; {create workbook}

  //xls.ActiveSheet.ListObjects.Add(SourceType:=0, Source:='ODBC;DSN=MySQL;', Destination:=Range('$A$1')).QueryTable; //this throws a missing operator or semicolon error
  xls.Worksheets[1].ListObjects.Add(); //add a listobject
  xls.WorkBooks[1].Worksheets[1].ListObjects.Item[1].QueryTable[1].CommandText := 'SELECT 1';
...
end;
但在尝试设置 CommandText 时,我收到 OLE 错误 800A03EC
下面是 VBA 代码。
我通过从新工作簿中记录宏来获得它。
在第一行,我尝试了很多关于如何输入连接字符串的组合,最终我发现我可以添加一个 ListObject(就像在我的 Delphi 代码中一样)而不会出现任何错误,然后我尝试分别设置每个参数,但没有成功。
Sub Macro1()
'
' Macro1 Macro
'

'
    Application.CutCopyMode = False
    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:="ODBC;DSN=MySQL;", _
        Destination:=Range("$A$1")).QueryTable
        .CommandType = 0
        .CommandText = Array("SELECT 1")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .ListObject.DisplayName = "Table_Query_from_MySQL"
        .Refresh BackgroundQuery:=False
    End With
End Sub

最佳答案

这是一个几乎直接复制 VBA 代码的解决方案:

procedure TForm1.Button1Click(Sender: TObject);
var
    ExcelApplication       : Variant;
    WorkBook               : Variant;
    ActiveSheet            : Variant;
    ListObject             : Variant;
    Range                  : Variant;
    QueryTable             : Variant;
begin
    ExcelApplication                    := CreateOLEObject('Excel.Application');
    WorkBook                            := ExcelApplication.Workbooks.Add;
    ActiveSheet                         := ExcelApplication.ActiveSheet;
    Range                               := ActiveSheet.Range['A1', 'A1'];
    ListObject                          := ActiveSheet.ListObjects.Add(
                                  0,                 // SourceType,
                                  'ODBC;DSN=MySQL;', // Source,
                                  TRUE,              // LinkSource,
                                  xlGuess,           //XlListObjectHasHeaders,
                                  Range);            // Destination
    QueryTable                          := ListObject.QueryTable;
    QueryTable.CommandType              := xlCmdSql;
    QueryTable.CommandText              := 'SELECT 1';
    QueryTable.RowNumbers               := FALSE;
    QueryTable.FillAdjacentFormulas     := FALSE;
    QueryTable.PreserveFormatting       := TRUE;
    QueryTable.RefreshOnFileOpen        := FALSE;
    QueryTable.BackgroundQuery          := TRUE;
    QueryTable.RefreshStyle             := xlInsertDeleteCells;
    QueryTable.SavePassword             := FALSE;
    QueryTable.SaveData                 := TRUE;
    QueryTable.AdjustColumnWidth        := TRUE;
    QueryTable.RefreshPeriod            := 0;
    QueryTable.PreserveColumnInfo       := TRUE;
    QueryTable.ListObject.DisplayName   := 'Table_Query_from_MySQL';
    QueryTable.Refresh(False);  // BackgroundQuery
end;
如您所见,我使用中间变量来提高代码的可读性。你可以省略其中的一些。

关于excel - 如何从 Delphi 在 Excel 中设置 MySQL/ODBC 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63900731/

相关文章:

Excel VBA - 在表列中查找给定值的行号

Excel SUMPRODUCT 适用于 2021 年,但不适用于 2020 年

excel - 如何每周,每两周和每月计算excel中两个日期之间的总星期五?

Delphi对象持久化,什么是最好的方法

delphi - 错误: Undeclared identifier: 'OutputDebugString'

java - JXL 和 Apache POI 解析带有附加图像对象的 excel

excel - 如何比较两张 map

delphi - 对重载函数(或过程)的引用

SSIS: "Incorrect syntax near ' GO'。”错误

com - 将对象嵌入到 Microsoft Word 和 OpenOffice Writer 中