如何解决如何在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;
如您所见,我使用中间变量来提高代码的可读性。您可以省略其中一些。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。