RAD Studio 12 SQLite3 数据库从创建到释放整个过程
D:\GameOfMir\Source\DBServer\DBSMain.pas
//SQLite3 需要引入的单元:
Pascal
FireDAC.Comp.Client, FireDAC.Phys.SQLite, FireDAC.Stan.Def, FireDAC.Stan.Option, FireDAC.Stan.Intf, FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.VCLUI.Wait, FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, FireDAC.Comp.DataSet DBConn: TFDConnection; Query: TFDQuery;
//初始化部分
Pascal
procedure TFrmDBSrv.FormCreate(Sender : TObject);begin try // 创建SQL连接 DBConn := TFDConnection.Create(nil); FrmDBSrv.Caption:= FrmDBSrv.Caption+'[SQLite版]'; // 设置SQLite数据库文件路径 with DBConn do begin FetchOptions.Mode := fmAll; LoginPrompt := False; Params.Clear; Params.Add('DriverID=SQLite'); Params.Add('Database=..\Mud2\DB\' + sHeroDB + '.db'); //sHeroDB:String = 'HeroDB'; Params.Add('LockingMode=Normal'); Params.Add('Password=' + ''); Params.Add('SQLiteAdvanced=temp_store=memory'); // ;page_size=4096 Connected := True; end; // 设置查询组件的连接 Query := TFDQuery.Create(nil); Query.Connection := DBConn; Query.FetchOptions.Mode := fmAll; // 返回所有 Query.ResourceOptions.SilentMode := True; // 禁用沙漏光标 DBConn.Connected := True; // 连接 except MainOutMessage('SQLite 连接失败, 请仔细检查Dbsrc.ini 中 DBName= '+ sHeroDB +'。') ; end; MainOutMessage('SQLite 加载成功...');end;
//释放部分
Pascal
procedure TFrmDBSrv.FormDestroy(Sender : TObject);begin if DBConn <> nil then DBConn.Free; if Query <> nil then Query.Free;end;
D:\GameOfMir\Source\M2Server\LocalDB.pas
//SQLite3 需要引入的单元:
Pascal
FireDAC.Comp.Client, FireDAC.Phys.SQLite, FireDAC.Stan.Def, FireDAC.Stan.Option, FireDAC.Stan.Intf, FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.VCLUI.Wait, FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, FireDAC.Comp.DataSet public m_DBConn: TFDConnection; m_Query: TFDQuery;
//物品读取
Pascal
function TFrmDB.LoadItemsDB: Integer;var i,Idx:Integer; Item:TItem; //StdItem:pTStdItem;ResourceString sSQLString = 'SELECT * FROM StdItems ORDER BY Idx';beginTry EnterCriticalSection(ProcessHumanCriticalSection); try try for I := 0 to UserEngine.StdItemList.Count - 1 do begin TItem(UserEngine.StdItemList.Items[I]).Free; end; UserEngine.StdItemList.Clear; {For I:=0 to UserEngine.StdItemListEx.Count-1 do begin Dispose(pTStdItem(UserEngine.StdItemListEx.Items[i])); end; UserEngine.StdItemListEx.Clear;} Result := -1; m_Query.SQL.Clear; //m_Query.DatabaseName:=g_Config.DBName; m_Query.SQL.Add(sSQLString); try m_Query.Open; Except on E:Exception do begin Memo.Lines.Add(E.Message); Exit; end; end; for i:=0 to m_Query.RecordCount -1 do begin Item := TItem.Create; Idx := m_Query.FieldByName('Idx').AsInteger; Item.Name := m_Query.FieldByName('Name').AsString; Item.StdMode := m_Query.FieldByName('StdMode').AsInteger; Item.Shape := m_Query.FieldByName('Shape').AsInteger; Item.Weight := m_Query.FieldByName('Weight').AsInteger; Item.AniCount := m_Query.FieldByName('AniCount').AsInteger; Item.Source := m_Query.FieldByName('Source').AsInteger; Item.Reserved := m_Query.FieldByName('Reserved').AsInteger; Item.Looks := m_Query.FieldByName('Looks').AsInteger; Item.DuraMax := Word(m_Query.FieldByName('DuraMax').AsInteger); Item.AC := ROUND(m_Query.FieldByName('AC').AsInteger * (g_Config.nItemsACPowerRate / 10)); Item.AC2 := ROUND(m_Query.FieldByName('AC2').AsInteger * (g_Config.nItemsACPowerRate / 10)); Item.MAC := ROUND(m_Query.FieldByName('MAC').AsInteger * (g_Config.nItemsACPowerRate / 10)); Item.MAC2 := ROUND(m_Query.FieldByName('MAC2').AsInteger * (g_Config.nItemsACPowerRate / 10)); Item.DC := ROUND(m_Query.FieldByName('DC').AsInteger * (g_Config.nItemsPowerRate / 10)); Item.DC2 := ROUND(m_Query.FieldByName('DC2').AsInteger * (g_Config.nItemsPowerRate / 10)); Item.MC := ROUND(m_Query.FieldByName('MC').AsInteger * (g_Config.nItemsPowerRate / 10)); Item.MC2 := ROUND(m_Query.FieldByName('MC2').AsInteger * (g_Config.nItemsPowerRate / 10)); Item.SC := ROUND(m_Query.FieldByName('SC').AsInteger * (g_Config.nItemsPowerRate / 10)); Item.SC2 := ROUND(m_Query.FieldByName('SC2').AsInteger * (g_Config.nItemsPowerRate / 10)); Item.Need := m_Query.FieldByName('Need').AsInteger; Item.NeedLevel := m_Query.FieldByName('NeedLevel').AsInteger; Item.Price := m_Query.FieldByName('Price').AsInteger; Try Item.sDesc := m_Query.FieldByName('Desc').AsString; Item.nHero := m_Query.FieldByName('Hero').AsInteger; Except Item.sDesc:=''; Item.nHero:=0; end; //Item.Unique := False; Item.Light := False; //ShowMessage(Item.Name); Item.NeedIdentify:=GetGameLogItemNameList(Item.Name); Item.HeroPick:=GetHeroPickItemNameList(Item.Name); Item.LevelItem:=GetLevelItemNameList(Item.Name); Item.SellOff:=GetSellItemNameList(Item.Name); Item.DieDisap:=GetDieDisapItemNameList(Item.Name); Item.GhostDisap:=GetGhostDisapItemNameList(Item.Name); Item.SuitIdx[0]:=0; GetSuitItemList(Item); GetRuleItemList(Item); case Item.StdMode of 0,55,58:Item.ItemType:= ITEM_LEECHDOM; 5,6: Item.ItemType := ITEM_WEAPON; 10,11,27,62,63,64,26,30,15,22,29,16: Item.ItemType := ITEM_ARMOR; 19,20,21,23,24,51,52,53,54,28: Item.ItemType := ITEM_ACCESSORY; 60,8:Item.ItemType:=ITEM_Wine; else Item.ItemType := ITEM_ETC; end; if UserEngine.StdItemList.Count = Idx then begin UserEngine.StdItemList.Add(Item); //New(StdItem); //Item.GetStandardItem(StdItem^); //UserEngine.StdItemListEx.Add(StdItem); Result := 1; end else begin Memo.Lines.Add(format('加载物品(Idx:%d Name:%s)数据失败!!!',[Idx,Item.Name])); Result := -100; exit; end; m_Query.Next; end; g_boGameLogGold:=GetGameLogItemNameList(sSTRING_GOLDNAME) = 1; g_boGameLogHumanDie:=GetGameLogItemNameList(g_sHumanDieEvent) = 1; g_boGameLogGameGold:=GetGameLogItemNameList(g_Config.sGameGoldName) = 1; g_boGameLogGamePoint:=GetGameLogItemNameList(g_Config.sGamePointName) = 1; g_boHeroPickGold:=GetHeroPickItemNameList(sSTRING_GOLDNAME) = 1; finally m_Query.Close; end; finally LeaveCriticalSection(ProcessHumanCriticalSection); end;Except MainOutMessage('[Exception] TFrmDB.LoadItemsDB:'); End; end;
//技能读取
Pascal
function TFrmDB.LoadMagicDB():Integer;var i:Integer; Magic:pTMagic;ResourceString //sSQLString = 'SELECT * FROM TBL_MAGIC ORDER BY FLD_ID'; sSQLString = 'SELECT * FROM Magic ORDER BY MagID';beginTry Result:= -1; EnterCriticalSection(ProcessHumanCriticalSection); try try UserEngine.SwitchMagicList(); {for I := 0 to UserEngine.MagicList.Count - 1 do begin Dispose(pTMagic(UserEngine.MagicList.Items[I])); end; UserEngine.MagicList.Clear;} m_Query.SQL.Clear; //m_Query.DatabaseName:=g_Config.DBName; m_Query.SQL.Add(sSQLString); try m_Query.Open; Except on E:Exception do begin Memo.Lines.Add(E.Message); Exit; end; end; for i:=0 to m_Query.RecordCount -1 do begin New(Magic); Magic.wMagicId := m_Query.FieldByName('MagId').AsInteger; Magic.sMagicName := Trim(m_Query.FieldByName('MagName').AsString); Magic.btEffectType := m_Query.FieldByName('EffectType').AsInteger; Magic.btEffect := m_Query.FieldByName('Effect').AsInteger; Magic.wSpell := m_Query.FieldByName('Spell').AsInteger; Magic.wPower := m_Query.FieldByName('Power').AsInteger; Magic.wMaxPower := m_Query.FieldByName('MaxPower').AsInteger; Magic.btDefSpell := m_Query.FieldByName('DefSpell').AsInteger; Magic.btDefPower := m_Query.FieldByName('DefPower').AsInteger; Magic.btDefMaxPower := m_Query.FieldByName('DefMaxPower').AsInteger; Magic.btJob := m_Query.FieldByName('Job').AsInteger; Magic.TrainLevel[0] := m_Query.FieldByName('NeedL1').AsInteger; Magic.MaxTrain[0] := m_Query.FieldByName('L1TRAIN').AsInteger; Magic.TrainLevel[1] := m_Query.FieldByName('NEEDL2').AsInteger; Magic.MaxTrain[1] := m_Query.FieldByName('L2TRAIN').AsInteger; Magic.TrainLevel[2] := m_Query.FieldByName('NEEDL3').AsInteger; Magic.MaxTrain[2] := m_Query.FieldByName('L3TRAIN').AsInteger; Magic.dwDelayTime := m_Query.FieldByName('DELAY').AsInteger; Magic.sDescr := Trim(m_Query.FieldByName('DESCR').AsString); Magic.TrainLevel[3] := Magic.TrainLevel[2]; //Query.FieldByName('FLD_NEEDL3').AsInteger; Magic.MaxTrain[3] := Magic.MaxTrain[2]; Magic.btTrainLv := MaxSkillLevel; if Magic.wMagicId > 0 then begin UserEngine.m_MagicList2.Add(Magic); if Magic.sDescr='英雄' then begin case Magic.wMagicID of SKILL_FIRECHARM:begin //灵魂火符 New(g_HeroFourMagicCharm); g_HeroFourMagicCharm^:=Magic^; g_HeroFourMagicCharm.btEffect:=70; end; SKILL_FIRESWORD: begin //烈火剑法 New(g_HeroFourMagicFirs); g_HeroFourMagicFirs^:=Magic^; g_HeroFourMagicFirs.btEffect:=71; end; SKILL_45:begin //灭天火 New(g_HeroFourMagic45); g_HeroFourMagic45^:=Magic^; g_HeroFourMagic45.btEffect:=72; end; end; end; end else begin Dispose(Magic); end; Result := 1; m_Query.Next; end; finally m_Query.Close; end; finally LeaveCriticalSection(ProcessHumanCriticalSection); end;Except MainOutMessage('[Exception] TFrmDB.LoadMagicDB'); End; end;
//怪物读取
Pascal
function TFrmDB.LoadMonsterDB():Integer;var i:Integer; Monster:pTMonInfo;ResourceString sSQLString = 'SELECT * FROM Monster';beginTry Result:=0; EnterCriticalSection(ProcessHumanCriticalSection); try for I := 0 to UserEngine.MonsterList.Count - 1 do begin Dispose(pTMonInfo(UserEngine.MonsterList.Items[I])); end; UserEngine.MonsterList.Clear; m_Query.SQL.Clear; //m_Query.DatabaseName:=g_Config.DBName; m_Query.SQL.Add(sSQLString); try m_Query.Open; Except on E:Exception do begin Memo.Lines.Add(E.Message); Exit; end; end; for i:=0 to m_Query.RecordCount -1 do begin New(Monster); Monster.ItemList := TList.Create; Monster.sName := Trim(m_Query.FieldByName('NAME').AsString); Monster.btRace := m_Query.FieldByName('RACE').AsInteger; Monster.btRaceImg := m_Query.FieldByName('RACEIMG').AsInteger; Monster.wAppr := m_Query.FieldByName('Appr').AsInteger; Monster.wLevel := m_Query.FieldByName('LVl').AsInteger; Monster.btLifeAttrib := m_Query.FieldByName('UNDEAD').AsInteger; Monster.wCoolEye := m_Query.FieldByName('COOLEYE').AsInteger; Monster.dwExp := m_Query.FieldByName('EXP').AsInteger; //城门或城墙的状态跟HP值有关,如果HP异常,将导致城墙显示不了 if Monster.btRace in [110,111] then begin //如果为城墙或城门由HP不加倍 Monster.wHP := m_Query.FieldByName('HP').AsInteger; end else begin Monster.wHP := ROUND(m_Query.FieldByName('HP').AsInteger * (g_Config.nMonsterPowerRate / 10)); end; Monster.wMP := ROUND(m_Query.FieldByName('MP').AsInteger * (g_Config.nMonsterPowerRate / 10)); Monster.wAC := ROUND(m_Query.FieldByName('AC').AsInteger * (g_Config.nMonsterPowerRate / 10)); Monster.wMAC := ROUND(m_Query.FieldByName('MAC').AsInteger * (g_Config.nMonsterPowerRate / 10)); Monster.wDC := ROUND(m_Query.FieldByName('DC').AsInteger * (g_Config.nMonsterPowerRate / 10)); Monster.wMaxDC := ROUND(m_Query.FieldByName('DCMAX').AsInteger * (g_Config.nMonsterPowerRate / 10)); Monster.wMC := ROUND(m_Query.FieldByName('MC').AsInteger * (g_Config.nMonsterPowerRate / 10)); Monster.wSC := ROUND(m_Query.FieldByName('SC').AsInteger * (g_Config.nMonsterPowerRate / 10)); Monster.wSpeed := m_Query.FieldByName('Speed').AsInteger; Monster.wHitPoint := m_Query.FieldByName('Hit').AsInteger; Monster.wWalkSpeed := _MAX(200,m_Query.FieldByName('WALK_SPD').AsInteger); Monster.wWalkStep := _MAX(1,m_Query.FieldByName('WALKSTEP').AsInteger); Monster.wWalkWait := m_Query.FieldByName('WALKWAIT').AsInteger; Monster.wAttackSpeed := _MAX(200,m_Query.FieldByName('ATTACK_SPD').AsInteger); Monster.wAntiPush := Monster.wWalkWait; //Monster.boAggro := m_Query.FieldByName('FLD_AGGRO').AsBoolean; //Monster.boTame := m_Query.FieldByName('FLD_TAME').AsBoolean; Monster.boAggro := False; Monster.boTame := False; if Monster.wWalkSpeed < 200 then Monster.wWalkSpeed:= 200; if Monster.wAttackSpeed < 200 then Monster.wAttackSpeed:= 200; Monster.ItemList:=nil; LoadMonitems(Monster.sName,Monster.ItemList); UserEngine.MonsterList.Add(Monster); Result := 1; m_Query.Next; end; m_Query.Close; finally LeaveCriticalSection(ProcessHumanCriticalSection); end;Except MainOutMessage('[Exception] TFrmDB.LoadMonsterDB'); End; end;
//初始化部分
Pascal
constructor TFrmDB.Create();beginTry inherited; CoInitialize(nil);try // 创建SQL连接 m_DBConn := TFDConnection.Create(nil); // 设置SQLite数据库文件路径 with m_DBConn do begin FetchOptions.Mode := fmAll; LoginPrompt := False; Params.Clear; Params.Add('DriverID=SQLite'); Params.Add('Database=..\Mud2\DB\' + g_Config.DBName + '.db'); Params.Add('LockingMode=Normal'); Params.Add('Password=' + ''); Params.Add('SQLiteAdvanced=temp_store=memory'); // ;page_size=4096 Connected := True; end; // 设置查询组件的连接 m_Query := TFDQuery.Create(nil); m_Query.Connection := m_DBConn; m_Query.FetchOptions.Mode := fmAll; // 返回所有 m_Query.ResourceOptions.SilentMode := True; // 禁用沙漏光标 m_DBConn.Connected := True; // 连接 except MainOutMessage('SQLite 连接失败, 请仔细检查!Setup.txt 中 DBName= '+ g_Config.DBName +'。') ; end; MainOutMessage('SQLite 加载成功...'); //Query:=TADOQuery.Create(nil);
//释放部分
Pascal
destructor TFrmDB.Destroy;beginTry m_Query.Free; m_DBConn.Free; //Query.Free; CoUnInitialize; inherited;Except MainOutMessage('[Exception] TFrmDB.Destroy'); End; end;
//INI配置
Pascal
if Config.ReadString('Server', 'DBName', '') = '' then Config.WriteString('Server', 'DBName', DBNAME); g_Config.DBName := Config.ReadString('Server', 'DBName', DBNAME);