91m2中对DB进行了一次封装的DBHelpUtil工具类

在91M2中使用了数据库的都知道,需要interface uses DB单元,而数据库无非四种操作(增、删、改、查

以下给这四种操作举一些简单的例子:

假如现有一个数据库名字叫做xxm2,其中有一个give表,其中存放了giveId(唯一Id,主键,integer,自增长),sellName(卖家姓名 string),buyName(买家姓名 string),itemName(物品名字 string),price(物品价格 integer),giveTime(交易时间 string)这四个字段。

首先需要先应用xxm2数据库,然后才能对表进行操作。

1、插入一条记录。要求:卖家:我是卖家,卖家:我是买家,物品是裁决之杖,价格是100元宝,交易时间是2016-09-19 15:20

增:insert into give(sellName,buyName,itemName,price,giveTime) values ('我是卖家','我是买家','裁决之杖',100,'2016-09-19 15:20');

2、删除一条记录。要求:删除所有小于100元宝的裁决之杖记录

删:delete from give where price<100 and itemName='裁决之杖';

3、修改一条记录。要求:裁决之杖的所有交易时间改到2016-09-01 12:00

改:update student set giveTime='2016-09-01 12:00' where itemName='裁决之杖';

4、查询一条记录

查询这里就不介绍了。


最后拼接成了对应的sql语句后,使用Gamelib.DBEngine.ExecSQL(连接名字,sql);就可以实现增、删、改了。


但是这里有一个问题:

如果字段少,拼接起来还好说,如果字段多20-30个字段的情况下。拼接起来简直头疼,维护起来也是极其蛋疼的。不但要注意

1、逗号是否少写了。2、格式是否对。3、还要注意字符串字段单引号有没有少加了。

因此我就做了一个数据库工具类,方便大家使用。


废话不多说,直接上代码,如果需要使用,可以直接复制到引擎中即可。

外部调用,直接implementation uses DBHelpUtil;

然后直接调动,以下这三个方法即可。


插入:function InsertSQL(dbName , tableName : string ; valuesList : ContentValueList) : boolean;
删除:function DeleteSQL(dbName , tableName ,whereCause: string ; whereList : ContentValueList) : boolean;
更新:function UpdateSQL(dbName , tableName : string ; valuesList :ContentValueList ; whereCause : string ;whereList : 


若想直接下载完整代码,请点击这里[点击打开链接]

unit DBHelpUtil;

interface
  uses Classes, SysUtils , DB;

const KIND_INTEGER = 1;
const KIND_STRING = 2;

function InsertSQL(dbName , tableName : string ; valuesList : ContentValueList) : boolean;
function DeleteSQL(dbName , tableName ,whereCause: string ; whereList : ContentValueList) : boolean;
function UpdateSQL(dbName , tableName : string ; valuesList :ContentValueList ; whereCause : string ;whereList : ContentValueList) : boolean;

type
	ContentValue = class
  public 
  	key : string;
    kind : integer;
    value : string;  
    constructor Create;          	
    destructor Destroy; override;
  end;
type
	ContentValueList = class
  public 
  	list : TList;  
    function getCount() : integer; 
    function getItem(p : integer) : ContentValue;
    procedure addString(keyxx,valuexx : string); 
    procedure addWhereString(valuexx : string); 
    procedure addWhereInteger(valuexx : integer);
    procedure addInteger(keyxx : string ; valuexx : integer);
    constructor Create;          	
    destructor Destroy; override;
  end;  
implementation uses StringUtil;

function GetSubStrCounts(AStr,ASubStr: string): Integer;
var
  i: Integer;
begin
  Result := (length(AStr)-length(StringReplace(AStr,ASubstr,'',[rfReplaceAll, rfIgnoreCase]))) div length(asubstr);
end;

procedure test(Npc: TNormNpc; Player: TPlayObject);
var
test1,test2,test3,test4: ContentValueList;
begin
		test1 := ContentValueList.create;  
    //addString还是addInteger是根据数据库字段来的。
    test1.addString('goodName','123');
    test1.addInteger('status',0);    
    DBHelpUtil.InsertSQL('cqdb','goodsneed',test1); 
    //产生的sql是:insert into goodsneed(goodName,status) values ('123',0);
    
    
    DBHelpUtil.DeleteSQL('cqdb','goodsneed','',nil);
    //产生的sql是:delete from goodsneed;    
    
    test2 := ContentValueList.create;
    test2.addWhereInteger(125); 
    test2.addWhereString('小红'); 
    test2.addWhereInteger(100000);   
    DBHelpUtil.DeleteSQL('cqdb','goodsneed','id=$ and name=$ and price<$',test2); 
    //产生的sql是,delete from goodsneed where id=125 and name='小红' and price<100000
     
    
    test3 := ContentValueList.create;
    test3.addString('goodName','123');
    test3.addInteger('status',0);
    DBHelpUtil.UpdateSQL('cqdb','goodsneed',test3,'',nil);
    //产生的sql是,update goodsneedgoodName='123' , status=0  
    
    
    
   	test4 := ContentValueList.create;
    test4.addWhereInteger(125); 
    test4.addWhereString('小红');  
    DBHelpUtil.UpdateSQL('cqdb','goodsneed',test3,'id=$ and name=$',test4); 
    DBHelpUtil.UpdateSQL('cqdb','goodsneed',test3,'id=123 and name=''小红''',test4); 
    DBHelpUtil.UpdateSQL('cqdb','goodsneed',test3,'id=123 and name=''小红''',nil);
    //以上3种方式产生的sql都是,update goodsneedgoodName='123' , status=0 where id=125 and name='小红' 
    //规则是'id=$ and name=$',如果从其中发现一个$符号,则从后面test中取一个值。
    
    
    
    //用完记得一定要释放
    FreeAndNil(test1);
    FreeAndNil(test2); 
    FreeAndNil(test3); 
    FreeAndNil(test4);  
end;

function InsertSQL(dbName , tableName : string ; valuesList : ContentValueList) : boolean;
var
sql : string;
keyStr , valueStr : string;
I : integer;
content : ContentValue;
begin
    if (valuesList = nil) or (valuesList.getCount = 0) then
    begin
      	Result := false;
    end
    else
    begin 
    		keyStr := '';
        valueStr := '';
        for I:=0 to valuesList.getCount-1 do
        begin 
        		content := valuesList.getItem(I);
          	keyStr := keyStr + content.key;
            if content.kind = KIND_INTEGER then
            begin
            		valueStr := valueStr+content.value;  
            end
            else
            begin
                valueStr := valueStr+''''+content.value+''''; 
            end;       
            
            if I <> valuesList.getCount-1 then
            begin
            		keyStr := keyStr + ',';
                valueStr := valueStr + ',';  
            end;
        end; 
        sql := 'insert into '+tableName+' ('+keyStr+') values ('+valueStr+')'; 
        Result := Gamelib.DBEngine.ExecSQL(dbName,sql);
    end;       
end;

function DeleteSQL(dbName , tableName ,whereCause: string ; whereList : ContentValueList) : boolean;
var
sql : string;
I : integer;
whereItem : ContentValue;
count : integer;
args : array of const;
begin
		sql := 'delete from '+tableName; 
    if whereCause <> '' then
    begin
    		count := GetSubStrCounts(whereCause,'$');	
        if count > 0 then
        begin 
        		SetLength(args,count);
        		whereCause := whereCause.Replace('$','%s');
        		for I:=0 to count-1 do
            begin 
                if (whereList <> nil) and (I < whereList.getCount) then
                begin         
                		whereItem := whereList.getItem(I);
                    if whereItem.kind = KIND_INTEGER then
                    begin  
                        args[I] := whereItem.value; 
                    end
                    else
                    begin  
                        args[I] :=''''+whereItem.value+'''';
            				end;  
                end
                else
                begin  
                    args[I] := '$';
                end; 
            end;
        end;	
        sql := sql +' where ' + format(whereCause,args);    
    end;
//		debug('delete sql='+sql);
    Result := Gamelib.DBEngine.ExecSQL(dbName,sql);
end;

function UpdateSQL(dbName , tableName : string ; valuesList :ContentValueList ; whereCause : string ;whereList : ContentValueList) : boolean;
var
sql : string;
sql1,sql2 : string;
I,count : integer;
content,whereItem : ContentValue;
args : array of const;
begin
		if (valuesList = nil) or (valuesList.getCount = 0) then
    begin
      	Result := false;
    end                
    else
    begin
    		sql := 'update '+tableName+' set ';
    		sql1 := '';
        sql2 := '';
        for I:=0 to valuesList.getCount-1 do
        begin 
        		content := valuesList.getItem(I);
            if content.kind = KIND_INTEGER then
            begin 
            		sql1 := sql1 + content.key+'='+content.value;
            end
            else
            begin
                sql1 := sql1 + content.key+'='''+content.value+''''; 
            end;       
            if I <> valuesList.getCount-1 then
            begin
            		sql1 := sql1 + ' , ';
            end;
        end; 
        if whereCause <> '' then
        begin
            count := StringUtil.GetSubStrCounts(whereCause,'$');	
            if count > 0 then
            begin 
                SetLength(args,count);
                whereCause := whereCause.Replace('$','%s');
                for I:=0 to count-1 do
                begin 
                    if (whereList <> nil) and (I < whereList.getCount) then
                    begin         
                        whereItem := whereList.getItem(I);
                        if whereItem.kind = KIND_INTEGER then
                        begin  
                            args[I] := whereItem.value; 
                        end
                        else
                        begin  
                            args[I] :=''''+whereItem.value+'''';
                        end;  
                    end
                    else
                    begin  
                        args[I] := '$';
                    end; 
                end; 
                sql2 := sql2 +' where ' + format(whereCause,args);    
            end
            else
            begin
              	sql2 := sql2 +' where ' + whereCause;  
            end;
        end;
        sql := sql + sql1 + sql2;  
        debug('update sql = '+sql); 
        Result := Gamelib.DBEngine.ExecSQL(dbName,sql);
    end;
end;

constructor ContentValueList.Create;
begin
   	list := TList.Create;
end;
function ContentValueList.getCount() : integer;
begin
   	Result :=  list.count;
end;

function ContentValueList.getItem(p : integer) : ContentValue;
begin
   	Result :=  ContentValue(list[p]);
end;

procedure ContentValueList.addWhereString(valuexx : string); 
var
value : ContentValue;
begin
   	value := ContentValue.Create;
   	value.key := '';
    value.kind := KIND_STRING;
    value.value := valuexx;
    list.Add(value);
end;
procedure ContentValueList.addWhereInteger(valuexx : integer);
var
value : ContentValue;
begin
		value := ContentValue.Create;
   	value.key := '';
    value.kind := KIND_INTEGER;
    value.value := IntToStr(valuexx);    
    list.Add(value);
end;
procedure ContentValueList.addString(keyxx,valuexx : string);
var
value : ContentValue;
begin
   	value := ContentValue.Create;
   	value.key := keyxx;
    value.kind := KIND_STRING;
    value.value := valuexx;
    list.Add(value);
end;
procedure ContentValueList.addInteger(keyxx : string ; valuexx : integer);
var
value : ContentValue;
begin
		value := ContentValue.Create;
   	value.key := keyxx;
    value.kind := KIND_INTEGER;
    value.value := IntToStr(valuexx);    
    list.Add(value);
end;
constructor ContentValueList.Destroy;
var
I : integer;
c : ContentValue;
begin
		for I:=0 to list.Count-1 do
    begin  
    		c := ContentValue(list[I]);  
        FreeAndNil(c);
    end;  
    FreeAndNil(list);
		inherited;
end;
constructor ContentValue.Create;
begin
   	key := '';
    kind := 0;
    value := '';
end;
constructor ContentValue.Destroy;
begin
		inherited;
end;

end.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值