D7中编写NT服务操作数据库的简单方法
标题: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 于穗