dtabase.open的时候有没有什么错误提示?

解决方案 »

  1.   

    我在线程中运行该句的时候用了如下语句捕获错误:
    try
      Service.DataBase.Open;
    except
      On E : Exception do
      begin
        FStream := TFileStream.Create(.......);
        FStream.Write(E.Message);
      end;
    end;
    ....
    用文本方式得到的错误竟然是"Unknow Database";
    但是同样的设置,如果放在一个有窗体的程序中,完全正常.所以我觉得应该不可能是Database设置的问题吧?
      

  2.   

    你的Service启动前,数据库的进程启动了吗?
      

  3.   

    应该是database.connection:=true;吧
      

  4.   

    数据库的进程是启动了的,在Delphi里程序未运行的环境下,双击Database的Connect属可以连接成功.但是就是如果把它放在程序里用代码去激活就不成功.
    不知道是为什么.....
    database.connect 和database.open有什么不同吗?
      

  5.   

    你用的什么数据库?如果是SQLServer则要在Client Network Utility设置连接方式为TCP/IP才可以!!!!!!!!!!!!!!!!!!!
      

  6.   

    我用的是MySQL的数据库.
    数据库服务器跑在我的本机上,机器上把常用的几个协议都装好了的.刚才发了信给一个台湾的朋友,他告诉我说这是由于控制面板的机制造成的,很难解决,劝我要不就不要用Service,不要就不要用Database.
    但是我不用database,直接用query也是连接不上的.看来我得放弃Service,把程序写成一个没有窗体的应用程序算了,真是不爽!
      

  7.   

    不可能啊,做个ODBC,用DEPHI的数据库工具打开看看是否正常。
      

  8.   

    嘿嘿,这个我最先试的啦,在SQL Explorer里边完全正常.
    而且别说这个啦,我在未运行的Delphi IDE里边点属性页都可以改变Connect属性的值都是完全正常的.但是就是在程序里运行不正常.
    我把例子的源码贴出来,希望哪位有兴趣的可以试一试.program Project1;uses
      SvcMgr,
      Unit1 in 'Unit1.pas' {Service1: TService},
      Unit2 in 'Unit2.pas',
      Unit3 in 'Unit3.pas' {DataModule3: TDataModule};{$R *.RES}begin
      Application.Initialize;
      Application.CreateForm(TService1, Service1);
      Application.CreateForm(TDataModule3, DataModule3);
      Application.Run;
    end.
    -------------------------------------------------------------------
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
      unit2,unit3, DB, DBTables, WSSockets;type
      TService1 = class(TService)
        Database1: TDatabase;
        procedure ServiceExecute(Sender: TService);
      private
        { Private declarations }
      public
        function GetServiceController: TServiceController; override;
        { Public declarations }
      end;var
      Service1: TService1;implementation{$R *.DFM}procedure ServiceController(CtrlCode: DWord); stdcall;
    begin
      Service1.Controller(CtrlCode);
    end;function TService1.GetServiceController: TServiceController;
    begin
      Result := ServiceController;
    end;procedure TService1.ServiceExecute(Sender: TService);
    var
            Thread : TestThread;
    begin
            Thread.Create(false);
            While not terminated do
              ServiceThread.ProcessRequests(false);
            
    end;end.
    --------------------------------------------------------------------
    unit Unit2;interfaceuses
      Classes,unit3,SysUtils;type
      testThread = class(TThread)
      private
        { Private declarations }
      protected
        procedure Execute; override;
      end;implementation
      uses unit1;{ Important: Methods and properties of objects in VCL or CLX can only be used
      in a method called using Synchronize, for example,      Synchronize(UpdateCaption);  and UpdateCaption could look like,    procedure bvb.UpdateCaption;
        begin
          Form1.Caption := 'Updated in a thread';
        end; }{ bvb }procedure testThread.Execute;
    var
       DM : TDataModule3;
       F  : TFileStream;
    begin
      { Place thread code here }
       try
       Service1.Database1.Open ;
       except
       On E : Exception do
          begin
            F:=TFileStream.Create ('C:\001.log',fmCreate);
            F.Write(E.message,200);
            F.Free  ;
          end;
       end;   DM := TDataModule3.Create(Service1) ;
       DM.Query1.Close;
       DM.Query1.SQL.Clear ;
       DM.Query1.SQL.Add('select * from table');
       try
       DM.Query1.Open;
       except
         On E : Exception do
           begin
             F:=TFileStream.Create ('C:\002.log',fmCreate);
             F.Write(E.message,200);
             F.Free  ;
           end;
       end;
    end;end.
    ---------------------------------------------------------------
    unit Unit3;interfaceuses
      SysUtils, Classes, DB, DBTables;type
      TDataModule3 = class(TDataModule)
        Query1: TQuery;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      DataModule3: TDataModule3;implementation
      uses unit1;{$R *.dfm}end.
    ---------------------------------------------------------------
    其中,until1是Service程序,里边有一个Database.Until2是线程程序;Until3是一个DataModule,里边有一人Query,它的DatabaseName指向刚才的那个Database的DatabaseNmae.