日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL工厂法

發(fā)布時間:2023/12/10 数据库 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL工厂法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

表結構:

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個參數(shù)
??? procedure SetExeNo(Value: integer);
? protected

? public
??? constructor Create;
??? destructor Destroy; override;
??? procedure AddParam(const aValue: Variant);
??? //說明: 添加參數(shù)值
??? //參數(shù): const aValue: Variant -- 參數(shù)值
??? function GetData: _Recordset;? //非事務性查詢
??? procedure ExeSQL;????????????? //事務性操作
??? procedure BeginTrans;????????? //開始事務
??? procedure CommitTrans;???????? //提交事務
??? procedure RollbackTrans;?????? //回滾事務
??? property ExeNo: Integer read fExeNo write SetExeNo;? //SQL執(zhí)行序號
? 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.

?

?

客戶端只需要寫執(zhí)行號,和參數(shù)

客戶端完全沒有sql語句?

MySQL := TMySQL.Create;

? MySQL.ExeNo := 201;

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

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

? DS.Data := MySQL.GetData;

??

直接寫sql就是胖客戶

首先安全性差

其次維護不方便

我換個數(shù)據(jù)庫,我的服務端和客戶端都不需要更改

?

總結

以上是生活随笔為你收集整理的SQL工厂法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。