如何从 Delphi 设置 Excel 中的 MySQL/ODBC 连接?
How do I set a MySQL/ODBC connection in Excel from Delphi?
我想从 Delphi 创建一个新的 Excel 工作簿,但在我从 Delphi 打开它之前,我首先想建立一个到现有 MySQL数据库,设置查询。
然后当它打开时,它会立即提取数据。
我尝试的是首先在 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')).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")).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;
如您所见,为了代码的可读性,我使用了中间变量。你可以省略其中的一些。
我想从 Delphi 创建一个新的 Excel 工作簿,但在我从 Delphi 打开它之前,我首先想建立一个到现有 MySQL数据库,设置查询。 然后当它打开时,它会立即提取数据。
我尝试的是首先在 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')).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")).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;
如您所见,为了代码的可读性,我使用了中间变量。你可以省略其中的一些。