以ADO連上Excel後,如何對Excel下SQL指令,是否用ADOQuery? |
尚未結案
|
Mars123
一般會員 發表:6 回覆:9 積分:3 註冊:2003-07-18 發送簡訊給我 |
各位前輩,小弟欲以Excel當作一個資料庫,並以每個sheet作為Table
於連結上Excel後,也取得sheet name了,但是在下SQL指令時卻有問題
以下為小弟的程式碼,尚請前輩自指教出錯誤的地方,不勝感激!
小弟想取得的是Label1.caption的值~~~ var ADO_ConnectionString:string;
ADOQuery_ConnectionString:string; sheet,strsql:string; begin if OpenDialog_Excel.Execute then
begin
Edit_Excel_DataSource.Text :=OpenDialog_Excel.FileName ;
ADO_Connectionstring:='Provider=Microsoft.Jet.OLEDB.4.0;'+
'Data Source='+
Edit_Excel_DataSource.Text+
';Mode=ReadWrite|Share Deny None;'+
'Extended Properties=Excel 8.0;Persist Security Info=False';
ADOConnection_Excel.ConnectionString :=ADO_Connectionstring;
ADOConnection_Excel.Connected :=true;
ADOConnection_Excel.GetTableNames(ListBox_SheetList.Items,false);
for sheet_count:=0 to ListBox_SheetList.Items.Count-1 do
begin
sheet:=ListBox_SheetList.Items.Strings[sheet_count];
ADOQuery_ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;'+
'Data Source='+
Edit_Excel_DataSource.Text+
';Extended Properties=Excel 8.0;Persist Security Info=False';
ADOQuery_Excel.ConnectionString :=ADOQuery_ConnectionString;
strsql := 'select * from ['+Sheet+']' ;
strsql := strsql + ' where id = ''' + Edit_IDNO.Text '''';
// ADOQuery_Excel.active := false;
ADOQuery_Excel.Active :=true;
if ADOQuery_Excel.RecordCount > 0 then
begin
label1.Caption :=ADOQuery_Excel.FieldByName('name').Asstring;
end;
end;
end;
|
ko
資深會員 發表:28 回覆:785 積分:444 註冊:2002-08-14 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
1.試了一下, Microsoft.Jet.OLEDB.4.0 支援 Excel 的 .xls 檔
2.您這樣挺麻煩的, 既然用了 TADOConnection 後,
TADOQuery 就透過該 TADOConnection 來連 Excel 就好了
方式為 TADOQuery.Connection := TADOConnection;
不用再指定 TADOQuery.ConnectionString
3.您的 sql 出了什麼錯誤訊息? ---
Everything I say is a lie.
|
stonys
初階會員 發表:64 回覆:111 積分:38 註冊:2002-09-28 發送簡訊給我 |
您好~看了一下...
錯誤應該是出現在
strsql := 'select * from [' Sheet ']' ;這一行...
正確的方法應該是
strsql:='select * from [sheet$]' 才對
對EXCEL的SHEET取資料,需要在後方加上"$"號...
其他地方大致上測過無誤...
但如同hagar大大所言...
既然您都用了ADOConnection..再在ADOQuery中設ConnectionString似乎是多餘的...
建議可以將ADOQuery的Connection屬性指向ADOConnection即可,請參考看看!
|
Mars123
一般會員 發表:6 回覆:9 積分:3 註冊:2003-07-18 發送簡訊給我 |
各位前輩們,不好意思,小弟試出來了,其中有兩個原因
1.在除錯模式下進行時,Excel沒有關閉就離開,會造成第二次連結Excel時會出錯
2.上述情形,除了重開機外就是將該Excel更名
3.小弟在ADOQuery的指令上有下錯,已更改了(如下所示為最新的CODE)
4.接下來就是要試是否能針對Excel下insert,update,delete等指令了! 非常感謝大家的熱情回應,該我能找出錯誤的地方! var ADO_ConnectionString:string;
ADOQuery_ConnectionString:string; sheet,strsql:string; begin if OpenDialog_Excel.Execute then
begin
Edit_Excel_DataSource.Text :=OpenDialog_Excel.FileName ;
ADO_Connectionstring:='Provider=Microsoft.Jet.OLEDB.4.0;'
'Data Source='
Edit_Excel_DataSource.Text
';Mode=ReadWrite|Share Deny None;'
'Extended Properties=Excel 8.0;Persist Security Info=False';
ADOConnection_Excel.ConnectionString :=ADO_Connectionstring;
ADOConnection_Excel.Connected :=true;
ADOConnection_Excel.GetTableNames(ListBox_SheetList.Items,false);
for sheet_count:=0 to ListBox_SheetList.Items.Count-1 do
begin
sheet:=ListBox_SheetList.Items.Strings[sheet_count];
ADOQuery_ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;'
'Data Source='
Edit_Excel_DataSource.Text
';Extended Properties=Excel 8.0;Persist Security Info=False';
ADOQuery_Excel.ConnectionString :=ADOQuery_ConnectionString;
strsql := 'select * from [' Sheet ']' ;
strsql := strsql ' where id = ''' Edit_IDNO.Text '''';
//
ADOQuery_Excel.SQL.active := false;
ADOQuery_Excel.SQL.Clear ;
ADOQuery_Excel.SQL.Add(strsql);
ADOQuery_Excel.SQL.Active :=true;
//
if ADOQuery_Excel.RecordCount > 0 then
begin
label1.Caption :=ADOQuery_Excel.FieldByName('name').Asstring;
end;
end;
end;
|
japhenchen
高階會員 發表:51 回覆:444 積分:184 註冊:2003-07-23 發送簡訊給我 |
我剛也是用ADOQUERY的M$ JET OLE來連接ACCESS2003的MDB檔,就有發現一連串的問題,像檔案鎖定,容量會漫無目地的增加,後來我才發現,是我用了靜態ADOQUERY,也就是在設計模式下放的元件,在程式結束之前,這個MDB檔會一直處於鎖定狀態............. 於是我改變方向,在procedure BEGIN 後才create ADOQUERY,結束時FREE掉,鎖定的狀況消失了,無故增加檔案容量的問題也不見了,赫~
PROCEDURE ABC; VAR AQ : TADOQUERY; BEGIN AQ:=TADOQUERY.CREATE(NIL); with AQ do begin ConnectionString:='ooxx.........'; //自己先寫好吧 SQL.clear; SQL.add('SELECT * FROM ABC'); EXECSQL; OPEN; while not EOF do begin ListBox1.items.add(FieldByName('UserName').asstring); next; end; CLOSE; end; Freeandnil(AQ); END;我懂的不多,懂的也不盡然是最佳的寫法,但求我懂的東西,能在大家的討論中,愈辯愈明~ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |