講述ADO多線程如何更好的進行操作
通過專家和一些技術人員的見解,如果開發基于ADO多線程操作,最好在每個線程中放置一個連接,而數據集和數據連接都使用動態生成,當然你必須要注意必須要保證線程能過正常的釋放
所以 ,后臺數據庫暫時使用access小型數據庫進行代替,到后期可以改為SQLSERVER數據庫,,我在后臺數據庫中使用了兩個表,使用WORKMARK字段將其相關聯,如果ADO多線程在第一個表中查找到信息以后馬上會進入第二個表中進行查找,如果第一個表中的信息符合,就返回個客戶第二個表中的信息,因為座席端主機有200多臺,為了防止幾臺主機同時進行驗證信息,引起沖突,我在服務器端建立多線程,
利用線程進行后臺的查詢,以及查找結果的回傳,編寫成功后進行測試,發現當一個主機連接后可以測試成功,但是,當第二個或者以后的線程產生時,數據集在第一個表中可以查到正確的信息,但是進入第二個表中時。
會發現按照正確的查找條件進行查找時,查到的信息都為NIL,而且經過跟蹤,ADO多線程發現,其實ADO已經找到了正確的信息,而且已經發送成功了,ADO多線程但是卻無法接收到,當時我在論壇中發表了一個帖子尋求幫助。
有些朋友說可能ACCESS數據庫不提供多線程訪問,但是我聽說很多的論壇中好像都使用了ACCESS進行后臺線程的查找的。翻看MSDN中關于COM的說明:發現我的線程中竟然缺少最重要的兩個函數過程
CoInitialize( nil );凡是訪問com對象都應該使用。ADO多線程線程的關閉時應該使用CoUnInitialize;否則ADO肯定出錯,我相信肯定有不少的朋友經歷過這種問題的:
- constructor QueryThread.create(ComputerInfor, IPaddressinfo: string;nmmsg,NMretureMSG:TNMMSG);
- begin
- CoInitialize( nil );//使用com對象必須要初始化
- inherited create(false);
- FreeOnTerminate:=true;
- FComputerInfor:=ComputerInfor;
- FIPaddressinfo:=IPaddressinfo;
- IPlist:=Tstringlist.create;//創造ip列表
- FAdoQuery:=TAdoQuery.Create(nil); //動態生成表一
- FAdoQUserInfor:=TadoQuery.Create(nil);//動態生成表2
- Fadoconnection:=Tadoconnection.Create(nil);//動態生成的連接
- Fadoconnection.LoginPrompt :=false;
- Fadoconnection.KeepConnection :=true;
- Fadoquery.Connection:=Fadoconnection;
- FAdoQUserInfor.Connection :=Fadoconnection;
- Fadoconnection.ConnectionString :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=PersonInformation.mdb;Mode=Read;Persist Security Info=False';