主要是要避免人工介入。一旦弹出错误提示,如果没有人工介入把它关掉,则程序会一直停在那里,无法自动重新连接。
在连接的时候虽然加入了try....except保护,但还是无法避免在操作数据库中数据时网络连接突然断掉或数据库服务被关闭时弹出错误提示。
曾经看到过可以在Application的某个事件中进行处理,但现在检索不到
在连接的时候虽然加入了try....except保护,但还是无法避免在操作数据库中数据时网络连接突然断掉或数据库服务被关闭时弹出错误提示。
曾经看到过可以在Application的某个事件中进行处理,但现在检索不到
解决方案 »
- 谁有使用vfw.pas实现网络传输audio的代码,高分求购?????
- Delphi的 TShockwaveFlash 控件
- 求:谁用过mshtml单元通过webbrower控件提取网页源码及元素和属性?
- 实现在DBGRID里把多选的行插入到另一个表的问题!!
- 我怎么得到某一个表中的某一数据类型 字段大小 默然值的
- 怎么实现控制面板当中的添加windows组件功能!!!是哪个api函数
- 怎样改变messagebox输出的对话框中的按钮上的文字?一定给分!
- 急!用Delphi如何读写文件的创建、修改、访问日期和时间?
- 请问那里有dephi程序的下载_dephi菜鸟
- delphi对excel表格的调用问题?
- VC中的!非 和 && || 符号对应 delphi 中该如何写?
- delphi用ado组件连接sql server2005,哪位有这方面的视频没
每个open/excesql/...都加上try...except显然不好实现,自己想办法写一个方法能通用的,然后供其它的单元调用然后只在此方法内try...except就行了,连接失败就锁定程序再启动检测,多长时间或者多少次也连接不成功就退出程序,不过要区别是SQL语句语法错误还是ADO连接失败,可以再嵌套一个try...except,如: try
adoquery1.open;
except
on e:exception do
begin
showmessage('执行语句失败,原因:'+e.message);
try
adoconnection1.Connected:=false;
adoconnection1.Connected:=true;
except
on e:exception do
begin
{showmessage('连接数据库失败,原因:'+:e.message);
这里调用另一方法启动检测(方法内是循环/延时}
end;
end;
end;
end;
{初始化时Timer的enable为false}
procedure TDataModule1.TimerTimer(Sender:TObject);
begin
OpenLink; {用户重新连接数据库}
end;procedure TDataModule1.OpenLink;
var
ini:Tinifile;
s,DSource,dbname,uname,pword:string;
begin
Timer.Enabled:=false;
ledform.label1.Caption:='正在重新连接数据库......'; ini:=Tinifile.Create(extractfilepath(paramstr(0))+'DataConnect.ini');
try
DSource:=ini.ReadString('DataBase','Server','192.168.0.1');
dbname:=ini.ReadString('DataBase','DB','Message');
uname:=ini.ReadString('DataBase','UName','user');
pword:=ini.ReadString('DataBase','PW','12345');
finally
ini.Free;
end;
s:='Provider=SQLOLEDB.1;Persist Security Info=True;';
s:=s+'Data Source='+DSource;
s:=s+';User ID='+uname;
s:=s+';Password='+pword;
s:=s+';Initial Catalog='+dbname; try
ADOConnection1.Close;
ADOConnection1.ConnectionString:=s;
ADOConnection1.Open;
ledform.label1.Visible:=false;
except
ledform.label1.Caption:=‘连接数据库失败!10秒后重试!';
Timer.Interval:=10000;
Timer.Enabled:=true;
end;
end;{数据库操作}
function TDataModule1.GetSD(Sid: Integer;ppn:Integer):string;
begin
try
with WSD do
begin
Close;
SQL.Clear ;
SQL.Add('select * from led_kongtiao_View');
SQL.Add(' where ITEM_ID='+inttostr(Sid));
Open; if RecordCount>0 then
begin
if (FieldByName('ITEM_VALUE').IsNull) or (FieldByName('ITEM_VALUE').AsString='') then
SD[ppn]:='---'
else
SD[ppn]:=Dl(FieldByName('ITEM_VALUE').AsFloat)+'%';
end;
end;
except
on E: Exception do
Result := E.Message;
end;
end;{判断数据库操作是否成功}
function Tledform.GetDB: string;
var
str:string;
begin
Result:='';
str:=DataModule1.GetSD(1,1);
if str<>'' then
{重新连接数据库,具体可根据自己的实际情况来处理!}
DataModule1.timer.enable:=true;
else
{正常连接数据库,无操作}
end;