标签: 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;

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

  1. Delphi各种Socket组件的模式和模型

    Delphi各种Socket组件的模式和模型 Delphi的大多数书籍里面都没有提到delphi的各种socket通信组件的模式和模型,有的书只讲解了windows的socket模式和模型,并没有归纳 ...

  2. 第十二节: EF的三种模式(二) 之 ModelFirst模式(SQLServer为例)

    一. 简介  顾名思义,ModelFirst是模型优先,是DBFirst的逆向模式,先建立实体数据模型,然后根据实体数据模型来生成数据库,从而驱动整个开发流程.(生成一个空的edmx文件,手动在里面建 ...

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

    Delphi的大多数书籍里面都没有提到delphi的各种socket通信组件的模式和模型,有的书只讲解了windows的socket模式和模型,并没有归纳各种组件采用的模型,所以我们的程序员并不知道如 ...

  4. 第十一节: EF的三种模式(一) 之 DBFirst模式(SQLServer和MySQL两套方案)

    一. 简介 EF连接数据库有三种模式,分别是DBFirst.ModelFirst.CodeFirst,分别适用于不同的开发场景. 该章节,将主要介绍EF的DBFirst连接SQLServer数据库和M ...

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

    有时候需要客户端进行服务器连接配置,自己写配置窗体,总不如直接使用系统提供的使用方便快捷 例子一: //此例子有个坏处不管用户点了确定还是取消,均返回值 procedure TForm1.Button ...

  6. 应用DriverManager类创建sqlserver数据库连接实例 JSP中使用数据库

    JSP中使用数据库 1.JDBC介绍 java数据库连接(java Database Connectivity ,JDBC)是一种用于执行SQL语句的JavaAPI ,由一组使用java编程语言编写的 ...

  7. ASP.NET 会话状态的模式

    ASP.NET 会话状态为会话数据提供了几个不同的存储选项.每个选项都通过一个 SessionStateMode 枚举值进行识别.如下列表中描述了可用的会话状态模式: InProc 模式:把会话状态存 ...

  8. 数据库连接之SQL JDBC

    数据库连接之SQL JDBC SQlServer的配置: 1).外围配置服务器中将远程连接设置为:同时使用TCP/IP和named pipes 2).点击该连接->属性->安全性-> ...

  9. 专用服务器模式&共享服务器模式

    连接ORACLE服务器一般有两种方式:专用服务器连接(dedicated server)和共享服务器连接(shared server).那么两者有啥区别和不同呢?下面我们将对这两者的区别与不同一一剖析 ...

随机推荐

  1. docker 配置远程访问证书验证

    centos7 生成证书 工具:openssl #cd /etc/docker   (docker的证书一般放这) #openssl genrsa -aes256 -passout pass:密码   ...

  2. 新手C#SQLServer在程序里实现语句的学习2018.08.12

    从C#中连接到SQL Server数据库,再通过C#编程实现SQL数据库的增删改查. ado.net提供了丰富的数据库操作,这些操作可以分为三个步骤: 第一,使用SqlConnection对象连接数据 ...

  3. centos7 升级python2.7 到python3.6(Centos7 安装Anaconda)

    Anaconda 下载 https://www.anaconda.com/download/#linux 下载文件 Anaconda3-5.2.0-Linux-x86_64.sh bash Anaco ...

  4. Java ReentrantLock和synchronized两种锁定机制的对比

    多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言.核心类库包含一个 Thread 类,可以用它来构建.启动 ...

  5. Linux Shell 文本处理工具集锦(转载)

    内容目录: find 文件查找 grep 文本搜索 xargs 命令行参数转换 sort 排序 uniq 消除重复行 用tr进行转换 cut 按列切分文本 paste 按列拼接文本 wc 统计行和字符 ...

  6. Codeforces 1136E Nastya Hasn't Written a Legend (线段树教做人系列)

    题意:有一个数组a和一个数组k,数组a一直保持一个性质:a[i + 1] >= a[i] + k[i].有两种操作:1,给某个元素加上x,但是加上之后要保持数组a的性质.比如a[i]加上x之后, ...

  7. QT隐式数据共享

    QT中许多C++类使用了隐式数据共享,最小化资源拷贝.当作为参数传递时,实际只传递了指针,这是底层完成的,程序员无需担心,即使是在多线程中,从Qt4开始: 记住,尽量使用const迭代器,vector ...

  8. swift - 代码创建 pickerView 显示或隐藏横线

    import UIKit class VC1: UIViewController { fileprivate lazy var pickerV : UIPickerView = { let v = U ...

  9. [leetcode]295. Find Median from Data Stream数据流的中位数

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  10. discuz回贴通知插件实现-显示用户状态设置

    一.完善用户是否开启回贴通知 回贴通知插件建立模块时,指定了核心文件post_set.inc.php   1.创立好数据库 建立独立数据表(不建议直接修改原有的discuz数据库,防止discuz升级 ...