开发一个系统:本地用ACCESS,远程用SQLSERVER.用ADO控件.1.程序中,如何在连接不上SQLSERVRE时,如网断或是其他情况时能够得知.用什么事件???这个是c/s程序都应该考虑的问题,不知道大家怎么处理网络不通的情况.2.对事务的概念有所模糊.事务它应该是对一个ADOConnection的吧?我用一个Adoconnection连接数据库,然后,有三个ADoquery连接上该Adoconnection,这三个Adoquery在执行时是作为一个单位进行处理的吗?一起成功,一起失败?3.在一个5000左右的表中查询一个记录,用什么方法比较快些?新手,做项目遇到这些问题,单位不好上网,希望大侠指点.

解决方案 »

  1.   

    第一:检验网络连接,你可以参考一下下面代码:
    function TE_databasef.InternetConnected: boolean;
    {const
      // local system uses a modem to connect to the internet.  拨号上网,ADSL
         internet_connection_modem=1;
      // local system uses a local area network to connect to the internet.  通过局域网
         internet_connection_lan=2;
      // local system uses a proxy server to connect to the internet.       代理服务器
         internet_connection_proxy=4;
      // local system uese a  modem is busy with a non-internet connection. 无网络连接
         internet_connection_modem_busy=8;   }
    var
      dwconnectiontypes : integer;
    begin
      dwconnectiontypes:=INTERNET_CONNECTION_MODEM +INTERNET_CONNECTION_PROXY;
      if (InternetGetConnectedState(@dwconnectiontypes, 0) = False) then
        Result := False
      else
        Result := True;
    end;
     需要注意的是,如果在再上局域网internet_connection_lan连接的方式则有可能出错,因为局域网很不稳定,可能第一次时能正确判断是否有连网,但如果把网线拨了再插,就有可能判断不正确了,最好还是用indy的网络控件.不过我也不太会用,这是比较简单的方法,注意,只检验物理连接!
    第二,应该不会向你说的那样一起成功或是失败,只要adoconnection连接正常,就不会出错(其实我不太明白LZ用到的是什么事务~~嘿~)
    至于第三~~~我也不太懂~
      

  2.   

    1.可以用try except 捕获
    2.  adoconnection1.BeginTrans
        遇到
        adoconnection1.RollbackTrans 
        或adoconnection1.committrans
    就是一个事务过程
    3.5000左右,不多吧,不过要有索引,select 就行了;如果要全部select到本地的话不提倡,一次显示的时候少取些.
      

  3.   

    1.不管断不断网,你可以用
    try
      ADOConnection.Connect:=true;
    except
      //切换连接到access
    end;
    来判断是否能连接SQL SERVER,不行就切换到access。
    2.事务:
    ADOConnection.BeginTrans//开始进入事务
    {之间所有代码均处于事务当中}
    ADOConnection.RollbackTrans取消事务 or  ADOConnection.CommitTrans提交事务
    ADOConnection.BeginTrans//开始另外一个事务.......
    3.
    5000笔记录的表,直接下SQL就可以了吧
      

  4.   

    1.用try except截获
    2.3个query可以单独处理 也可以一起处理
    3.直接用SQL处理 如果有index更快
      

  5.   

    其实网络的通断简单的使用某个函数是不能准确地检测的,比较合理的方法使用有效检测机制进行实时诊断,比如使用ICMP协议检测,正常情况下网络只要连通除认为因素外是不会自动断开的.
    我这只是提供个参考意见.
    搂主可以使用TIdICMPClient组件定时监测网络的通断,如果不通可以触发对应的世界.
      

  6.   

    第一个问题:如果想判断网络是否连的通,用try..except的语句反映很慢,可能有一两分钟左右建议先用ICMP控件ping一下远方主机:IdIcmpClient1.Host:='ip地址';
    IdIcmpClient1.Ping();在它的reply里面判断是否ping成功,一般如果网络通,sqlserver都能连上。第二个问题很模糊,一起成功,一起失败是什么意思?第三个问题,用adoquery就可以查,我曾经查过几万条记录中的,速度也不慢。
      

  7.   

    1.程序中,如何在连接不上SQLSERVRE时,如网断或是其他情况时能够得知.用什么事件???这个是c/s程序都应该考虑的问题,不知道大家怎么处理网络不通的情况.
    一般都是用写一个函数,返回是否为true,如果不为true,就表示网络断开,然后尝试连接.2.对事务的概念有所模糊.事务它应该是对一个ADOConnection的吧?我用一个Adoconnection连接数据库,然后,有三个ADoquery连接上该Adoconnection,这三个Adoquery在执行时是作为一个单位进行处理的吗?一起成功,一起失败?如果对事务不是很清楚,建议去google下,你就会很清楚了
    http://www.51one.net/study/Delphi/40458.html
    3.在一个5000左右的表中查询一个记录,用什么方法比较快些?一般建立索引,查询速度会提升;
      

  8.   

    回各位:
    1。该系统是工厂内的运转的一套系统,希望是网通时正常工作,网断则保存在本地等网断时在上传到服务器上去。
       用ping似乎也不太好吧,因为ping通不代表就一定能连上数据库服务器;
       用try except的确似乎反映太迟钝。
       也不能总是在数据处理之前都要ADOConnection.Connect:=true;吧,我是在程序启动的时候
    connect一次,而不是每次都是要connect,不知道我这样是不是正确。
    2。只要是用一个Adoconnection,就是在一个事务之内。
       一个Adoquery1操作A表,一个Adoquery2操作B表,一个Adoquery3操作C表,可以最为一个事物一起提交成功,失败吗?
      

  9.   

    1. 貌似觉得可以不管怎么样,先保存到本地Access,然后在上传到SQL server也不错哈,就不怕断网了。
    2. 好象是单独不相关的吧,A,B,C可以单独成功。看程序执行顺序了
    3. 5000的记录算很少了,如果有索引的话,下SQL语句很快的。小弟才学,比较菜,报着学习的态度来回答问题。