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

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

标签: delphi数据库

2015-08-12 20:59 351人阅读 评论(0) 收藏 举报

 分类:

delphi(3) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

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;

时间: 2024-11-05 16:04:41

delphi 6数据库连接之长短模式(sqlserver)的相关文章

转:Delphi各种Socket组件的模式和模型

Delphi的大多数书籍里面都没有提到delphi的各种socket通信组件的模式和模型,有的书只讲解了windows的socket模式和模型,并没有归纳各种组件采用的模型,所以我们的程序员并不知道如何进行选择,只知道某组件好,为什么好,如何运用就不知道了. 笔者对这些组件进行了一个归纳,如下: 组件 单元 依赖 模式 模型 WebApp/CGI sockapp.pas Indy 阻塞/非阻塞 select Indy 阻塞/非阻塞 select ICS OverbyteIcsWSocket.pa

Delphi启动数据库连接属性对话框

有时候需要客户端进行服务器连接配置,自己写配置窗体,总不如直接使用系统提供的使用方便快捷 例子一: //此例子有个坏处不管用户点了确定还是取消,均返回值 procedure TForm1.Button1Click(Sender: TObject); var connStr:string; begin connStr := PromptDataSource(Application.Handle,ADOConnection1.ConnectionString); //function PromptD

专用服务器模式&amp;共享服务器模式

连接ORACLE服务器一般有两种方式:专用服务器连接(dedicated server)和共享服务器连接(shared server).那么两者有啥区别和不同呢?下面我们将对这两者的区别与不同一一剖析. 专用服务器模式(dedicated server)模式 在专用服务器模式中,用户进程运行在客户端的机器上,专用服务器进程运行在数据库服务器,用户进程和专用服务器进程是两种不同类型的进程. 对于专用服务器模式,在用户登录时,ORACLE总会创建一个新的服务进程,这通常称为专用服务器配置.这个服务器

关于c3p0数据库连接池的简单使用

在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接. 进行sql操作 断开数据库连接. 这种模式开发,存在的问题: 普通的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证用户名和密码(得花费0.05s-1s的时间).需要数据库连接的时候,就向数据库要求一个,执行完成后再断开连接.这样的方式将会消耗大量的资源和时间.数据库的连接资源并没有得

菜鸟学SQLServer--恢复模式

恢复模式 SQLServer支持三种恢复模式: 简单 -- 不支持日志备份,自动检查点会截断事务日志中没使用到的部分 完整 -- 需要日志备份.支持点恢复 大容量日志 -- 需要日志备份.通过使用最小方式记录大多数大容量操作,减少日志空间使用量. 不同的恢复模式支持不同的还原方案,同时也影响事务日志的管理. 还原方案 按粒度分,SQLServer支持以下几种还原: 数据库完整还原 数据文件还原 页面还原 具体的还原方案和恢复模式对应的表格再参考链接2可找到. 恢复模式的选择 简单恢复模式 使用方

Delphi 编写ActiveForm窗体工程知识和样例(开发浏览器客户端应用程序)(有详细步骤)

一.基础知识介绍: 1.ActiveForm的基础知识介绍: 在Delphi中,ActiveForm是封装了Delphi Form的一种ActiveX控件.ActiveForm其实是一种标准的Delphi From(ActiveForm继承自TForm).ActiveForm中可能会包含某些VCL或者ActiveX组件,包括用户自定义的组件. 就像“标准的”Windows应用程序一样,我们也可以向ActiveForm中添加代码以及对事件作出应答.唯一的区别是,ActiveForm的标题栏(tit

Java -- JDBC 学习--数据库连接池

JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接. 进行sql操作 断开数据库连接. 这种模式开发,存在的问题: 普通的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证用户名和密码(得花费0.05s-1s的时间).需要数据库连接的时候,就向数据库要求一个,执行完成后再断开连接.这样的方式将会消耗大量的资源和

easyui+nodejs+sqlserver增删改查实现

用到的模块或者技术: Express: http://www.expressjs.com.cn/4x/api.html#express Easyui: http://www.jeasyui.com/documentation/index.php# express-session:https://www.npmjs.com/package/express-session#resave node-mssql: http://csdoc.org/ Redis: http://redis.io/ art

delphi fastMM 使用方法简介

delphi fastMM 使用方法简介 在 http://sourceforge.net/projects/fastmm 中可以下载到最新 stable 的 FastMM,当前推荐的是 4.62,主要特点包括: 1.彻底实现了 Borland 的内存管理器,可以完全取代现有的内存管理器("取代"就是第一个 uses FastMM4,that is all ...) 2.实现了内存管理器共享机制,Exe 和 Dll 间共享内存管理器不需要任何 Dll 支持 3.集成了内存泄漏检测功能