【问题标题】:How to validate SQLite DB in Console Application using TFDSQLiteValidate如何使用 TFDSQLiteValidate 在控制台应用程序中验证 SQLite DB
【发布时间】:2016-08-08 04:56:47
【问题描述】:

我们可以在 TForm 中使用验证,它工作得很好,但是现在我们必须从仅控制台应用程序验证/分析 SQLite 数据库。请分享在 XE7+ 中工作的任何详细示例。

这是一个功能

  try
      goodsqlitedb:=true;
      //Check if Db is closed and not in use
      if(FDSqliteQuery1.Active) then
      begin
            FDSqliteQuery1.Close;
            updatelog('logfilename.txt', 'Closed Query');
      end
      else
          updatelog('logfilename.txt', 'Query Already Closed');

      FDSqliteConn.Close;
      updatelog('logfilename.txt', 'Connection Closed');

      //FDSqliteConn.Open;
      FDPhysSQLiteDriverLink2:=TFDPhysSQLiteDriverLink.Create(nil);
      FDSQLiteValidate2:=TFDSQLiteValidate.Create(nil);
      FDPhysDriverService:=TFDPhysDriverService.Create(nil);
      FDSQLiteSec2:=TFDSQLiteSecurity.Create(nil);
      FDSQLiteSec2.DriverLink:=FDPhysSQLiteDriverLink2;
      FDSQLiteValidate2.DriverLink:=FDPhysSQLiteDriverLink2;

      //FDSQLiteValidate2.OnProgress(FDPhysDriverService,DBMessage);

      with FDSQLiteValidate2 do
      begin
            updatelog('logfilename.txt', 'To Start the Validation');
            Database := dbfile;
            Analyze;
            updatelog('logfilename.txt', 'Database To be Analyzed');
            if not CheckOnly then
                Result:='1' //Database has problems
            else
                Result:='0'; //Database is good
      end;
  except
  on E: Exception do
      begin
            updatelog('logfilename.txt', 'Database Exception='+E.Message);
            Result:='2';    //Database is Corrupt
            goodsqlitedb := False;
            //raise;
      end;
  end;

  try
      FDPhysSQLiteDriverLink2.Destroy;
      FDSQLiteValidate2.Destroy;
      FDPhysDriverService.Destroy;
      FDSQLiteSec2.Destroy;
  finally
         updatelog('logfilename.txt', 'Drivers destroyed');
  end;

【问题讨论】:

    标签: sqlite delphi dll firedac


    【解决方案1】:

    下面是一个控制台应用程序,它应该做你想做的事,但需要注意以下几点:

    1. 我无法让我根据您的代码设置的 GUI 测试平台运行而不会在 FDSQLiteValidate2.Analyze 上引发异常在我的 gui 版本中,报告的错误是数据库已锁定,而在控制台版本中,错误消息是“缺少数据库异常 = 类 {3E9B315B-F456-4175-A864-B2573C4A2201} 的对象工厂。要注册它,您可以将组件 [TFDGUIxWaitCursor] 拖放到您的项目中”。

      但是,既然你说“这是一个可以做到这一点的函数”,我没有浪费任何时间来调试任何一个版本,而把它留给你。

    2. 将数据库函数的结果作为字符串返回不是我的做法,而是您的选择。

    3. 如果要添加大量日志条目,则将 TStringList 用作日志并不是很好,但至少它允许一个简单的 UpdateLog 例程。

    代码:

    program ConsoleValidateDB;
    
    {$APPTYPE CONSOLE}
    
    {$R *.res}
    
    uses
      System.SysUtils, System.Classes,
      // following come from a GUI testbed
      FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error,
      FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf,
      FireDAC.Stan.Async, FireDAC.DApt, FireDAC.UI.Intf,
      FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Phys,
      FireDAC.Phys.SQLite, FireDAC.Phys.SQLiteDef, FireDAC.Stan.ExprFuncs,
      FireDAC.VCLUI.Wait, Data.DB,
      FireDAC.Comp.Client, FireDAC.Comp.DataSet;
    
    const
      DBFileName  = 'D:\Delphi\Code\Sqlite\db2.sqlite';
      LogFileName = 'C:\temp\sqlitelog.txt';
    
    var
      Log : TStringList;
    
    procedure UpdateLog(LogFN, Msg : String);
    begin
      if Log = Nil then
        Log := TStringList.Create;
      Log.LoadFromFile(LogFN);
      Log.BeginUpdate;
      try
        Log.Add(Msg);
        Log.SaveToFile(LogFN);
      finally
        Log.EndUpdate
      end;
    end;
    
    function ValidateDB : String;
    var
      goodsqlitedb : Boolean;
      FDPhysSQLiteDriverLink2 : TFDPhysSQLiteDriverLink;
      FDSQLiteValidate2 : TFDSQLiteValidate;
      FDPhysDriverService : TFDPhysDriverService;
      FDSQLiteSec2 : TFDSQLiteSecurity;
    begin
      Result := 'Undefined';
      try
        goodsqlitedb:=true;
    
    (*  These are evidently components in a Gui app.  Ignore them.
        //Check if Db is closed and not in use
        if(FDSqliteQuery1.Active) then
        begin
              FDSqliteQuery1.Close;
              updatelog('logfilename.txt', 'Closed Query');
        end
        else
            updatelog('logfilename.txt', 'Query Already Closed');
    
        FDSqliteConn.Close;
        updatelog('logfilename.txt', 'Connection Closed');
    *)
    
        //FDSqliteConn.Open;
        FDPhysSQLiteDriverLink2:=TFDPhysSQLiteDriverLink.Create(nil);
        FDSQLiteValidate2:=TFDSQLiteValidate.Create(nil);
        FDPhysDriverService:=TFDPhysDriverService.Create(nil);
        FDSQLiteSec2:=TFDSQLiteSecurity.Create(nil);
        FDSQLiteSec2.DriverLink := FDPhysSQLiteDriverLink2;
        FDSQLiteValidate2.DriverLink:=FDPhysSQLiteDriverLink2;
    
        //FDSQLiteValidate2.OnProgress(FDPhysDriverService,DBMessage);
    
       //  "with" is evil, so omit it // with FDSQLiteValidate2 do begin
          updatelog(LogFileName, 'To Start the Validation');
          FDSQLiteValidate2.Database := DBFileName;
          FDSQLiteValidate2.Analyze;
          updatelog(LogFileName, 'Database To be Analyzed');
          if not FDSQLiteValidate2.CheckOnly then
              Result:= '1' //Database has problems
          else
              Result:= '0'; //Database is good
        //end;
      except
        on E: Exception do  begin
                  updatelog(LogFileName, 'Database Exception='+E.Message);
                  Result:= '2';    //Database is Corrupt
                  goodsqlitedb := False;
                  //raise;
            end;
        end;
    
      try
        FDPhysSQLiteDriverLink2.Destroy;
        FDSQLiteValidate2.Destroy;
        FDPhysDriverService.Destroy;
        FDSQLiteSec2.Destroy;
      finally
        updatelog(LogFileName, 'Drivers destroyed');
      end;
    
    end;
    
    begin
      writeln(ValidateDB);
    end.
    

    【讨论】:

    • 这是否回答了你的问题?
    【解决方案2】:

    为了将您的工作实现从可视化应用程序移植到非可视化应用程序,您至少有两种选择从何处获取组件:

    1. TDataModule 是一个非可视组件,您可以将其他非可视组件放在上面并通过 IDE 的对象检查器对其进行编辑,就像在 TFormTFrame 上一样。您可以在 Delphi IDE 的 New...-Wizard 中找到它。因此,如果您想坚持使用基于 GUI 的组件,您可以将它们放在那里。
    2. 在运行时创建所需的组件

    【讨论】:

    • Err,这如何回答q标题中的q?
    猜你喜欢
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 2012-04-19
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    相关资源
    最近更新 更多