📄 sqldata.pas
字号:
{MySQL数据资料读取 --Michen}
unit SQLData;
interface
uses
Windows, MMSystem, Forms, Classes, SysUtils, IniFiles, Common, DBXpress, DB, SqlExpr, StrUtils, FusionSQL;
//==============================================================================
// 过程&函数
function HexToInt(Hex : string) : Cardinal;
function ExecuteSqlCmd(sqlcmd: String) : Boolean;
procedure SQLDataLoad();
procedure SQLDataSave();
function GetPlayerData(userid: String; AID: cardinal = 0) : Boolean; {取得帐号资料}
function GetCharaData(GID: cardinal) : Boolean; {取得人物资料}
function GetAccCharaData(AID: cardinal) : Boolean; {取得帐号的人物资料}
function GetPetData(AID: cardinal) : Boolean; {取得帐号的宠物资料}
function GetCharaGuildData(GID: cardinal) : Boolean; {取得人物的工会资料}
function GetCharaPartyGuild(GID: cardinal) : Boolean; {取得人物的工会、组队,以及所有成员资料}
function DeleteChar(GID: cardinal) : Boolean; {从数据库删除人物}
function DeleteGuildMember(GID: cardinal; mtype: Integer; tgb: TGBan; GDID: cardinal) : Boolean; {从数据库删除工会成员}
function DeleteParty(Name: string) : Boolean; {从数据库删除组队}
function DeleteGuildAllyInfo(GDID: cardinal; GuildName: String; mtype: Integer) : Boolean; {删除同盟、敌对工会资料}
function DeleteGuildInfo(GDID: cardinal) : Boolean; {删除工会资料}
function CheckUserExist(userid: String) : Boolean; {检查人物是否存在}
function GetNowLoginID() : cardinal; {取得当前的帐号ID编号}
function GetNowCharaID() : cardinal; {取得当前的人物ID编号}
function GetNowPetID() : cardinal; {取得当前的宠物ID编号}
function SaveCharaData(tc : TChara) : Boolean; {保存人物资料}
function SavePetData(tpe : Tpet; PIndex: Integer; place: Integer) : Boolean; {保存宠物资料}
function SaveGuildMPosition(GDID: cardinal; PosName: string; PosInvite: boolean; PosPunish: boolean; PosEXP: byte; Grade: Integer) : Boolean; {保存工会头衔资料}
function SaveGuildAllyInfo(GDID: cardinal; GuildName: String; mtype: Integer) : Boolean; {保存同盟、敌对工会资料}
function addslashes(Strings: String) : String; {数据库字符串处理}
function unaddslashes(Strings: String) : String; {数据库字符串处理}
//==============================================================================
implementation
var
SQLDataSet :TSQLDataSet;
SQLConnection :TSQLConnection;
//------------------------------------------------------------------------------
// 十六进制转十进制
//------------------------------------------------------------------------------
{ Obsolete - Poor Design - Alex }
function HexToInt(Hex : string) : Cardinal;
const
cHex = '0123456789ABCDEF';
var
mult,i,loop : integer;
begin
result := 0;
mult := 1;
for loop := length(Hex) downto 1 do begin
i := pos(Hex[loop],cHex)-1;
if (i < 0) then i := 0;
inc(result,(i*mult));
mult := mult * 16;
end;
end;
//------------------------------------------------------------------------------
// 执行数据库查询
//------------------------------------------------------------------------------
function ExecuteSqlCmd(sqlcmd: String) : Boolean;
begin
Result := False;
{初始化数据库}
if not assigned(SQLConnection) then
begin
SQLConnection := TSQLConnection.Create(nil);
SQLConnection.ConnectionName := 'MySQLConnection';
SQLConnection.DriverName := 'MySQL';
SQLConnection.GetDriverFunc := 'getSQLDriverMYSQL';
SQLConnection.KeepConnection := True;
SQLConnection.LibraryName := 'dbexpmysql.dll';
SQLConnection.LoginPrompt := False;
SQLConnection.VendorLib := 'libmysql.dll';
SQLConnection.Params.Values['HostName'] := DbHost;
SQLConnection.Params.Values['Database'] := DbName;
SQLConnection.Params.Values['User_Name'] := DbUser;
SQLConnection.Params.Values['Password'] := DbPass;
end;
{连接数据库}
if not SQLConnection.Connected then
begin
try
SQLConnection.Connected := True;
except
debugout.lines.add('[' + TimeToStr(Now) + '] ' + '*** Error on MySQL Connect.');
Exit;
end;
end;
if not assigned(SQLDataSet) then
begin
SQLDataSet := TSQLDataSet.Create(nil);
SQLDataSet.SQLConnection := SQLConnection;
end;
if SQLDataSet.Active then
SQLConnection.Close;
SQLDataSet.CommandText := sqlcmd;
if UpperCase(copy(SQLDataSet.CommandText,1,6)) <> 'SELECT' then
begin
try
SQLDataSet.ExecSQL;
except
debugout.lines.add('[' + TimeToStr(Now) + '] ' + Format( '*** Execute SQL Error: %s', [sqlcmd] ) );
exit;
end;
Result := True;
Exit;
end;
try
SQLDataSet.Open;
except
debugout.lines.add('[' + TimeToStr(Now) + '] ' + Format( '*** Open SQL Data Error: %s', [sqlcmd] ) );
exit;
end;
// debugout.lines.add('[' + TimeToStr(Now) + '] ' + sqlcmd);
Result := True;
end;
//------------------------------------------------------------------------------
// 读取全部的玩家资料
//------------------------------------------------------------------------------
procedure SQLDataLoad();
var
i,j :integer;
// i1 :integer;
sl :TStringList;
// tpa :TParty;
tgc :TCastle;
// tg :TGuild;
// tgb :TGBan;
// tgl :TGRel;
txt :TextFile;
str :string;
begin
sl := TStringList.Create;
sl.QuoteChar := '"';
sl.Delimiter := ',';
if not FileExists(AppPath + 'status.txt') then begin
AssignFile(txt, AppPath + 'status.txt');
Rewrite(txt);
Writeln(txt, '##Weiss.StatusData.0x0002');
Writeln(txt, '0');
CloseFile(txt);
end else begin
debugout.lines.add('[' + TimeToStr(Now) + '] ' + 'Server Flag loading...');
Application.ProcessMessages;
AssignFile(txt, AppPath + 'status.txt');
Reset(txt);
Readln(txt, str);
sl.Clear;
Readln(txt, str);
sl.DelimitedText := str;
j := StrToInt(sl.Strings[0]);
for i := 1 to j do ServerFlag.Add('\' + sl.Strings[i]);
CloseFile(txt);
debugout.lines.add('[' + TimeToStr(Now) + '] ' + Format('*** Total %d Server Flag loaded.', [ServerFlag.Count]));
Application.ProcessMessages;
end;
if (ExecuteSqlCmd('SELECT GDID FROM guild_info ORDER BY GDID DESC LIMIT 1')) then begin
while not SQLDataSet.Eof do begin
NowGuildID := SQLDataSet.FieldValues['GDID'];
SQLDataSet.Next;
end;
end;
{读取工会城资料}
debugout.lines.add('[' + TimeToStr(Now) + '] ' + 'Castle data loading from SQL...');
Application.ProcessMessages;
if ExecuteSqlCmd('SELECT * FROM guild_castle') then
begin
while not SQLDataSet.Eof do
begin
tgc := TCastle.Create;
with tgc do begin
Name := unaddslashes(SQLDataSet.FieldValues['Name']);
GID := StrToInt(SQLDataSet.FieldValues['GDID']);
GName := unaddslashes(SQLDataSet.FieldValues['GName']);
GMName := unaddslashes(SQLDataSet.FieldValues['GMName']);
GKafra := StrToInt(SQLDataSet.FieldValues['GKafra']);
EDegree := StrToInt(SQLDataSet.FieldValues['EDegree']);
ETrigger := StrToInt(SQLDataSet.FieldValues['ETrigger']);
DDegree := StrToInt(SQLDataSet.FieldValues['DDegree']);
DTrigger := StrToInt(SQLDataSet.FieldValues['DTrigger']);
GuardStatus[0] := StrToInt(SQLDataSet.FieldValues['GuardStatus0']);
GuardStatus[1] := StrToInt(SQLDataSet.FieldValues['GuardStatus1']);
GuardStatus[2] := StrToInt(SQLDataSet.FieldValues['GuardStatus2']);
GuardStatus[3] := StrToInt(SQLDataSet.FieldValues['GuardStatus3']);
GuardStatus[4] := StrToInt(SQLDataSet.FieldValues['GuardStatus4']);
GuardStatus[5] := StrToInt(SQLDataSet.FieldValues['GuardStatus5']);
GuardStatus[6] := StrToInt(SQLDataSet.FieldValues['GuardStatus6']);
GuardStatus[7] := StrToInt(SQLDataSet.FieldValues['GuardStatus7']);
end;
CastleList.AddObject(tgc.Name, tgc);
SQLDataSet.Next;
end;
end else begin
debugout.lines.add('[' + TimeToStr(Now) + '] ' + 'Castle data loading error...');
Exit;
end;
debugout.lines.add('[' + TimeToStr(Now) + '] ' + Format('*** Total %d Castle(s) data loaded.', [CastleList.Count]));
Application.ProcessMessages;
{读取组队资料}
{debugout.lines.add('[' + TimeToStr(Now) + '] ' + 'Party data loading from SQL...');
Application.ProcessMessages;
if ExecuteSqlCmd('SELECT * FROM party') then
begin
while not SQLDataSet.Eof do
begin
tpa := TParty.Create;
with tpa do begin
Name := unaddslashes(SQLDataSet.FieldValues['Name']);
EXPShare := StrToInt(SQLDataSet.FieldValues['EXPShare']);
ITEMShare := StrToInt(SQLDataSet.FieldValues['ITEMShare']);
MemberID[0] := StrToInt(SQLDataSet.FieldValues['MemberID0']);
MemberID[1] := StrToInt(SQLDataSet.FieldValues['MemberID1']);
MemberID[2] := StrToInt(SQLDataSet.FieldValues['MemberID2']);
MemberID[3] := StrToInt(SQLDataSet.FieldValues['MemberID3']);
MemberID[4] := StrToInt(SQLDataSet.FieldValues['MemberID4']);
MemberID[5] := StrToInt(SQLDataSet.FieldValues['MemberID5']);
MemberID[6] := StrToInt(SQLDataSet.FieldValues['MemberID6']);
MemberID[7] := StrToInt(SQLDataSet.FieldValues['MemberID7']);
MemberID[8] := StrToInt(SQLDataSet.FieldValues['MemberID8']);
MemberID[9] := StrToInt(SQLDataSet.FieldValues['MemberID9']);
MemberID[10] := StrToInt(SQLDataSet.FieldValues['MemberID10']);
MemberID[11] := StrToInt(SQLDataSet.FieldValues['MemberID11']);
end;
PartyNameList.AddObject(tpa.Name, tpa);
debugout.lines.add('[' + TimeToStr(Now) + '] ' + Format('Add Party Name : %s.', [tpa.Name]));
SQLDataSet.Next;
end;
end else begin
debugout.lines.add('[' + TimeToStr(Now) + '] ' + 'Party data loading error...');
Exit;
end;
debugout.lines.add('[' + TimeToStr(Now) + '] ' + Format('*** Total %d Party(s) data loaded.', [PartyNameList.Count]));
Application.ProcessMessages;}
{读取工会资料}
{debugout.lines.add('[' + TimeToStr(Now) + '] ' + 'Guild data loading from SQL...');
Application.ProcessMessages;
if ExecuteSqlCmd('SELECT * FROM guild_info') then
begin
while not SQLDataSet.Eof do
begin
tg := TGuild.Create;
with tg do begin
ID := StrToInt(SQLDataSet.FieldValues['GDID']);
if (ID > NowGuildID) then NowGuildID := ID;
Name := unaddslashes(SQLDataSet.FieldValues['Name']);
LV := StrToInt(SQLDataSet.FieldValues['LV']);
EXP := StrToInt(SQLDataSet.FieldValues['EXP']);
GSkillPoint := StrToInt(SQLDataSet.FieldValues['GSkillPoint']);
Notice[0] := unaddslashes(SQLDataSet.FieldValues['Subject']);
Notice[1] := unaddslashes(SQLDataSet.FieldValues['Notice']);
Agit := unaddslashes(SQLDataSet.FieldValues['Agit']);
Emblem := StrToInt(SQLDataSet.FieldValues['Emblem']);
Present := StrToInt(SQLDataSet.FieldValues['Present']);
DisposFV := StrToInt(SQLDataSet.FieldValues['DisposFV']);
DisposRW := StrToInt(SQLDataSet.FieldValues['DisposRW']);
for i := 0 to 35 do begin
MemberID[i] := 0;
MemberPos[i] := 0;
MemberEXP[i] := 0;
end;
for i := 10000 to 10004 do
begin
if GSkillDB.IndexOf(i) <> -1 then
begin
GSkill[i].Data := GSkillDB.IndexOfObject(i) as TSkillDB;
end;
end;
sl.Clear;
sl.DelimitedText := SQLDataSet.FieldValues['skill'];
for i := 0 to ((sl.Count div 2) - 1) do begin
if (GSkillDB.IndexOf(strtoint(sl.Strings[0+i*2])) <> -1) then begin
GSkill[strtoint(sl.Strings[0+i*2])].Lv := strtoint(sl.Strings[1+i*2]);
GSkill[strtoint(sl.Strings[0+i*2])].Card := false;
end;
end;
end;
GuildList.AddObject(tg.ID, tg);
SQLDataSet.Next;
end;
end else begin
debugout.lines.add('[' + TimeToStr(Now) + '] ' + 'Guild data loading error...');
Exit;
end;
Application.ProcessMessages;
{循环所有工会,读取工会成员等资料}
{for i := 0 to GuildList.Count - 1 do
begin
tg := GuildList.Objects[i] as TGuild;
with tg do
begin
{读取工会成员资料}
{if ExecuteSqlCmd(Format('SELECT * FROM guild_members WHERE GDID=''%d'' LIMIT 36', [ID])) then
begin
j := 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -