zoukankan      html  css  js  c++  java
  • delphi 6数据库连接之长短模式(sqlserver)

     

    delphi 6数据库连接之长短模式(sqlserver)

    标签: delphi数据库
     分类:

    delphi连接sqlserver之长短连接

     我们连接数据库通常有长连接短连接模式,在delphi里面经常采用TADOConnection建立数据库连接,然后用TADOQuery来进行CRUD操作。TADOConnection可以设置连接超时,KeepConnection一直保持数据库连接,直到程序停止运行。如果主动调用最下面的2行单行注释,1~2min内左右没有任何操作,连接就会自动断开。

    adoconnection1.ConnectionString := 'Provider=SQLOLEDB.1;Password=1;Persist Security Info=True; User ID=sa;Initial Catalog=databasename;Data Source=127.0.0.1';
      ADOQuery1.Connection := ADOConnection1;
      ADOConnection1.Open;
      ADOQuery1.SQL.Add('select * from table1');
      ADOQuery1.Open;
      while not ADOQuery1.Eof do
      begin
        {get value}
        ADOQuery1.Next;
      end;
      //qry1.Connection:=nil;
      //adoconnection1.Connected:=False;
     
     考虑到**长连接**极有可能因为长时间无数据访问,被防火墙连接回收机制回收。由于访问数据库频率不高,我们可以采用每次访问数据库都去先建立连接,用完释放。  可以直接动态创建Adoquery,然后设置其ConnectionString属性,就可以用Adoquery直接连接数据库了。
    var mqry: TADOQuery
      begin
        mqry:= TADOQuery.Create(nil);
        mqry.Close;
        mqry.SQL.Clear;
        mqry.ConnectionString := 'Provider=SQLOLEDB.1;Password=123;Persist Security Info=True;  User ID=sa;Initial Catalog=databasename;Data Source=127.0.0.1';
        mqry.SQL.Add(str_sql);
        mqry.Open;
        while not mqry.Eof do
        begin
          {get value}
          mqry.Next; 
        end;
        //Sleep(3000);{查看效果} 
        if Assigned(mqry) then FreeAndNil(mqry);// 释放对象
      end;
     

    2 如何重连数据库

     delphi的TAdoconnnection 和TAdoquery都不带断网自动重连功能.
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      adocon := TADOConnection.Create(nil);
      adocon := sConnect_Sting; // 数据库连接串
    end;
    procedure TForm1.btnQueryClick(Sender: TObject);
    begin
      try
        if not adocon.Connected then
          adocon.Open;
        adoqry.Connection := adocon;
        adoqry.Connection := adocon;
        adoqry.CommandText := pSQL;
        adoqry.CommandTimeout := iTimeOut;
        {1.手动关闭数据库服务,
        每次调用Open,都会产生连接失败错误,就算此时开启DB服务,还是会连接报错,可见adoqry根本不会重连}
        adoqry.Open;
      except on e: Exception do
        begin
           {在DB服务断开的情况下,如果重新生成adocon对象连接数据库,报错<一般性网络错误。请检查网络文档>,不会产生连接失败错误<Description=连接失败;NativeError=0;SQLState=08S01;>}
           ShowMessage(e.Message);
        end
      end;
    end;
    

    3 如何解决

     一般采用定时器,如果产生了连接失败,定时去重连几次(一般3~5次),这里我只演示如何重连,看代码:

    // AdoConn在你的主类Create的时候会初始化一次。
    重连DB函数
    function doReconnect(iTimeOut: Integer = 0):Boolean;
    begin
        Result:=True;
        try
          if Assigned(AdoConn) then FreeAndNil(AdoConn);
          AdoConn:= TADOConnection.Create(Application);
          AdoConn.ConnectionString:=sConnString;
          AdoConn.ConnectionTimeout:=iTimeOut;
          AdoConn.Open;
        except
          Result:=False;
          if Assigned(AdoConn) then FreeAndNil(AdoConn);
        end;
    end;
    function OpenSQL(pSQL: PChar; adoDataSet: TADODataSet; iTimeOut: Integer = 0): Boolean;
    var
      error_set: Errors;
      error_obj: Error;
      iCount: Integer;
      error_str: string;
    begin
      try
        //是否重连数据库
        if reconnect then
        begin
          if doReconnect(iTimeOut) then
          begin
            reconnect := False;//下次进来不需要重连
            error_str := '重连数据库成功';
          end
          else
            raise Exception.Create('重连数据库失败,可能数据库服务未开启!');
        end;
        if not AdoConn.Connected then
          AdoConn.Open;
        adoqry.Connection := AdoConn;
        adoqry.CommandText := pSQL;
        adoqry.CommandTimeout := iTimeOut;
        adoqry.Open;
      except
        on E: Exception do
        begin
          error_str := 'OpenSQL执行[' + string(pSQL) + ']出错:';
          if Assigned(adoqry.Connection) then
          begin
            error_set := adoqry.Connection.Errors;
            for iCount := 0 to error_set.Count - 1 do
            begin
              error_obj := error_set.Item[iCount];
              error_str := error_str + 'Description=' + error_obj.Description + ';NativeError=' + IntToStr(error_obj.NativeError) + ';SQLState=' + error_obj.SQLState + ';';
              if error_obj.SQLState = '08S01' then // 如果连接问题
                reconnect := True; //是否需要重连标志,下次调用需要重连
            end;
          end
          else error_str := error_str + E.Message + chr(0);
        end;
      end; // end for try
      if error_str <> '' then ShowMessage(error_str);
    end;// end for begin
    

    总结

     TADOQuery可以直接连接数据库,不主动释放就会一直保持连接(适用于数据库频率较低的情况);但TAdoconnnection有一些详细的属性,例如ConnectionTimeOut连接超时秒数,KeepConnection保持连接,可控能力更强,连接出错时,会返回详细的错误信息集errorset;

  • 相关阅读:
    Python 调用multiprocessing模块下面的Process类方法(实现服务器、客户端并发)-TCP协议
    Python开启进程的2中方式
    基于UDP的交互的实例
    Python socket粘包问题(最终解决办法)
    Python socket粘包问题(初级解决办法)
    Python socket套字节
    OSI七层模型
    异常处理
    Python封装与隐藏
    螺旋队列问题
  • 原文地址:https://www.cnblogs.com/westsoft/p/5964578.html
Copyright © 2011-2022 走看看