当前位置:首页 > 编程备忘 > 正文内容

RAD Studio 12 SQLite3 数据库从创建到释放整个过程

azls4周前 (09-12)编程备忘69

image.png

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);


扫描二维码推送至手机访问。

版权声明:本文由艾澤拉斯发布,如需转载请注明出处。

本文链接:https://lomcn.cc/?id=5

分享给朋友:
返回列表

上一篇:JS 0916 M2无法DEBUG的原因是

没有最新的文章了...

“RAD Studio 12 SQLite3 数据库从创建到释放整个过程” 的相关文章

JS 0916 M2无法DEBUG的原因是

{$IF (DEBUG = 0) and (SoftVersion <> VERDEMO)}       if IsDebuggerPresent...