客户端程序启动时如果连接数据库不成功,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数据库必须解决的问题,不知高手们到底是怎样解决的?

解决方案 »

  1.   

    procedure myexception (Sender: TObject; E: Exception) ;Application.OnException := myexception;procedure myexception (Sender: TObject; E: Exception) ;
    begin
      //把異常全部放到這裏面來處理。  end;
      

  2.   


    Application  肯定是最先創建的吧。呵呵。
      

  3.   


    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;
      

  4.   

    ADOConnection Open的地方使用try except或者dpr单元在DM创建的语句处用try except也可以啊
      

  5.   

    在ADOConnection1ConnectComplete事件中捕捉异常是不对的。
    应当在active:=true;时捕捉异常
      

  6.   


    你的这些代码只能写在工程文件中吧,但方法指针委托给谁呢?
    请注意Application.OnException是一个方法指针,而 myexception是一个过程指针。两者不相容,而方法指针必须归属于某一个对象,所以在在工程dpr文件中不好做。
      

  7.   


     可能是我没有表达清楚。  onException  是一个过程指针,你查下就知道了。
     最终都会有一个最先创建的对象。对于你这边来说应该是  dataModule , 那完全可以在
      DataModule   里来处理。我这个方法肯定是有在项目中使用,不会随便写一个出来,放心。呵呵
      

  8.   

    先支持下老劉的方法,其實這樣也行
    ADOConnection Open的地方使用try except end就行
    或者dpr单元在DM创建的语句处用try except end就行
      

  9.   

    starluck 无处不在啊  
      

  10.   

    可能是我没有表达清楚。  onException  是一个过程指针,你查下就知道了。 
    最终都会有一个最先创建的对象。对于你这边来说应该是  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.
      

  11.   

    另提醒各位,用try except end捕获delphi的错误还行但捕获外部错误好象不灵。
    还有,MyException(Sender: TObject; E: Exception); 确实是一个方法
    指针而不是过程指针,即MyException只能写在某个类中。
      

  12.   

    外部错误通常是指哪些呢?有的API错误,你可能需要用  getLastError  和  formatSysErrorMessage  来处理。