如何在Delphi中的Excel中设置MySQL / ODBC连接?

问题描述

我想从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;

如您所见,我使用中间变量来提高代码的可读性。您可以省略其中一些。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...