深圳全飞鸿

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1025|回复: 3
打印 上一主题 下一主题

mysqlest让程序更好的管理数据库session

[复制链接]

104

主题

171

帖子

1177

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1177
跳转到指定楼层
楼主
发表于 2019-6-25 22:52:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先使用在XC看板程序

创建:
  1. procedure TDataModule2.DataModuleCreate(Sender: TObject);
  2. var
  3.   user:string;
  4. begin
  5.   getExeInfo;
  6.   self.MyConnection1.Server:= SYS_SFC_001_INC.getHostIP;
  7.   self.MyConnection1.Username:=SYS_SFC_001_INC.getUserName;
  8.   self.MyConnection1.Password:=SYS_SFC_001_INC.getPasswrod;
  9.   self.MyConnection1.Options.Charset:='gbk';
  10. end;
复制代码


session需要用到的程序相关信息:
  1. procedure TDataModule2.getExeInfo;
  2. begin
  3.    strPath:=application.exename;
  4.    strExename:=extractfilename(strPath);
  5.    strExe:= Copy(strExename, 1, Length(strExename) - Length(ExtractFileExt(strExename)));
  6.    strVersion:='0.0.0.0';
  7.    try
  8.      strVersion:=getVersion(strPath);
  9.    except
  10.    end;
  11. end;
复制代码


其中用到的getVersion参考:delphi获取程序版本的实现标准getVersion

添加session功能函数:
  1. function TDataModule2.sessionstart(isJustone: boolean): string;
  2. begin
  3.   with  SELF.PRO_CHECK_SESSION   do
  4.   begin
  5.      close;
  6.      StoredProcName:='SYANT.SESSION_START';
  7.      preparesql;
  8.      ParambyName('P_EXE').Asstring :=strExename;
  9.      ParambyName('P_VERSION').Asstring :=strVersion;
  10.      ParambyName('P_PATH').Asstring :=rightstr(strPath,150);
  11.      ParambyName('P_JUSTONE').AsBoolean:=isJustone ;
  12.      try
  13.        ExecProc;
  14.        result:=ParambyName('RES').AsString;
  15.      except
  16.        on e:exception do
  17.        begin
  18.          result:=e.Message;
  19.        end
  20.      end;
  21.      AgileLog.writelog('sessionstart: '+result);
  22.   end;
  23. end;
复制代码

  1. function TDataModule2.sessionstop(isJustone: boolean): string;
  2. begin
  3.   with  SELF.PRO_CHECK_SESSION   do
  4.   begin
  5.      close;
  6.      StoredProcName:='SYANT.SESSION_STOP';
  7.      preparesql;
  8.      ParambyName('P_EXE').Asstring :=strExename;
  9.      ParambyName('P_VERSION').Asstring :=strVersion;
  10.      ParambyName('P_PATH').Asstring :=rightstr(strPath,150);
  11.      ParambyName('P_JUSTONE').AsBoolean:=isJustone;
  12.      try
  13.        ExecProc;
  14.        result:=ParambyName('RES').AsString;
  15.      except
  16.        on e:exception do
  17.        begin
  18.          result:=e.Message;
  19.        end
  20.      end;
  21.   end;
  22.   AgileLog.writelog('sessionstop: '+result);
  23. end;
复制代码



绑定事件:
  1. procedure TDataModule2.MyConnection1AfterConnect(Sender: TObject);
  2. begin
  3.   if(MyConnection1.Tag=0)then
  4.   begin
  5.     MyConnection1.Tag:=1;
  6.     try  //在东莞XC的实践证明:这里会有死循环 ,会在syant.z_session中产生巨量的数据
  7.       //self.MyConnection1.ExecSQL('SET sql_log_bin=0',[]);
  8.       strCheckVersion:=sessionstart(true);
  9.     finally
  10.       MyConnection1.Tag:=0;
  11.     end;
  12.   end;
  13. end;
复制代码


导出功能函数:
  1. function TDataModule2.checkVersion: string;
  2. begin
  3.   with  SELF.PRO_CHECK_VERSION   do
  4.   begin
  5.      close;
  6.      StoredProcName:='SFC.CHECK_AP_VERSION';
  7.      preparesql;
  8.      ParambyName('P_EXE').Asstring :=strExe;
  9.      ParambyName('P_VERSION').Asstring :=strVersion;
  10.      ParambyName('P_PATH').Asstring :=rightstr(strPath,150);
  11.      try
  12.        ExecProc;
  13.        result:=ParambyName('RES').AsString;
  14.      except
  15.        on e:exception do
  16.        begin
  17.          result:=e.Message;
  18.        end
  19.      end;
  20.      AgileLog.writelog('sessionstart: '+result);
  21.   end;
  22. end;
复制代码


使用方法:
procedure TForm1.FormShow(Sender: TObject);
var
  str:string;
begin
  str:=frmDM.DataModule2.checkVersion;
  if(str='OK')then
  begin
     ...

回复

使用道具 举报

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
沙发
发表于 2019-10-20 00:40:29 | 只看该作者
总结一下:


引用头添加:
SYS_SFC_001_INC, windows, StrUtils, dialogs;


public下添加以下函数定义:
  1.     procedure getExeInfo;
  2.     function checkVersion:string;
  3.     function sessionstart(isJustone:boolean):string;
  4.     function sessionstop(isJustone:boolean):string;
  5.     function getVersion(myappname:string):string;
复制代码



定义内部变量:
{$R *.dfm}
var
  strPath,strExe,strExename,strVersion:string;


function getVersion(myappname:string):string;
的定义在:http://www.nagomes.com/disc/foru ... d&tid=228&fromuid=1


事件添加:
    procedure DataModuleCreate(Sender: TObject);
    procedure MyConnection1AfterConnect(Sender: TObject);


  1. procedure TDataModule2.MyConnection1AfterConnect(Sender: TObject);
  2. begin
  3.   if(MyConnection1.Tag=0)then
  4.   begin
  5.     MyConnection1.Tag:=1;
  6.     try  //在东莞XC的实践证明:这里会有死循环 ,会在syant.z_session中产生巨量的数据
  7.       //self.MyConnection1.ExecSQL('SET sql_log_bin=0',[]);
  8.       strCheckVersion:=sessionstart(true);
  9.     finally
  10.       MyConnection1.Tag:=0;
  11.     end;
  12.   end;
  13. end;
复制代码



回复 支持 反对

使用道具 举报

228

主题

466

帖子

2184

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2184
板凳
发表于 2019-11-4 09:50:24 | 只看该作者
建议把以下功用也加上:

  1.     function checkPrivilege(exe,fun,emp:string):boolean;
  2.     function checkPrivilegeExist(exe,fun:string):boolean;
  3.     function getValidSql(sql:string):string;
复制代码



PACK_CTN.exe已加入



function TDataModule1.checkPrivilege(exe, fun, emp: string): boolean;
var
    mysql:string;
    myday:string;
begin
  mysql:='select 1 from sfc.c_privilege where prg_name='''+exe+''' and fun='''+fun+''' and  emp='''+emp+''' and privilege=2 ';
  mysql:=getValidSql(mysql);
  self.MyQuery5.Close;
  self.MyQuery5.SQL.Text:=mysql;
  self.MyQuery5.Open;
  result:=not self.MyQuery5.Eof;
  self.MyQuery5.Close;
end;

function TDataModule1.checkPrivilegeExist(exe, fun: string): boolean;
var
    mysql:string;
    myday:string;
begin
  mysql:='select 1 from sfc.c_privilege where prg_name='''+exe+''' and fun='''+fun+''' and privilege=2 limit 1 ';
  mysql:=getValidSql(mysql);
  self.MyQuery5.Close;
  self.MyQuery5.SQL.Text:=mysql;
  self.MyQuery5.Open;
  result:=not self.MyQuery5.Eof;
  self.MyQuery5.Close;
end;

//做一下简单的防SQL代码注入
function TDataModule1.getValidSql(sql: string): string;
begin
  //注意,单引号应该在输入框过滤掉!
  result:=sql;
  AgileStrings.MyReplaceString(result,';','',false);
  AgileStrings.MyReplaceString(result,'-- ','',false);
end;
回复 支持 反对

使用道具 举报

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
地板
发表于 2020-3-29 23:40:19 | 只看该作者
本帖最后由 zhgc 于 2020-4-3 14:22 编辑

再次总结:从pack_ctn 复制到 onllineprint
1. 复制5个函数:
    function getVersion(myappname: string): string;
    procedure getExeInfo;
    function checkVersion:string;
    function sessionstart(isJustone:boolean):string;
    function sessionstop(isJustone:boolean):string;

2. 定义MyConnection1AfterConnect

3. 定义变量
var
  strPath,strExe,strExename,strVersion:string;

4.改写create
procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
  getExeInfo;

5.复制两个Sp控件
6.
procedure TForm1.FormShow(Sender: TObject);
begin
   if(frmdm.DataModule1.checkVersion <>'OK')then
   begin
      Panel5.Visible:=true;
   end else Panel5.Visible:=false;

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|nagomes  

GMT+8, 2025-5-5 02:02 , Processed in 0.027348 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表