procedure TfrmTest.a;
var
  cn: TOraSession;
  qry: TOraQuery;
  UserName, Password, IP, SID: string;
begin
//CoInitialize(nil);
  showmessage('1');
  cn := TOraSession.Create(nil);
  showmessage('2');
  qry := TOraQuery.Create(nil);
  showmessage('3');
  UserName := 'report001';
  Password := 'report001';
  IP := '59.151.4.116';
  SID := 'imeter';
  showmessage('4');
  cn.ConnectString := Format('%s/%s@%s:1521:%s', [UserName, Password, IP, SID]);
  showmessage(cn.ConnectString);
  //cn.Connected := True;
  qry.Session := cn;
  showmessage('7');
  qry.Close;
  qry.SQL.Clear;
  showmessage('8');
  qry.SQL.Add('select * from content02');
  showmessage('9');
  qry.Open;
  showmessage('10');
  qry.First;
  showmessage('11');
  showmessage(qry.FieldByName('name').AsString);
  cn.Free;
  qry.Free;
   //CoUnInitialize();
end;线程函数
procedure TMusic.Execute;
var
  sTime: string;
  frmTest: TfrmTest;
begin
  while True do
  begin
    frmTest := TfrmTest.Create();
    frmTest.a;//这是一个数据库的操作函数    sleep(2000);  end;
end;我在一个线程对象中调用了一个操作数据库的对象TOraQuery 来操作数据库,操作数据库的那段代码在应用程序中是可以跑通的.但是在服务程序中调它的时候,只有showmessage('9'),就是说qry.open的时候就报错了...请问这个问题该如何解决...

解决方案 »

  1.   

    //cn.Connected := True;你的cn没有连接到数据库啊
      

  2.   

    写服务程序用一个log文件来记录运行情况这样比较好,你可以把异常写到日志里,我这里有一个你参考一下吧unit LogMgr;interfaceuses
      Classes, Windows, SysUtils, RegistryMgr;const
      mtErr     = '[Error]';
      mtHint    = '[Hint]';
    type
      TLogMgr = class(TObject)
      private
        FLogFilePath :String;
      public
        procedure setLog(aMessageNo:string; aMessage:string);
      end;implementation{ TLogMgr }procedure TLogMgr.setLog(aMessageNo: string; aMessage: string);
    var
      FHandle:THandle;
      m_RegMgr :TRegistryManager;
    begin
      m_RegMgr :=TRegistryManager.Create;
      FLogFilePath:=ExtractFilePath( m_RegMgr.sts_Log )+'sm.log';
      m_RegMgr.Destroy;
      aMessage:='['+FormatDateTime( 'yyyy-mm-dd hh:mm:ss',now )+'] '+aMessageNo+' :'+aMessage+#10#13;
      FHandle:=FileOpen( FLogFilePath, fmOpenWrite or fmShareDenyNone );
      FileSeek( Fhandle, 0, 2 );
      FileWrite( Fhandle, aMessage[ 1 ], length( aMessage ) );
      FileClose( FHandle );
    end;end.
      

  3.   

    //cn.Connected := True; 这句话在应用程序中不写也没问题.
    我写上这句话,程序到这就不走了..
      

  4.   

    哈哈..我搞定了...原来是 //cn.Connected := True;这句话前要加句,cn.Options.net := True; 晕......了,感谢帮忙的朋友.送分.