SQL工厂法

表結構:

exeno  caption  params                             sqlcommand                                                             tablename

201     登錄        @loginname ftsring(20)    select * from user where loginname=:loginname    user

 

//author: cxg

unit MySQL;

interface

uses
  SysUtils, ADODB, uFunction;

type
  TMySQL = class(TObject)
  private
    fExeNo: Integer;
    fCaption: string;
    fParams: string;
    fSqlcommand: string;
    fTablename: string;
    fQry: TADOQuery;
    fValueArr: array[0..49] of Variant;  //最多支持50个参数
    procedure SetExeNo(Value: integer);
  protected

  public
    constructor Create;
    destructor Destroy; override;
    procedure AddParam(const aValue: Variant);
    //说明: 添加参数值
    //参数: const aValue: Variant -- 参数值
    function GetData: _Recordset;  //非事务性查询
    procedure ExeSQL;              //事务性操作
    procedure BeginTrans;          //开始事务
    procedure CommitTrans;         //提交事务
    procedure RollbackTrans;       //回滚事务
    property ExeNo: Integer read fExeNo write SetExeNo;  //SQL执行序号
  end;

implementation

{ TMySQL }

procedure TMySQL.AddParam(const aValue: Variant);
begin
  fValueArr[fQry.Parameters.Count] := aValue;  
  fQry.Parameters.AddParameter;
end;

procedure TMySQL.BeginTrans;
begin
  fQry.Connection.BeginTrans;
end;

procedure TMySQL.CommitTrans;
begin
  fQry.Connection.CommitTrans;
end;

constructor TMySQL.Create;
begin
  inherited;
  fQry := TADOQuery.Create(nil);
  fQry.Connection := uFunction.GetConnection;
end;

destructor TMySQL.Destroy;
begin
  FreeAndNil(fqry);
  inherited;
end;

procedure TMySQL.ExeSQL;
var
  i: Integer;
begin
  with fQry do
  begin
    Close;
    SQL.Clear;
    SQL.Text := fSqlcommand;
    if Parameters.Count > 0 then
      for i := 0 to Parameters.Count - 1 do
        Parameters[i].Value := fValueArr[i];
    ExecSQL;   
  end; 
end;

function TMySQL.GetData: _Recordset;
var
  i: Integer;
begin
  Result := nil;
  with fQry do
  begin
    Close;
    SQL.Clear;
    SQL.Text := fSqlcommand;
    if Parameters.Count > 0 then
      for i := 0 to Parameters.Count - 1 do
        Parameters[i].Value := fValueArr[i];
    Open;
    Result := fQry.Recordset;
  end;
end;

procedure TMySQL.RollbackTrans;
begin
  fQry.Connection.RollbackTrans;
end;

procedure TMySQL.SetExeNo(Value: integer);
var
  aQry: TADOQuery;
begin
  fQry.Parameters.Clear;
  fExeNo := Value;
  aQry := TADOQuery.Create(nil);
  aQry.Connection := uFunction.getconnection;
  with aQry do
  begin
    Close;
    SQL.Clear;
    SQL.Text := 'select * from [sql] where [exeno]=:exeno';
    Parameters.ParamByName('exeno').Value := fExeNo;
    Open;
    if not IsEmpty then
    begin
      fCaption := FieldByName('caption').AsString;
      fParams := FieldByName('params').AsString;
      fSqlcommand := FieldByName('sqlcommand').AsString;
      fTablename := FieldByName('tablename').AsString;
    end;
  end;
  aQry.Free;
end;

end.

 

 

客户端只需要写执行号,和参数

客户端完全没有sql语句 

MySQL := TMySQL.Create;

  MySQL.ExeNo := 201;

  MySQL.AddParam(Trim(Edit_LoginName.Text));

  MySQL.AddParam(Trim(Edit_LoginPW.Text));

  DS.Data := MySQL.GetData;

  

直接写sql就是胖客户

首先安全性差

其次维护不方便

我换个数据库,我的服务端和客户端都不需要更改

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252571.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于深度学习和传统算法的人体姿态估计,技术细节都讲清楚了

计算机视觉的一大研究热点是人体姿态估计,还有很多问题急需解决,比如遮挡,交互等等。在最近的CVPR2020里边也有很多这方面的工作。本文站长主要是想谈谈基于深度学习的实时多人姿态估计。 人体姿态估计要干嘛? 关于人类活动规律的…

一些linux知识和http知识

一些linux知识和http知识 1 yum安装比源码编译安装 有的模块不能自定义安装 只能安装默认的模块进行安装 2 关于php的fastcgi 如果使用fastcgi 那么需要启动服务 如果不使用fastcgi 那么不需要启动这个服务 3 一个完整的HTTP解析路径 用户浏览器比如访问www.123.com/index.…

杨浦区阜盛农民工子弟小学见闻

天气有些阴沉,起了个大早,一个小时奔波后来到了这里…… 大门口: 校领导: 有些破旧的校舍和阴沉的天空下祖国的希望: 同上,希望…… 期待的目光: 顽皮的笑脸,排着队也要调皮&#xf…

《构建之法》7

十五章讲的是稳定和发布阶段。软件生命周期的最后阶段往往是最考验团队的。从代码完成到最终发布软件,需要经历:完成代码、集成测试、Bug修复、Alpha发布、DCR Bug修复、Beta发布、外部测试、RTO等。软件团队的各个角色代表,组成会诊小组。对…

人体姿态估计算法之open pose

一,openpose是一种自底向上的算法: OpenPose人体姿态识别项目是美国卡耐基梅隆大学(CMU)基于卷积神经网络和监督学习并以Caffe为框架开发的开源库。可以实现人体动作、面部表情、手指运动等姿态估计。适用于单人和多人&am…

python练习5

import re from datetime import datetime, timezone, timedeltadef to_timestamp(dt_str, tz_str):# 时间dt_now datetime.strptime(dt_str, %Y-%m-%d %H:%M:%S)#时区tz_num int(re.match(\w{3}([|-]\d):00,tz_str).groups()[0])tz_utc timezone(timedelta(hours tz_num))…

抢火车票这个事吧,其实我也能做!(python黑科技)

2019独角兽企业重金招聘Python工程师标准>>> 又是一年,马上就要回家过年了,还没有买到票的小伙伴们是否已经像热锅上的蚂蚁了无脑的开始找黄牛了? 俗话说的好,求人不如求自己,抢票这玩意,其实我觉得我也可…

用 Python+openpose 实现抖音尬舞机

游戏开始后,随着音乐会给出不同的动作提示,用户按照提示摆出正确动作即可得分。援引官方说法,“尬舞机”主要应用了今日头条 AI Lab 自主开发的“人体关键点检测技术”,依靠这项技术,抖音能够检测到图像中所包含人体的…

PHP获取中文字符拼音首字母

在项目中遇到需要把游戏进行字母排序,于是百度到一个格式化的首字母的方法。 /*** name php获取中文字符拼音首字母* param $str* return null|string*/public function getFirstCharter($str){if (empty($str)) {return ;}$fchar ord($str{0});if ($fchar > or…

Array类型

一、转换方法 toString() 调用数组的toString()方法会返回由数组中每个值的字符串形式拼接而成的一个以逗号分割的字符串 valueOf() 返回的还是数组 实际上,为了创建这个字符串会调用数组每一项的toString()方法 二、栈方法 push() pop() 只发生在栈的顶部 三…

Create a Service Catalog Request via REST API

http://wiki.servicenow.com/index.php?titleUseful_Catalog_Scripts#Eureka http://wiki.servicenow.com/index.php?titleService_Catalog_Script_API#gsc.tab0 Service Catalog APIhttps://docs.servicenow.com/bundle/istanbul-servicenow-platform/page/integrate/inboun…

MYSQL和JAVA(课堂笔记)

MYSQL  数据库管理工具 JAVA    编程语言 数据库驱动(JAVA和MYSQL对接方式) 到官网上下载驱动    加载驱动 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement;public class S…

解密昇腾AI处理器--Ascend310简介

Ascend310 AI处理器规格 Ascend310 AI处理器逻辑架构 昇腾AI处理器本质上是一个片上系统(System on Chip,SoC),主要可以应用在和图像、视频、语音、文字处理相关的应用场景。其主要的架构组成部件包括特制的计算单元、大容量的存储…

银盒子扫码下单在线订单开启商品售卖时段使用说明

1,登陆管理员账号,子账号下,配置管理--店铺配置--扫码下单Tab页,是否开启商品售卖时段,选择“是” 2,在商家后台登陆相应的子账号,在店铺管理--商品售卖时段里配置售卖时间以及相应时段售卖的商…

使用pandas时遇到ValueError: numpy.dtype has the wrong size, try recompiling

[问题]使用pandas时遇到ValueError: numpy.dtype has the wrong size, try recompiling [原因] 这是因为 Python 包的版本问题,例如安装了较旧版本的 Numpy,但安装了较新版本的 Pandas。 [解决方法] 查看Numpy版本号 python -c "import numpy; prin…

『Python基础-12』各种推导式(列表推导式、字典推导式、集合推导式)

# 『Python基础-12』各种推导式(列表推导式、字典推导式、集合推导式) 推导式comprehensions(又称解析式),是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。 共有三种推导&#x…

海思芯片选型表汇总

海思芯片选型表汇总_「违规用户」的博客-CSDN博客_海思芯片型号大全

Docker中未指定挂载点容器间volume卷的数据共享

一 背景 在实际使用过程中,我们可能会经常遇到容器间数据共享的情况,怎么处理呢?通过 docker 命令中的一些选项,我们即可完成容器间的数据共享。 二 实验步骤 2.1 创建容器 容器一:gysl-1 [rootdev ~]# docker run -it…

为什么早上和傍晚的太阳总是红色,而中午的大阳却是黄白色?

由太阳光本质决定,但会受环境影响。在地球上和火星上看到的太阳光也是有区别的,和太气层物质及厚薄也有关系。太阳光是由赤橙黄绿青蓝紫七色光组成的复合光是白色光。 在日出和日落的时候,地平线上所透过的大气层厚度,一般要比白…

js把日期字符串转换成时间戳

//获取当前时间: var myDate new Date();//当前时间 var year myDate.getFullYear();//当前年份 var month myDate.getMonth() 1;//当前月份 var day myDate.getDate();//当前日 myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); …