如何操作数据库
unit Q7;
inte传奇服务端ce
uses Classes, SysUtils, DB{使用TDataSet对象必须引用此单元};
procedure Main(Npc: TNormNpc; Player: TPlayObject; Args: TArgs);
implementation
{
拼接SQL注意,以MSSQL为例,假设SQL语句为: SELECT * FROM Table WHERE Name=\“\“
则在Pascal中字符表示为: S := \“SELECT * FROM Table WHERE Name=\“\“\“\“\“;
S := \“SELECT * FROM Table WHERE Name=\“\“\“ + Player.Name + \“\“\“\“;
两个单引号来表示SQL中的一个单引号
}
procedure Main(Npc: TNormNpc; Player: TPlayObject; Args: TArgs);
var
ADataSet: TDataSet;
AList: TStrings;
begin
//普通执行语句不需要返回
Gamelib.DBEngine.EecSQL(\“HumDB\“, \“UPDATE Players SET nGold=0 WHERE nGold < 0\“);
Gamelib.DBEngine.EecSQL(\“HumDB\“, \“UPDATE Players SET nGold=10000 WHERE sChrName=\“\“\“ + Player.Name+ \“\“\“\“); //这里需要注意引号的使用
//查询数据并将结果放到数据集,然后从数据集读取数据
ADataSet := Gamelib.DBEngine.Query(\“HumDB\“, \“SELECT * FROM Players\“);
if ADataSet <> nil then //必须做此判断,因为当数据连接找不到的时候返回为nil值
begin
AList := TStringList.Create;
try
ADataSet.Open; //打开数据集
if not ADataSet.IsEmpty then //如果数据集不为空的情况下
begin
while not ADataSet.Eof do //如果没到数据集的末尾
begin
//S := ADataSet.FieldByName(\“sChrName\“).AsString; //直接将字段赋值到变量S中
AList.Add(ADataSet.FieldByName(\“sChrName\“).AsString); //将字段sChrName的值取出来放到AList中
ADataSet.Net; //数据集向后滚动,如果循环读取数据,此处必须,否则会死循环
end;
end;
Npc.MessageBo(Player, AList.Tet);
finally
ADataSet.Free; //数据集需要自己手工释放
AList.Free; //自己创建的TStrings类对象需要释放
end;
end;
//直接将一个查询结果中的第一个字段的值填入到一个TStrings
AList := Gamelib.DBEngine.ValueList(\“HumDB\“, \“SELECT sChrName FROM Players\“); //ValueList函数一定会返回一个TStrings实例,并且需要自己释放
Npc.MessageBo(Player, AList.Tet);
AList.Free;
end;
end.
注意:操作SQLite数据库的时候需要注意对应的数据库文件是否被其他应用打开,如果被其他应用打开则只是只读状态,增删改等操作是无效的。比如正在被使用中的示范版本的角色数据库和账号数据库 |
|