ADOconnection |
答題得分者是:Dalman
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
pprayer
高階會員 發表:35 回覆:185 積分:174 註冊:2002-03-13 發送簡訊給我 |
|
Dalman
一般會員 發表:27 回覆:22 積分:24 註冊:2002-08-21 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: ‧當過 n 秒後未有與資料庫連結動時,ADO Connection 物件會被系統切斷與資料庫連結,這是微軟文件上有說明的! ‧建議你程式寫法如下: . . . if not TADOConnection.Connected then TADOConnection.Connected := true; . . 這樣子即使被切斷與資料庫連結,程式本身還是可以自動開啟連結!謝謝! 那再請教一下, 這段要寫在那裡, 是做在ondisconnect event中嗎? 另外, 我只有這個客戶會這樣, 其他十來個並沒有發生相同的問題, 我是幫他們CLIENT 裝MDAC 2.7 (上MICROSOFT網抓下來的) |
Dalman
一般會員 發表:27 回覆:22 積分:24 註冊:2002-08-21 發送簡訊給我 |
if not TADOConnection.Connected then TADOConnection.Connected := true; 上述程式碼應寫在下列地方(舉一反三,你看了就能會意了): 【範例一】
with TADOQuery do begin
Connection := TADOConnection1; //(某個ADO Connection物件)。
if not Connection.Connected then Connection.Connected := true;
ExecSQL(); // 或者 Active := true; 或者 Open();
end; 【範例二】
with TADODataSet do begin
Connection := TADOConnection1; //(某個ADO Connection物件)。
if not Connection.Connected then Connection.Connected := true;
Active := true; // 或者 Open();
end; 【結論】
當你要執行取回資料集(select SQL)或者是做異動處理(insert, update, delete)之前,就經由上述程式碼讓程式「主動地」連結資料庫,不需要擔心TADOConnection物件被會系統切斷連結。
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: if not TADOConnection.Connected then TADOConnection.Connected := true; 上述程式碼應寫在下列地方(舉一反三,你看了就能會意了): 【範例一】 with TADOQuery do begin Connection := TADOConnection1; //(某個ADO Connection物件)。 if not Connection.Connected then Connection.Connected := true; ExecSQL(); // 或者 Active := true; 或者 Open(); end; 【範例二】 with TADODataSet do begin Connection := TADOConnection1; //(某個ADO Connection物件)。 if not Connection.Connected then Connection.Connected := true; Active := true; // 或者 Open(); end; 【結論】 當你要執行取回資料集(select SQL)或者是做異動處理(insert, update, delete)之前,就經由上述程式碼讓程式「主動地」連結資料庫,不需要擔心TADOConnection物件被會系統切斷連結。謝謝你的指導, 另外我想再請教一下, 我是否可以知道Connection是因為TADO自動斷線或是因為網路斷線所造成的, 因為如果是因為網路所造成斷線的原因, 如果使用上述的方法, 仍然是會造成無法連線, 同時因為連不上線的關係, client必須要等到30-40秒後, 系統才會回應connect error(如果網路仍在online下, connect大約只要1秒內即可connected), 如此會令使用者等得很不耐煩(因為本案對時間流程十分嚴格)! |
Dalman
一般會員 發表:27 回覆:22 積分:24 註冊:2002-08-21 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
ConnectionString 字串有設定錯誤
這段如果在第一次可以連上時, 應該再連接時不致於發生有錯的現象!
有時候還必須設定「Extended Properties="Network Library=dbnmpntw";」這個在 MDAC 2.6 版以後有效,2.5版(含)之前設定了反而無法連結資料庫)
我倒是不知道有這項設定, 目前我deploy給客戶是MDAC 2.7版(在WIN98), 那這項最主要的用意在那, 是否可以加強穩定連線, 另外, 我在 ADOconnectionstring上並未看到這項設定, 那應該要加在那裡?
Server-side 或 Client-side 電腦網路斷聯
資料庫主機太忙
我比較擔心的這個, 如果這個原因, 就會導致我上篇所說的連線很久才會回應ERROR, 不論我把 TIMEOUT 設定在多少秒就是會等上30-40秒
若是要解決因網路斷連的問題,我的建議解法有下列:
使用 Win32 APIs 的 InternetCheckConnection(IPorURLStr, 0, 0)=true/false 函式來即時檢查是否可以與對方主機連線。
sorry! IporUrlstr 內容應該要如何寫 謝謝!
|
Dalman
一般會員 發表:27 回覆:22 積分:24 註冊:2002-08-21 發送簡訊給我 |
‧使用 Win32 APIs 的 InternetCheckConnection(IPorURLStr, 0, 0)=true/false 函式來即時檢查是否可以與對方主機連線。 上面這個函式我下午試了一下(uses Delphi 的 WinInet 單元),不論將網路線拿掉或是重新接上 ADSL,它永遠傳回 false ... |||||,出乎預期結果。 所以另外思考方式為: ‧使用 Thread Timer 方式(與 Delphi 提供的 TTimer 不一樣,而且實作方式有些不同),去執行嚐試與資料庫連結,若設定的 TimeOut 時間一到就判定網路斷連,立即結束 Thread。
‧利用 ping 指令將結果存成文字檔,然後去判斷內容文字,就可以知道對方主機能不能連得上了。
‧【函式範例】if InternetCheckConnection('168.95.1.1', 0, 0)= true then ...
‧【連結字串】TADOConnection.ConnectionString := 'provider=xxxxx;Data Source=zzzz;...;Extended Properties="Network Library=dbnmpntw"'; 這個是指應用程式安裝在 Client-side 電腦,但在 client-side 電腦並沒有安裝 SQL Server 或 SQL Server client,只有安裝 MDAC 2.6 版(含)以上,而應用程式必須透過網路向遠端 SQL Server 存取資料時,必須指定要使用哪個網路程式庫才好順利與 SQL Server 連結。因為參考資料我放在公司,所以白天到公司再 POST 上來
|
Dalman
一般會員 發表:27 回覆:22 積分:24 註冊:2002-08-21 發送簡訊給我 |
關於 Network library 的用法,微軟有下列這篇文章: HOWTO:在 ADO 連線字串中設定 SQL Server 網路程式庫
這篇文章中的資訊適用於:Microsoft Data Access Components 1.5, 2.0, 2.1, 2.1 (GA), 2.1 SP1, 2.1 SP2, 2.5, 2.6 SQL Server 可讓您從許多不同的網路程式庫中選擇您需要的,在連線時使用。您可以在為資料來源建立資料來源名稱 (DSN) 時設定這些網路程式庫。不過,另一種指定 DSN 的方式,是以連線字串傳入您想使用的網路程式庫。本文描述了當您從使用 ActiveX Data Objects (ADO) 的 Visual Basic 應用程式連線時,如何指定連線到 SQL Server 時欲使用的網路程式庫。 【其他相關資訊】
建立連線時,SQL Server 可讓您在建立連線時,使用下列網路程式庫。他們分別是:
dbnmpntw - Win32 Named Pipes
dbmssocn - Win32 Winsock TCP/IP
dbmsspxn - Win32 SPX/IPX
dbmsvinn - Win32 Banyan Vines
dbmsrpcn - Win32 Multi-Protocol (Windows RPC) 透過 ADO 連線至 SQL Server 時,連線字串中的 NETWORK 參數可用來指定連線至資料庫時要使用哪些程式庫。NETWORK 參數是要使用的網路程式庫 (Net-Library) 模組之名稱,不包括 .dll 字尾 (如 Dbmssocn,非 Dbmssocn.dll)。以下是指定此參數的連線字串之範例: 連線字串(使用 Named Pipes 網路程式庫,透過 SQLOLEDB 提供者連線至 SQL Server)。 "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=pubs;Data Source=YourDataSourceName;Network Library=dbnmpntw" 連線字串(使用 TCP/IP 網路程式庫透過 MSDASQL 提供者連線至 SQL Server)。 "Provider=MSDASQL.1;Persist Security Info=False;User ID=sa;Extended Properties="DSN=yourdatasourcename;UID=sa;DATABASE=pubs;Network=dbmssocn";Initial Catalog=pubs"
|
macchen
初階會員 發表:66 回覆:102 積分:33 註冊:2006-07-07 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |