全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2603
推到 Plurk!
推到 Facebook!

以ADO連上Excel後,如何對Excel下SQL指令,是否用ADOQuery?

尚未結案
Mars123
一般會員


發表:6
回覆:9
積分:3
註冊:2003-07-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-05 16:37:34 IP:202.129.xxx.xxx 未訂閱
各位前輩,小弟欲以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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-11-05 18:28:32 IP:61.221.xxx.xxx 未訂閱
Mars123 你好: 除了code以外可以多提一下錯在哪一行嗎? 其實 Microsoft.Jet.OLEDB.4.0 好像不支援*.xls不是嗎?
------
======================
昏睡~
不昏睡~
不由昏睡~
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-11-05 18:36:16 IP:202.39.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-11-05 22:23:06 IP:203.67.xxx.xxx 未訂閱
您好~看了一下... 錯誤應該是出現在 strsql := 'select * from [' Sheet ']' ;這一行... 正確的方法應該是 strsql:='select * from [sheet$]' 才對 對EXCEL的SHEET取資料,需要在後方加上"$"號... 其他地方大致上測過無誤... 但如同hagar大大所言... 既然您都用了ADOConnection..再在ADOQuery中設ConnectionString似乎是多餘的... 建議可以將ADOQuery的Connection屬性指向ADOConnection即可,請參考看看!
Mars123
一般會員


發表:6
回覆:9
積分:3
註冊:2003-07-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-11-06 10:59:57 IP:202.129.xxx.xxx 未訂閱
各位前輩們,不好意思,小弟試出來了,其中有兩個原因 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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-11-06 13:05:46 IP:211.96.xxx.xxx 未訂閱
我剛也是用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;
我懂的不多,懂的也不盡然是最佳的寫法,但求我懂的東西,能在大家的討論中,愈辯愈明~
系統時間:2024-07-01 10:57:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!