⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit4.~pas

📁 用delphi实现的一个酒店管理系统框架
💻 ~PAS
字号:
unit Unit4;

interface

uses
  Windows,Dialogs,Controls,Forms,SysUtils,Classes, DB, ADODB, RpRave,
  RpDefine, RpCon, RpConDS,Winsock,IniFiles,variants,Menus;//IniFiles用于读写INI文件

type
  TDM = class(TDataModule)
    ADOConnection1: TADOConnection;
    ADOCommand1: TADOCommand;
    ADOCommand2: TADOCommand;
    ADOCommand3: TADOCommand;
    ADOCommand4: TADOCommand;
    ADOCommand5: TADOCommand;
    ADOConnection2: TADOConnection;
    ADODataSet1: TADODataSet;
    ADOQuery1: TADOQuery;
    procedure DataModuleCreate(Sender: TObject);
    Function NewDB(DB,s1,s2:string):Boolean;
    Function DBFiles(var F1,F2:string):Boolean;
    Function KillSpID(DB:string):Boolean;
    Function CloseDB(DB:string):Boolean;
    Function OpenDB(DB,s1,s2:string):Boolean;
    Function ExistsDB(DB:string):Boolean;
    Function RenDB(DB:string):Boolean;
    Function ReadDBN():Boolean;
    Function WriteDBN():Boolean;
    Function UpDateC(var HTTP,IP1,IP2,usr,Pwd,FileName:string):Boolean;//从UpDate.Ini中读信息
    Function WriteUpDateC(HTTP,IP1,IP2,usr,Pwd,FileName:string):Boolean;//写入UpDate.Ini
  private
  public
  DBN,Serv,F1,F2,sa,pw,cns,path,NewVer:string;Local:Boolean;//本地服务器标志
  ymLeft,ymTop:single;//页面左上角坐标
  CPUname,IP,IDE,host:string;sp:Real;CPUId:Cardinal;
  end;
var DM:TDM;IniF:TIniFile;Fn:string='DBN.ini';//自动创建库参数文件
MyName:string='MIS.exe';{自动更新的源文件名}
UpdateINI:string;//默认'UpDate.Ini';//自动更新参数文件

implementation

uses Unit1, PubFun, Unit3;//指定保存库名的文件名
{$R *.dfm}
//设计时应将ADOConnection1.Connected设为False,以便在找不到默认库时不出错,调试时True
procedure TDM.DataModuleCreate(Sender: TObject);
var i:integer;OK:Boolean;s,s2:string;
Begin//
pw:='';path:=ExtractFilePath(ParamStr(0));//读不到按此默认值
UpdateINI:=path+'UpDate.Ini';
if (not ReadDBN())or not FileExists(path+Fn)then WriteDBN();
Local:=(Serv='.')or(GetIp(s)='127.0.0.1')or(CompareText(Serv,s)=0);
ADOConnection1.Close;//默认数据库参数在DBN.INI文件中
ADOConnection1.ConnectionString:=ConStr(Serv,DBN,sa,pw,Local);
i:=1;OK:=False;
While not OK do//重新试三次打开库
Try
 ADOConnection1.Open;OK:=true;
Except
 i:=i+1;//由ADOConnection2创建新库
 if i>3 then if not NewDB(DBN,F1,F2) then//三次不成功调用自动创建新空库
 Begin NewDBFail(Serv,DBN,F1,F2,sa);exit;end;
End;
ymLeft:=0.5;ymTop:=0.9;//设置默认打印左上角坐标

ADODataSet1.Close;
ADODataSet1.CommandText:='select count(*) as CN from PCInfo';
try ADODataSet1.Open;if ADODataSet1['CN']>1800 then
begin Msg1('本软件已经使用超过1800次');application.Terminate;end;
except ADOQuery1.ExecSQL;end;//若不存在PCInfo表则自动创建

sp:=GetCPUSpeed;IP:=GetIP(host);IDE:=GetIdeSerialNumber();
CPUId:=GetCpuID(CPUname);//保存IP,主机名,CPU厂商,cpuID,硬盘系列号
try s2:=Format('%u',[CPUId]);except s2:='0';end;
s:='Insert into PCInfo(IP,Host,Pname,CPUId,CpuSp,ds,LogTime) values('''+IP;
s:=s+''','''+host+''','''+CPUname+''','''+s2+''','+floattostr(sp)+','''+IDE;
s:=s+''',GetDate())';
ADOQuery1.SQL.Clear;ADOQuery1.SQL.Add(s);
ADOQuery1.ExecSQL;//保存IP,主机名,CPU厂商,cpuID,硬盘系列号

ADODataSet1.Close;
ADODataSet1.CommandText:='select 软件,版本 from 当前 where 软件='''+MyName+'''';
ADODataSet1.Open;s:=Form1.UpDate.Caption;
if (ADODataSet1.RecordCount=0)or(ADODataSet1['版本']=null)or(ADODataSet1['版本']<s)then
Begin
 if ADODataSet1.RecordCount=0 then
 Begin ADODataSet1.Append;ADODataSet1['软件']:=MyName;End else
 ADODataSet1.Edit;ADODataSet1['版本']:=s;ADODataSet1.Post;
end
else
 if ADODataSet1['版本']>s then
  Begin
  NewVer:=ADODataSet1['版本'];Form1.UpDateMe0.Enabled:=true;
  Form1.UpDateMe1.Enabled:=true;
  Form1.UpDateMe2.Enabled:=true;msg1('当前版本太低,请更新本软件!');
  end;

ADODataSet1.Filtered:=false;
Form3.N7.Clear;
while not ADODataSet1.Eof do//添加服务器所有可以自动更新的文件名
begin
s:=ADODataSet1['软件'];
Form3.N7.Add(NewItem(s,0,False,true,Form3.N7Click,0,
'N52RJ'+inttostr(ADODataSet1.RecNo+900)));
ADODataSet1.Next;
end;

End;

Function TDM.NewDB(DB,s1,s2:string):Boolean;
var s:string;
Begin//创建一个新的空库,库名DB指定,文件名s1和s2指定
Result:=True;
if Local then
if FileExists(s1) and FileExists(s2) then//若要在本地创建先判断是否已存在文件
Begin Result:=OpenDB(DB,s1,s2);exit;end;//若两库文件名都存在则直接打开它
while FileExists(s1) or FileExists(s2) do//若一库文件名已存在则加后缀作为新库名
Begin s1:=s1+'.Mdf';s2:=s2+'.Ldf';End;
ADOConnection2.close;
ADOConnection2.ConnectionString:=ConStr(Serv,'master',sa,pw,Local);
ADOConnection2.Open;
s:='Create Database '+DB+' On Primary(Name=Dat,Filename=''';
s:=s+s1+''') Log On(Name=DatL,FileName='''+s2+''')';
Try
ADOCommand1.Connection:=ADOConnection2;//关库时连ADOConnection1
ADOCommand1.CommandText:=s;ADOCommand1.Execute;//创建数据库
ADOConnection2.DefaultDatabase:=DB;ADOCommand2.Execute;//创建所有表
ADOCommand3.Execute;ADOCommand4.Execute;ADOCommand5.Execute;
Except//创建三个触发器,若有多个触发器,可添加多个ADOCommand组件并在此执行
Result:=False;
End;
End;

Function TDM.DBFiles(var F1,F2:string):Boolean;
Begin//读取当前库文件名,通过调用参数F1和F2返回
Result:=True;Try
ADODataSet1.Close;
ADODataSet1.CommandText:='select f=rtrim(filename) from sysfiles';
ADODataSet1.Open;F1:=ADODataSet1.FieldValues['f'];Self.F1:=F1;
ADODataSet1.Next;F2:=ADODataSet1.FieldValues['f'];Self.F2:=F2;
ADODataSet1.Close;//读当前库文件名
Except Result:=false;End;
End;

Function TDM.KillSpID(DB:string):Boolean;//断开连接当前DB指定库的进程
Begin
ADOConnection1.DefaultDatabase:='master';//切换到master库
Result:=True;ADODataSet1.Close;ADODataSet1.CommandType:=cmdStoredProc;
ADODataSet1.CommandText:='sp_who';//读还连到当前DB指定库的spid
ADODataSet1.Open;
ADODataSet1.Filter:='dbname='''+DB+'''';ADODataSet1.Filtered:=true;

ADOCommand1.Connection:=ADOConnection1;//建库时连ADOConnection2
while not ADODataSet1.Eof do//断开连接当前DB指定库的进程
begin
ADOCommand1.CommandText:='kill '+inttostr(ADODataSet1.FieldValues['spid']);
Try
ADOCommand1.Execute;
except
showmessage('无法断开部分进程对数据库的连接,请重新登录!');Result:=false;exit;
end;//Try
ADODataSet1.Next;
end;//while
ADODataSet1.Filtered:=false;ADODataSet1.Filter:='';
ADODataSet1.Close;ADODataSet1.CommandType:=cmdText;
End;

Function TDM.CloseDB(DB:string):Boolean;//关闭DB指定数据库
Begin
Result:=KillSpID(DB);//断开进程对DB指定库的连接
ADOCommand1.CommandText:='sp_detach_db '+DB;//分离DB指定数据库
try
ADOCommand1.Execute;
Except
showmessage('无法分离数据库,请重新登录!');Result:=false;exit;
end;
if DB<>DBN then ADOConnection1.DefaultDatabase:=DBN;//恢复为原来数据库
End;//CloseDB

Function TDM.OpenDB(DB,s1,s2:string):Boolean;//打开DB指定库
Begin
Result:=True;Try
ADOConnection1.Close;
ADOConnection1.ConnectionString:=ConStr(Serv,'master',sa,pw,Local);
ADOConnection1.Open;//连接主库master
ADOCommand1.Connection:=ADOConnection1;//建库时连ADOConnection2
ADOCommand1.CommandText:='sp_attach_db '+DB+','''+s1+''','''+s2+'''';
ADOCommand1.Execute;//附加指定文件为当前库
ADOConnection1.DefaultDatabase:=DB;//切换到DB指定库
Except Result:=False;end;
End;

Function TDM.ExistsDB(DB:string):Boolean;//判断DB指定库名是否存在
Begin
ADOConnection1.Close;
ADOConnection1.ConnectionString:=ConStr(Serv,'master',sa,pw,Local);
ADOConnection1.Open;//连接主库master
ADODataSet1.Close;
ADODataSet1.CommandType:=cmdStoredProc;//读当前有哪些库名,不是文件名
ADODataSet1.CommandText:='sp_databases';
ADODataSet1.Open;
ADODataSet1.Filter:='DATABASE_NAME='''+DB+'''';
ADODataSet1.Filtered:=true;
Result:=ADODataSet1.RecordCount>=1;
ADODataSet1.Filter:='';ADODataSet1.Filtered:=False;
End;

Function TDM.RenDB(DB:string):Boolean;
Begin//将当前DBN指定库名改为DB指定库名并将连接切换到新库名
Result:=KillSpID(DBN);//断开进程对DBN指定库的连接
Try
ADOCommand1.CommandText:='sp_renamedb '+DBN+','+DB;
ADOCommand1.Execute;//将当前DBN指定库名改为DB指定库名
ADOConnection1.DefaultDatabase:=DB;//将连接切换到DB指定的新库名
Except  Result:=False;End;
End;

Function TDM.ReadDBN():Boolean;//从Fn指定的文本文件DBN.ini中读入库名到DBN
Begin//数据库参数不存在按默认值
Result:=True;Try
if IniF=nil then IniF:=TIniFile.create(ExtractFilePath(ParamStr(0))+Fn);
DBN:=IniF.Readstring('数据库参数','库名','JD');//读入库名
F1:=IniF.Readstring('数据库参数','主文件名','E:\JD.MDF');//读入主文件名
F2:=IniF.Readstring('数据库参数','从文件名','E:\JD.LDF');//读入日志文件名
Serv:=IniF.Readstring('数据库参数','服务器名','.');//读入服务器名
Sa:=IniF.Readstring('数据库参数','用户名','tmg');//读入用户名
IniF.Free;IniF:=nil;
Except Result:=False;End;
End;

Function TDM.WriteDBN():Boolean;//将DBN指定库名写入Fn指定的文本文件DBN.ini
Begin
Result:=True;Try
if IniF=nil then IniF:=TIniFile.create(path+Fn);
IniF.WriteString('数据库参数','库名',DBN);//写入库名
IniF.WriteString('数据库参数','主文件名',F1);//写入主文件名
IniF.WriteString('数据库参数','从文件名',F2);//写入日志文件名
IniF.WriteString('数据库参数','服务器名',Serv);//写入服务器名
IniF.WriteString('数据库参数','用户名',Sa);//写入用户名
IniF.Free;
Except Result:=False;End;
End;

Function TDM.UpDateC(var HTTP,IP1,IP2,usr,Pwd,FileName:string):Boolean;//从UpDate.Ini中读信息
var IniF:TIniFile;
Begin//更新参数不存在按默认值  
Result:=True;Try
IniF:=TIniFile.create(UpdateINI);//UpDate.Ini
HTTP:=IniF.Readstring('更新参数','HTTP','HTTP://218.5.241.13/cms/ks/ksap.rar');//读入IP1
IP1:=IniF.Readstring('更新参数','IP1','169.254.216.64');//读入IP1
IP2:=IniF.Readstring('更新参数','IP2','127.0.0.1');//读入IP2
usr:=IniF.Readstring('更新参数','用户名','Anonymous');//读入用户名
Pwd:=IniF.Readstring('更新参数','口令','');//读入口令
FileName:=IniF.Readstring('更新参数','文件名',MyName);//读入文件名
IniF.Free;//IniF:=nil;
Except Result:=False;End;
End;

Function TDM.WriteUpDateC(HTTP,IP1,IP2,usr,Pwd,FileName:string):Boolean;//写入UpDate.Ini
Begin
Result:=True;Try
if IniF=nil then IniF:=TIniFile.create(UpdateINI);
IniF.WriteString('更新参数','HTTP',HTTP);//写入HTTP
IniF.WriteString('更新参数','IP1',IP1);//写入IP1
IniF.WriteString('更新参数','IP2',IP2);//写入IP2
IniF.WriteString('更新参数','用户名',usr);//写入用户名
IniF.WriteString('更新参数','口令',pwd);//写入口令
IniF.WriteString('更新参数','文件名',FileName);//写入文件名
IniF.Free;
Except Result:=False;End;
End;

initialization
//
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -