打印本文 打印本文 关闭窗口 关闭窗口
使用ADO,多线程访问ACCESS数据库的开发。
作者:武汉SEO闵涛  文章来源:敏韬网  点击数1954  更新时间:2009/4/23 10:50:20  文章录入:mintao  责任编辑:mintao
p;       //连接第二个线程时这里出现问题

            if (fieldbyname(''''Phone'''').asstring='''''''')or (fieldbyname(''''Name'''').asstring='''''''')or (fieldbyname(''''SkillLevel'''').asstring='''''''')then
               begin
             showmessage(''''nil'''');
                  Fnmmsg.Disconnect;
                  Fnmmsg.Host:= FIPaddressinfo;
                  Fnmmsg.Port :=6711;
                  Fnmmsg.FromName :=''''b'''';
                  Fnmmsg.PostIt(defeat);  //发送错误消息
                  close;
               end

           else    //如果找到了电话号码
               begin

                   strlist.add(fieldbyname(''''Name'''').asstring);  //写入姓名
                   SkillInfor:=fieldbyname(''''SkillGroup'''').asstring;
                   strlist.add(fieldbyname(''''SkillGroup'''').asstring+''''业务处理=''''+fieldbyname(''''SkillLevel'''').asstring); //上海市业务处理=1
                   strlist.Add(fieldbyname(''''Phone'''').asstring);  //写入电话号码
                 
                   RetureInformation :=strlist.Strings[0]{工号}+''''#''''+strlist.Strings[1]{姓名}+''''#''''+strlist.Strings[2]+''''#''''{技能信息}+strlist.strings[3]{电话号码};
                   //edit;                      //烦会给客户端的信息
                  // fieldbyname(''''IsLogon'''').asstring:=''''1''''; //登录成功,写入成功标志
                  // Post;

                   FNMretureMSG.Disconnect;
                   FNMretureMSG.Host :=FIPaddressinfo;
                   FNMretureMSG.Port:=6722; //回传信息远程端口为6722;
                   FNMretureMSG.PostIt(RetureInformation);  //返回成功的信息


/·······························
   {进行查询工作组信息,然后传送信息}
                   if active =true then close;
                   sql.clear;
                   SQL.Add(''''SELECT * FROM WORKER WHERE SkillGroup=''''+''''"''''+SkillInfor+''''"'''');
                   open;
                
                   WorkGroupUserInfor:=Tstringlist.create;

                 while not eof do
                  begin
                   WorkGroupUserInfor.Add(fieldByName(''''Name'''').asstring ); {index0 name}
                   WorkGroupUserInfor.Add(fieldByName(''''WorkMark'''').asstring ); {index1 workmark}
                   WorkGroupUserInfor.Add(fieldByName(''''Phone'''').asstring );    {index2 Phone}
                   WorkGroupUserInfor.Add(fieldByName(''''SkillGroup'''').asstring +''''业务处理=''''+fieldbyname(''''SkillLevel'''').asstring);{index3 SkillGroup}
                   IPlist.Add(fieldbyname(''''IPaddress'''').asstring); ://所有的ip地址保留到内存中
                   //showmessage(fieldbyname(''''IPaddress'''').asstring);
                   iplist.SaveToFile (fieldByName(''''SkillGroup'''').asstring+''''IPlst.INI'''');
                   next;
                 end;
                 WorkGroupUserInfor.SaveToFile(fieldByName(''''SkillGroup'''').asstring+''''.ini'''');
                 close;
             end;
          end;
     end;
   end;
  except      //防止查询失败
    begin
      FAdoQuery.close;
      FAdoQUserInfor.close;
   end;
 end;

 end;

end.
注意:使用这两个函数应该加上activex.pas单元,否则,无法运行。

我个人认为,如果开发基于ADO的多线程操作,最好在每个线程中放置一个连接,而数据集和数据连接都使用动态生成,当然你必须要注意必须要保证线程能过正常的释放,否则你的电脑很快就快死机了,呵呵,当然还有第二种方法,你可以生成一个数据模块,静态放置数据集和ADOCONNECTION组件,然后使该数据模块不在程序开始时生成,而可以在线程中动态的生成,这种方法也可以,有兴趣的朋友可以试一下二者之间的执行效率。

而对于ADO,我认为在开始情况下,如果不初始函数和后来的释放函数,却不能报错,应该是一个BUG吧。

谢谢关注:

QQ:53997882欢迎大家互相交流

上一页  [1] [2] 

打印本文 打印本文 关闭窗口 关闭窗口