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.



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: M.2 NGFF M-key封装文件指的是M.2 Next Generation Form Factor的主板上的插槽以及插在该插槽上的不同类型的硬件组件。 M.2 NGFF(M-Key)是一种新型的硬件接口标准,用于连接主板和各种类型的扩展硬件组件,如固态硬盘(SSD)、无线网卡、蓝牙模块等。M.2 NGFF插槽上的金手指被分为多个键(key),每种键的位置和尺寸不同。其,M-key是指插槽上的主键,用于支持同时传输PCI Express(PCIe)和SATA信号的硬件组件。 M.2 NGFF M-key封装文件是指包含M.2 NGFF插槽上M-key所需的电路布局、焊点以及硬件规格等信息的文件。这些文件通常由硬件设计师或制造商提供,用于帮助电子工程师进行硬件设计和制造过程的设计验证、焊接和调试。 这些文件可以包含元件的尺寸、连接方式、电气特性、引脚定义等信息,使得硬件设计师可以按照标准规格进行设计和制造硬件设备,确保硬件组件能够正确连接到M.2 NGFF插槽,并与主板相互通信。 总之,M.2 NGFF M-key封装文件是用于指导硬件设计和制造的文件,其包含了M.2 NGFF插槽上主键(M-key)所需的电路布局、焊点以及硬件规格等信息,以确保硬件设备可以正确地插入和连接到M.2 NGFF插槽,并与主板正常通信。 ### 回答2: M.2 NGFF M键封装文件指的是一种用于存储设备的封装标准。M.2 (前身为NGFF)是一种用于连接固态硬盘、无线网卡和其他小型设备的接口标准。 M键封装文件是指M.2 NGFF接口的一种规格,用于支持PCI Express和SATA接口。M键封装文件的接口为多脚,通常在笔记本电脑、台式机或嵌入式系统使用。M键封装文件通常具有两条或四条PCI Express通道,以及SATA通道,以满足不同设备的需求。 M.2 NGFF M键封装文件具有多种优点。首先,它具有更小的尺寸,因此更适合于紧凑的设备。其次,M键封装文件支持更高的数据传输速率,可提供更快的读写速度。此外,M键封装文件还支持热插拔功能,即可以在设备运行时添加或移除存储设备。 使用M.2 NGFF M键封装文件的设备具有广泛的应用领域。例如,在个人电脑,M.2 NGFF M键封装文件可用于安装高速固态硬盘,以提供更快的系统启动和文件传输速度。在嵌入式系统,M.2 NGFF M键封装文件可用于添加无线网络功能,以便设备与其他设备或互联网进行通信。此外,M.2 NGFF M键封装文件还可用于扩展存储容量,以满足用户对数据存储的需求。 总之,M.2 NGFF M键封装文件是一种用于存储设备的封装标准,具有小尺寸、高速率和热插拔功能等优点,适用于各种设备,提供快速、可靠的数据存储和传输解决方案。 ### 回答3: M.2 NGFF M key封装文件是指用于存储M.2 NGFF M key接口规格的文件。M.2 NGFF是一种新型的存储接口标准,用于代替传统的SATA接口,主要用于固态硬盘(SSD)等存储设备。 M.2 NGFF M key封装文件包含了该接口规格的详细描述和参数,包括外形尺寸、针脚定义和排列、电气特性、信号传输速度等。通过阅读这个封装文件,硬件制造商可以了解M.2 NGFF M key接口的设计要求,从而根据这些要求制造符合标准的M.2 NGFF M key接口的硬件设备。 M.2 NGFF M key封装文件还提供了硬件设计的指导,包括电路板布局、信号线走线、电源和地线的设计等。这些指导可以帮助硬件制造商在设计M.2 NGFF M key接口的硬件时遵循最佳实践,确保设备的性能和稳定性。 此外,M.2 NGFF M key封装文件还包含了制造商和供应商的相关信息,以便硬件制造商在生产过程能够获得支持和技术帮助。 总之,M.2 NGFF M key封装文件是一个重要的参考文件,它包含了M.2 NGFF M key接口的规格和设计要求,可以帮助硬件制造商生产出符合标准的M.2 NGFF M key接口的硬件设备。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值