在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.