![](http://static.blog.csdn.net/images/category_icon.jpg)
版权声明:本文为博主原创文章,未经博主允许不得转载。
1 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;