配置ADOCONNECTION組件屬性
你可以生成一個(gè)數(shù)據(jù)模塊,靜態(tài)放置數(shù)據(jù)集和ADO CONNECTION組件,然后使該數(shù)據(jù)模塊不在程序開始時(shí)生成,而可以在線程中動態(tài)的生成,這種方法也可以,有興趣的朋友可以試一下二者之間的執(zhí)行效率。
本人最近正在進(jìn)行呼叫中心的座席端和服務(wù)器軟件開發(fā),座席端登錄部分是進(jìn)行提取主機(jī)信息,然后使用SOCKET提交給遠(yuǎn)程服務(wù)器,服務(wù)器再在后臺數(shù)據(jù)庫中進(jìn)行查找信息,進(jìn)行對比,看是否允許座席端主機(jī)登錄,因?yàn)槲业碾娔X中無法安裝SQLSERVER。
所以 ,ADO CONNECTION后臺數(shù)據(jù)庫暫時(shí)使用access小型數(shù)據(jù)庫進(jìn)行代替,到后期可以改為SQLSERVER數(shù)據(jù)庫,,我在后臺數(shù)據(jù)庫中使用了兩個(gè)表,使用ADO CONNECTION字段將其相關(guān)聯(lián),如果在***個(gè)表中查找到信息以后馬上會進(jìn)入第二個(gè)表中進(jìn)行查找,如果***個(gè)表中的信息符合,就返回個(gè)客戶第二個(gè)表中的信息,因?yàn)樽酥鳈C(jī)有200多臺,為了防止幾臺主機(jī)同時(shí)進(jìn)行驗(yàn)證信息,引起沖突,我在服務(wù)器端建立多線程。#t#
利用線程進(jìn)行后臺的查詢,以及查找結(jié)果的回傳,ADO CONNECTION編寫成功后進(jìn)行測試,發(fā)現(xiàn)當(dāng)一個(gè)主機(jī)連接后可以測試成功,但是,當(dāng)?shù)诙€(gè)或者以后的線程產(chǎn)生時(shí),數(shù)據(jù)集在***個(gè)表中可以查到正確的信息,但是進(jìn)入第二個(gè)表中時(shí),會發(fā)現(xiàn)按照正確的查找條件進(jìn)行查找時(shí),查到的信息都為NIL,而且經(jīng)過跟蹤,發(fā)現(xiàn),其實(shí)ADO CONNECTION已經(jīng)找到了正確的信息,而且已經(jīng)發(fā)送成功了,但是卻無法接收到,當(dāng)時(shí)我在論壇中發(fā)表了一個(gè)帖子尋求幫助。
有些朋友說可能ACCESS數(shù)據(jù)庫不提供多線程訪問,但是我聽說很多的論壇中好像都使用了ACCESS進(jìn)行后臺線程的查找的。翻看MSDN中關(guān)于COM的說明:發(fā)現(xiàn)我的線程中竟然缺少最重要的兩個(gè)函數(shù)過程。
CoInitialize( nil );凡是訪問com對象都應(yīng)該使用。線程的關(guān)閉時(shí)應(yīng)該使用CoUnInitialize;否則ADO CONNECTION肯定出錯(cuò),我相信肯定有不少的朋友經(jīng)歷過這種問題的:
- unit Unitquerythread;
- interface
- uses
- windows,SysUtils,Classes, Dialogs,ADODB,db, NMMSG, ActiveX{必須要有};
- type
- QueryThread = class(TThread)
- private
- FComputerInfor,FIPaddressinfo: string;//傳遞的信息
- FAdoQuery,FAdoQUserInfor:TadoQuery;//動態(tài)生成的表一,表2
- Fadoconnection:Tadoconnection;//動態(tài)生成的連接
- Fnmmsg,FNMretureMSG:TNMMSG;//用來發(fā)送返回信息的組件
- filestream:tfilestream;
- procedure ExtractInfor(TransInfo:string{自定義的從該提交信息中分離信息的過程});
- procedure ShellexeQuery;
- Destructor Destroy;