===============================

解决方法一:异常时关闭连接,WinXP,win7 32位大部分情况都是起作用的,不过在有些windows操作系统下(如家庭版)不起作用,不知为何?

===============================

try

//执行sql操作

except

AdoConnection.close;//出现异常时关闭连接,在执行sql语句时会自动打开连接,从而实现断线重连

end;

===============================

解决方法二:ADO控件动态创建,独立设置连接字符串,为了避免连接不上时界面卡死,可以考虑放到线程中执行。

推荐,亲测有效

===============================

unit untMain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
IniFiles, ExtCtrls, DB, ADODB,ActiveX; type
TFrmMain = class(TForm)
Timer2: TTimer;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure getXXData(); end;
//ADO连接获取数据线程
TAdoThread = class(TThread)
protected
procedure execute; override;
end;
var
FrmMain: TFrmMain;
ConString: string;
{ 初始化临界区CS变量 }
CS: TRTLCriticalSection;
implementation uses untabout; {$R *.dfm} { TForm1 }{ 写程序异常日志 }
procedure write_error_log(str: string);
var
F: TextFile;
mfile: string;
begin
try
//判断保存日志文件的目录是否存在
if not DirectoryExists(ExtractFilePath(ParamStr()) + 'log') then
MkDir(ExtractFilePath(ParamStr()) + 'log'); //按日期及时间设定保存日志的文件名
mfile := ExtractFilePath(ParamStr()) + 'log\ErrLog_' + formatdatetime('yyyy-mm-dd', now) + '.txt'; AssignFile(F,mfile);
if not FileExists(mfile) then
Rewrite(F);//如果文件不存在,则创建一个新的文件,并写入
Append(F); //追加写入
Writeln(F,str);//写入并换行
CloseFile(F);
except
end;
end;
procedure TFrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
{ 清除线程CS变量 }
DeleteCriticalSection(CS);
Timer2.Enabled := False;
end;
procedure TFrmMain.FormShow(Sender: TObject);
var
clientini: TIniFile;
db_server,user,password:string;
begin
{ 获取ini配置信息}
clientini := TIniFile.Create('.\config.ini');
try
if clientini<>nil then
begin
db_server := trim(clientini.readString('database','db_server',''));
user := trim(clientini.readString('database','user','sa'));
password := trim(clientini.readString('database','password','')); ConString := 'Provider=SQLOLEDB.1;Persist Security Info=False;User ID='
+user+';Password='+password+';Initial Catalog=Testdb;Data Source='+db_server;
end;
finally
clientini.Free;
end;
InitializeCriticalSection(CS);//初始化线程临界区 end; procedure TFrmMain.Timer2Timer(Sender: TObject);
begin
Timer2.Enabled := False;
TAdoThread.Create(False);
end;
procedure TFrmMain.getXXData();
var
ADOStoredProc1: TADOStoredProc;
begin
ADOStoredProc1 := TADOStoredProc.Create(nil);//动态创建ADO控件
try
try
ADOStoredProc1.ConnectionString := ConString;//采用独立的连接字符串
if ADOStoredProc1.Active then
ADOStoredProc1.Active := false;
ADOStoredProc1.ProcedureName := 'GetData';
ADOStoredProc1.Prepared := false;
ADOStoredProc1.Parameters.Refresh;
ADOStoredProc1.Prepared := true;
ADOStoredProc1.ExecProc;
except
on E:Exception do
begin
write_error_log(FormatDateTime('yyyy-mm-dd hh:nn:ss',Now)
+ '>> 执行getXXData时发生异常!错误原因:'+E.Message
);
end;
end
finally
ADOStoredProc1.Free;
end;
end; { TAdoThread }
procedure TAdoThread.execute;
begin
inherited;
FreeOnTerminate := True; //设置线程执行完成后自动释放
{进入线程临界区}
EnterCriticalSection(CS);
try
CoInitialize(nil); //线程中使用ADO,必须调用(需Uses ActiveX)
{读取HIS数据}
FrmMain.getHisData(FrmMain.hasCharge);
CoUninitialize;
finally
{ 离开线程临界区 }
LeaveCriticalSection(CS);
end;
FrmMain.Timer2.Enabled := True;
end; end. ============================
其他解决方法:未验证,资料来自:
http://bbs.csdn.net/topics/390958648
============================
Win7上ADO连接SQLServer过几十分钟后自动断网(被防火墙拦截等)问题终于解决了,困惑了很久
今天终于解决了!方法很简单,和大家共享一下。 问题现象:ADO连接SQLServer过几十分钟后(有的过几周)数据库连接无缘无故断开,
再做数据库操作报错“连接失败”。实际上此时数据库服务器可以ping通,
新创建其他ADO控件连接数据库也没问题。就这个ADO不行了。 问题分析:
刚开始想得比较简单,只要创建个线程或者Timer时时判断ADOConnecton1.Active属性=false不得了么。但实际上因为后台原因
或者服务断开再重连、被防火墙拦截等意外情况发生时ADOConnecton1.Active属性仍然是true!无法判断。
后来想到用ping,如果ping不通那就断开了?!但是ping通了未必说明数据库就能连通!ping无法判断数据库能否连通。
那么线程里面不断执行个select GetDate 之类简单SQL,如果失败就判断数据库断开行不行呢?显然不行,
多用户同时不断连接数据库对服务器压力太大了,不可取。
后来网上查了很多材料,有人提出捕获OleException的方法,既不创建线程和定时器判断数据库是否断开,而是当用户执行操作
发生Ole异常时捕获它,如果是数据库连接错误,那么恢复数据库连接即可,我在他们代码基础上完善了一下,以下是实现代码。 控件: Button1: TButton;
ADOConnection1: TADOConnection;
Button2: TButton;
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
ApplicationEvents1: TApplicationEvents; 代码: uses ComObj; {$R *.dfm} procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception);
var
I: integer;
begin
//请执行如下命令或者其他方法强制产生数据库连接断开情况,以触发如下异常。
//net stop MsSqlServer
//net start MsSqlServer
if (E is EOleException) and ((E as EOleException).ErrorCode= -) then
begin
ADOConnection1.Connected := False;
try
ADOConnection1.Connected := True;
except On E2: Exception do
begin
MessageDlg('重连数据库发生错误:'# + E2.Message, mtError, [mbOK], );
end;
end;
end;
end; procedure TForm1.Button1Click(Sender: TObject);
var
sSQL: string;
begin
sSQL:= 'Provider=SQLOLEDB.1;Password=YourPassword;Persist Security Info=True;' +
'User ID=sa;Initial Catalog=YourDatabase;Data Source=.'; with ADOConnection1 do
begin
LoginPrompt:= false;
Connected:= false;
ConnectionString:= sSQL;
Connected:= true;
end;
ShowMessage('ok');
end; procedure TForm1.Button2Click(Sender: TObject);
begin
with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('select * from Test');
Open;
end;
end;

Delphi:ADOConnection连接SQLServer自动断网问题解决的更多相关文章

  1. ssh空闲一段时间后自动断网

    ssh空闲一段时间后自动断网 用客户端工具,例如securecrt连接linux服务器,有的会出现过一段时间没有任何操作,客户端与服务器就断开了连接. 造成这个的原因,主要是因为客户端与服务器之间存在 ...

  2. Win10电脑经常自动掉线、自动断网的解决方法

    近期一客户称自己使用电脑上网的时候,过一段时间莫名其妙的出现自动掉线.自动断网的情况,那么遇到这个问题该怎么办?下面装机之家分享一下Win10电脑经常自动掉线.自动断网的解决方法,以Win7系统为例. ...

  3. 解决Windows Server 2012 在VMware ESXi中经常自动断网问题

    最近一些开发人员反映他们使用的 Windows server2012 R2 虚拟机过段时间就远程连接不上了,ping也不通(已关闭防火墙),我们登录ESXi发现,Windows Server 的网络图 ...

  4. 笔记本电脑连接wifi有时候会自动断网提示有限的访问权限解决办法

    解决办法如下: [设备管理器],找到[网络适配器]第一项,右键属性

  5. Ubuntu下对与rtl8723be网卡频繁断网问题解决

    linux下对于rtl系列的无线网卡,大多数网友都在吐槽,总是频繁的掉网,就此将自己在网上安装时的经验写下. 1.下载网卡驱动,其中包含rtl的大多数包 sudo apt-get install li ...

  6. C# 实现ADSL自动断网和拨号(适用于拨号用户)

    using System;using System.Runtime.InteropServices; public struct RASCONN{    public int dwSize;    p ...

  7. Ubuntu服务器断网问题解决

    原因:dns服务器没有了配置信息. 配置dns服务器          ubuntu 的dns服务器信息,放在 /etc/resolv.conf中,          添加dns服务器地址,如192. ...

  8. Delphi ADOConnection连接

    unit Unit_DM; interface usesSysUtils, Classes, DB, ADODB,inifiles,windows,forms,controls; typeTDM = ...

  9. MACBOOK 总是断网怎么办

    MACBOOK 连接 wifi 老是断网.焦躁不安 看图,二个方法,第一就搞定,

随机推荐

  1. c语言中 *p++ 和 (*p)++ 有什么区别?以及C语言运算符的优先级。整理。

    *p++是指下一个地址. (*p)++是指将*p所指的数据的值加一. C编译器认为*和++是同优先级操作符,且都是从右至左结合的,所以*p++中的++只作用在p上,和*(p++)意思一样:在(*p)+ ...

  2. java入门---基本数据类型之引用数据类型&数据类型转换

        接着上一篇文章来,这次就先看看什么是引用数据类型?首先得满足以下条件: 在Java中,引用类型的变量非常类似于C/C++的指针.引用类型指向一个对象,指向对象的变量是引用变量.这些变量在声明时 ...

  3. DevExpress通过girdcontrol实现分页

    简介:DevExpress中如何实现GridControl的分页功能, 主要是利用DataNavigator和GridControl组合,自定义事件实现分页功能 接下来,我们就去实现分页功能,先看下效 ...

  4. springBoot 中webSocket 应用一

    <html> <head> <meta charset="UTF-8"> <title>websocket测试</title& ...

  5. logback.xml日志文件配置

    放在resources目录下面就可以自动读取<?xml version="1.0" encoding="UTF-8"?> <configura ...

  6. js中call()方法和apply方法的使用

    1. 方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...

  7. MySQL高级-锁机制

    一.概述 1.定义 2.锁的分类 ①从对数据操作的类型(读\写)分 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响. 写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁 ...

  8. 聊聊WS-Federation

    本文来自网易云社区 单点登录(Single Sign On),简称为 SSO,目前已经被大家所熟知.简单的说, 就是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 举例: 我们 ...

  9. [转帖]localhost与127.0.0.1的区别

    localhost与127.0.0.1的区别 https://www.cnblogs.com/hqbhonker/p/3449975.html 前段时间用PG的时候总有问题 当时没有考虑 localh ...

  10. .net web api应用遇到的一些问题

    1.调用webapi接口时,碰到一种情况: 通过webapi调用接口时,返回的json数据,死活转换不成对象,转换的对象一直为null: webapi端代码: [HttpGet] public str ...