客户端程序启动时如果连接数据库不成功,ADOConnection1会多次尝试连接数据库,并出现多次英文提示,令用户不快。
想把数据库连接出错的提示翻译为中文,而且只出一次提示,然后进行相应操作。
屏蔽外部程序出错一般可在主窗口上添加ApplicationEvents组件后在其onEventsException事件中捕获。
现在连接组件ADOConnection1放在DataModule1上,由于某种设计的考虑,DataModule1先于主窗口创建,因此在主窗口上添加ApplicationEvents无法捕获连接错误,因为DataModule1先于Form1创建。看来捕获错误只能在ADOConnection1的某个事件中进行。于是用类似下述代码:
procedure TDataModule2.ADOConnection1ConnectComplete(
Connection: TADOConnection; const Error: Error;
var EventStatus: TEventStatus);
begin
if EventStatus=esErrorsOccured then
begin
try
....
except
...
end;
end;
end;
还是没有办法,英文出错照出不误。
我想这个问题是做C/S数据库必须解决的问题,不知高手们到底是怎样解决的?
想把数据库连接出错的提示翻译为中文,而且只出一次提示,然后进行相应操作。
屏蔽外部程序出错一般可在主窗口上添加ApplicationEvents组件后在其onEventsException事件中捕获。
现在连接组件ADOConnection1放在DataModule1上,由于某种设计的考虑,DataModule1先于主窗口创建,因此在主窗口上添加ApplicationEvents无法捕获连接错误,因为DataModule1先于Form1创建。看来捕获错误只能在ADOConnection1的某个事件中进行。于是用类似下述代码:
procedure TDataModule2.ADOConnection1ConnectComplete(
Connection: TADOConnection; const Error: Error;
var EventStatus: TEventStatus);
begin
if EventStatus=esErrorsOccured then
begin
try
....
except
...
end;
end;
end;
还是没有办法,英文出错照出不误。
我想这个问题是做C/S数据库必须解决的问题,不知高手们到底是怎样解决的?
begin
//把異常全部放到這裏面來處理。 end;
Application 肯定是最先創建的吧。呵呵。
Function TFmLogin.DataTest:Boolean; //测试连接
var
Test:TADOConnection;
ConString:String;
begin
ConString:='';
Test:=TADOConnection.Create(nil);
Test.ConnectionTimeout:=3;
Try
Case DataType.ItemIndex of
0:begin
ConString:='Provider=SQLOLEDB.1;Password='+Trim(PassWord.Text)+';';
ConString:=ConString+'Persist Security Info=True;User ID='+Trim(UserName.Text)+';';
ConString:=ConString+'Initial Catalog='+Trim(DataName.Text)+';';
ConString:=ConString+'Data Source='+Trim(DataAddress.Text);
end;
1:begin
ConString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+Trim(DataAddress.Text)+Trim(DataName.Text)+';';
ConString:=ConString+'User ID='+Trim(UserName.Text)+';';
ConString:=ConString+'Jet OLEDB:database password='+Trim(PassWord.Text)+';';
ConString:=ConString+'Persist Security Info=False';
end;
end;
Test.LoginPrompt:=False;
Test.Connected:=False;
Test.ConnectionString:=ConString;
Test.Connected:=True;
Result:=True;
Except
Test.Connected:=False;
Result:=False;
End;
Test.Free;
end;procedure TFmLogin.TestBnClick(Sender: TObject);
begin
if Not ErrorTest Then
Exit;
if DataTest Then
Application.MessageBox('测试连接成功!','提示',0+64)
else
Application.MessageBox('测试连接失败,请检查数据库设置是否正确!','提示',0+48);
end;
应当在active:=true;时捕捉异常
你的这些代码只能写在工程文件中吧,但方法指针委托给谁呢?
请注意Application.OnException是一个方法指针,而 myexception是一个过程指针。两者不相容,而方法指针必须归属于某一个对象,所以在在工程dpr文件中不好做。
可能是我没有表达清楚。 onException 是一个过程指针,你查下就知道了。
最终都会有一个最先创建的对象。对于你这边来说应该是 dataModule , 那完全可以在
DataModule 里来处理。我这个方法肯定是有在项目中使用,不会随便写一个出来,放心。呵呵
ADOConnection Open的地方使用try except end就行
或者dpr单元在DM创建的语句处用try except end就行
最终都会有一个最先创建的对象。对于你这边来说应该是 dataModule , 那完全可以在
DataModule 里来处理。 我这个方法肯定是有在项目中使用,不会随便写一个出来,放心。呵呵
//--------------------------------------------------------------
大师就是大师,不但教你做还教你为什么这样做,技术过硬人品更好。号召星哥们向starluck学习。
在工程文件中:
program Project1;uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {DataModule2: TDataModule};{$R *.res}begin
Application.Initialize;
Application.CreateForm(TDataModule2, DataModule2);
Application.OnException:=DataModule2.MyException;//安装异常处理方法
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
在数据模块中:
unit Unit2;interfaceuses
SysUtils, Classes,Dialogs;type
TDataModule2 = class(TDataModule)
private
{ Private declarations }
public
{ Public declarations }
procedure MyException(Sender: TObject; E: Exception);//异常处理句柄
end;var
DataModule2: TDataModule2;implementation{$R *.dfm}procedure TDataModule2.MyException(Sender: TObject; E: Exception);
begin
if Pos('Database server not running',E.Message)>0 then
ShowMessage('数据库服务器没找到或服务没运行,请处理好后再连接!');
end;end.
还有,MyException(Sender: TObject; E: Exception); 确实是一个方法
指针而不是过程指针,即MyException只能写在某个类中。