杭州网络科技网站,山东汽车行业网站开发,电商网站大全,自主网站解决方法一#xff1a;异常时关闭连接#xff0c;WinXP#xff0c;win7 32位大部分情况都是起作用的#xff0c;不过在有些windows操作系统下#xff08;如家庭版#xff09;不起作用#xff0c;不知为何#xff1f; try //执行sql操作 except AdoConnection.close;//… 解决方法一异常时关闭连接WinXPwin7 32位大部分情况都是起作用的不过在有些windows操作系统下如家庭版不起作用不知为何 try //执行sql操作 except AdoConnection.close;//出现异常时关闭连接在执行sql语句时会自动打开连接从而实现断线重连 end; 解决方法二ADO控件动态创建独立设置连接字符串为了避免连接不上时界面卡死可以考虑放到线程中执行。 推荐亲测有效 unit untMain;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,IniFiles, ExtCtrls, DB, ADODB,ActiveX;typeTFrmMain 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)protectedprocedure execute; override;end;
varFrmMain: TFrmMain;ConString: string;{ 初始化临界区CS变量 }CS: TRTLCriticalSection;
implementationuses untabout;{$R *.dfm}{ TForm1 }{ 写程序异常日志 }
procedure write_error_log(str: string);
varF: TextFile;mfile: string;
begintry//判断保存日志文件的目录是否存在if not DirectoryExists(ExtractFilePath(ParamStr(0)) log) thenMkDir(ExtractFilePath(ParamStr(0)) log);//按日期及时间设定保存日志的文件名mfile : ExtractFilePath(ParamStr(0)) log\ErrLog_ formatdatetime(yyyy-mm-dd, now) .txt;AssignFile(F,mfile);if not FileExists(mfile) thenRewrite(F);//如果文件不存在则创建一个新的文件并写入Append(F); //追加写入Writeln(F,str);//写入并换行CloseFile(F);exceptend;
end;
procedure TFrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin{ 清除线程CS变量 }DeleteCriticalSection(CS);Timer2.Enabled : False;end;
procedure TFrmMain.FormShow(Sender: TObject);
varclientini: TIniFile; db_server,user,password:string;
begin{ 获取ini配置信息}clientini : TIniFile.Create(.\config.ini);tryif clientininil thenbegindb_server : trim(clientini.readString(database,db_server,));user : trim(clientini.readString(database,user,sa));password : trim(clientini.readString(database,password,));
ConString : ProviderSQLOLEDB.1;Persist Security InfoFalse;User IDuser;Passwordpassword;Initial CatalogTestdb;Data Sourcedb_server;end;finallyclientini.Free;end;InitializeCriticalSection(CS);//初始化线程临界区end;procedure TFrmMain.Timer2Timer(Sender: TObject);
beginTimer2.Enabled : False;TAdoThread.Create(False);
end;
procedure TFrmMain.getXXData();
varADOStoredProc1: TADOStoredProc;
beginADOStoredProc1 : TADOStoredProc.Create(nil);//动态创建ADO控件trytryADOStoredProc1.ConnectionString : ConString;//采用独立的连接字符串if ADOStoredProc1.Active thenADOStoredProc1.Active : false;ADOStoredProc1.ProcedureName : GetData;ADOStoredProc1.Prepared : false;ADOStoredProc1.Parameters.Refresh;ADOStoredProc1.Prepared : true;ADOStoredProc1.ExecProc;excepton E:Exception dobeginwrite_error_log(FormatDateTime(yyyy-mm-dd hh:nn:ss,Now) 执行getXXData时发生异常!错误原因:E.Message);end;endfinallyADOStoredProc1.Free;end;
end;{ TAdoThread }
procedure TAdoThread.execute;
begininherited;FreeOnTerminate : True; //设置线程执行完成后自动释放{进入线程临界区}EnterCriticalSection(CS);tryCoInitialize(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/390958648Win7上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 -2147467259) then begin ADOConnection1.Connected : False; try ADOConnection1.Connected : True; except On E2: Exception do begin MessageDlg(重连数据库发生错误#13 E2.Message, mtError, [mbOK], 0); end; end; end;end;procedure TForm1.Button1Click(Sender: TObject);var sSQL: string;begin sSQL: ProviderSQLOLEDB.1;PasswordYourPassword;Persist Security InfoTrue; User IDsa;Initial CatalogYourDatabase;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; 转载于:https://www.cnblogs.com/tc310/p/5133505.html