D7中编写NT服务操作数据库的简单方法

来源:互联网 发布:mac os登陆界面是英文 编辑:程序博客网 时间:2024/05/29 05:57

标题:D7中编写NT服务操作数据库的简单方法

作者:JRQ

链接:http://blog.csdn.net/jrq/archive/2006/04/27/679510.aspx

1.File--New--Other--Service Application

2.File--New--Other--Thread Object

3.Thread Unit(TPostMessage)

uses ADODB, IniFiles, ActiveX;

procedure TPostMessage.WriteLog(const LogStr:String);
var F:TextFile;
begin
  if LogStr<>'' then //写日志文件
    begin
      //AssignFile(F,ExtractFilePath(paramstr(0))+'PostMessage.log');
      AssignFile(F,ExtractFilePath(ParamStr(0))+'PostMessage.log');

      if not FileExists(ExtractFilePath(ParamStr(0))+'PostMessage.log') then
         begin
           ReWrite(F);  //为写创建一个新文件;
           Writeln(F,'['+FormatDateTime('yyyy-mm-dd hh:mm:ss',now)+']: '+ LogStr);
           CloseFile(F);
         end
      else
        begin
          Append(F);
          Writeln(F,'['+FormatDateTime('yyyy-mm-dd hh:mm:ss',now)+']: '+ LogStr);
          CloseFile(F);
        end;
    end;
end;

procedure TPostMessage.CreatDBCon;
var  aConfigFile:TInifile;
begin
  //if not FileExists(ExtractFilePath(Application.ExeName)+'Config.ini') then
  if not FileExists(ExtractFilePath(ParamStr(0))+'Config.ini') then
     begin
        WriteLog('配置文件不存在,请检查。');
        Exit;
    end;

  try
     aConfigFile:=TInifile.Create(ExtractFilePath(ParamStr(0))+'Config.ini');
     ADOConn:=TADOConnection.Create(nil);
     ADOConn.ConnectionString:='Provider=OraOLEDB.Oracle.1;'+
                               'Password='+aConfigFile.ReadString('Config','DBPASS','DBPASS')+';'+
                               'Persist Security Info=True;'+
                               'User ID='+aConfigFile.ReadString('Config','DBUSER','DBUSER')+';'+
                               'Data Source='+aConfigFile.ReadString('Config','DB','ORCL')+';'+
                               'PLSQLRSet=1';

     ADOConn.LoginPrompt:=False;
     try
        ADOConn.Connected:=true;
        ADOQry:=TADOQuery.Create(nil);
        ADOQry.Connection:=ADOConn;
      except
        WriteLog('连接数据库失败。');
        Exit;
      end;
  finally
    FreeAndNil(aConfigFile);
  end;
end;


procedure TPostMessage.FreeDBCon;
begin
  FreeAndNil(ADOQry);
  FreeAndNil(ADOConn);
end;


procedure TPostMessage.Execute;
var  MessageStr:String;
begin
 Sleep(1000*60*10);//等10分钟先 ^_^ 。原因:如果服务是自启动,而DB此时可能还未启动,会造成访问异常。

 CoInitialize(nil);  //初试化COM

 CreatDBCon; //连接数据库

 while True do
   begin
      try
         ADOQry.Close;
         ADOQry.SQL.Clear;
         ADOQry.SQL.Add('Select * From Table Where 1=1 Order by FieldName');
         ADOQry.Open;

         while Not ADOQry.Eof do
           begin
              MessageStr:='LogString';
              //Other Code......
              ADOQry.Next;

              if MessageStr<>'' then //写日志文件
                 WriteLog(MessageStr);
           end; //while Not ADOQry.Eof do
       except
         WriteLog('出现异常。');
       end;
     Sleep(10000);
  end; //while True do
  FreeDBCon; //释放
  CoUninitialize;
end;

 

4.Service Application(TMain)

var PostMsg:TPostMessage;

//启动
procedure TMain.ServiceStart(Sender: TService; var Started: Boolean);
begin
   PostMsg:= TPostMessage.Create(False);
   Started := True;
end;

//停止
procedure TMain.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  PostMsg.FreeDBCon;
  PostMsg.Terminate;
  Stopped := True;
end;


procedure TMain.ServiceContinue(Sender: TService; var Continued: Boolean);
begin
  PostMsg.Resume;
  Continued := True;
end;

//暂停
procedure TMain.ServicePause(Sender: TService; var Paused: Boolean);
begin
  PostMsg.Suspend;
  Paused := True;
end;


//安装前,初试化服务
procedure TMain.ServiceBeforeInstall(Sender: TService);
var  aConfigFile:TInifile;
begin
  if not FileExists(ExtractFilePath(ParamStr(0))+'Config.ini') then
     Exit;

  try
     aConfigFile:=TInifile.Create(ExtractFilePath(ParamStr(0))+'Config.ini');
     ServiceStartName:=aConfigFile.ReadString('Config','SYSUSER','SYSUSER'); //OS用户
     Password:=aConfigFile.ReadString('Config','SYSPASS','SYSPASS');         //OS密码
  finally
    FreeAndNil(aConfigFile);
  end;
end;


5.服务安装

  Service Application中设置

  DisplayName:显示的服务名称
  ServiceStartName:系统用户
  Password:用户密码

  安装方法:在服务程序的快捷方式图标上右击,选择“属性--快捷方式”,在“目标”中加上参数" /install"。

  然后双击快捷方式运行即可安装。 参数"/uninstall"为卸载,使用方法同样。

  服务可安装成自动启动的方式,当系统启动时,会自启动运行。

  如果用户权限有问题则可能安装不成功。

  安装成功,如果在“服务”中启动失败,则需在控制面板的“服务”中右击选择“属性--登录”,勾选“本地账户系

统”,然后重新启动服务。

6.Config.ini

[Config]
DB=ORDB
DBUSER=system
DBPASS=manager
SYSUSER=THUNIS/JRQ
SYSPASS=JRQ


7.IDE Debug

可在服务的Execute中首行加上长时间sleep(),然后加入断点。

控制面板中启动服务后,选择IDE菜单"run--Attach to Process...",勾选Show System Processes,选择服务名称,

单击“Attach”进入Debug状态。

 

8.备注

使用COM 的基本原则之一,就是每个使用 COM 的线程都应该先调用 CoInitialize 或 CoInitializeEx 来初始化 COM。

在线程中操作ADO控件,需要显示执行CoInitialize()函数(uses ActiveX),如:

procedure THread.Execute;
begin
   CoInitialize(nil); //调用任何com 或ole api函数之前,必须显示调用CoInitialize进行初始化COM库
   MainFrm.ADOQry.Open;
   MainFrm.ADOQry.Close;
   CoUnInitialize();
end;


[-完-]

                                                                                        by jrq  

                                                                                       2006/04/27 于穗

原创粉丝点击