sqlite - 使用 Delphi 和 Firedac 设置 sqlite 数据库的相对路径

标签 sqlite delphi relative-path firedac

代替我的previous question这是令人困惑且表述不当的,这是“真正的”问题。

我想知道如何使用 Firedac 在运行时设置位于我的应用程序文件夹的子文件夹中的 sqlite 数据库的相对路径。

Jerry Dodge声明:

Any application should never rely on writable data in the same directory anyway. Also, even if you did, you should make sure all your paths are relative to the application at least.

目前,我想要的应用程序是可移植的,我希望将数据库文件存储在主 exe 文件夹的子文件夹中。

在我的主窗体的 Form.Create 事件上,首先使用

path := ExtractFilePath(Application.ExeName);

然后是 FDConnection :

with FDConnection1 do begin
  Close;
  with Params do begin
    Clear;
    Add('DriverID=SQLite');
    Add('Database='+path+'Data\sqlite.db');
  end;
  Open;
end;

我不断收到错误消息“无法打开数据库文件”。

我不想在 FiredDac 连接编辑器中设置数据库文件的路径,因为这样它将是绝对路径并绑定(bind)到我的计算机,对吗?

如何设置数据库文件的路径,以便它可以在任何配置中工作,无论用户将应用程序文件夹放在何处?

先谢谢大家了

数学

最佳答案

当我找到自己的解决方案时,我决定将其发布在这里,以供将来可能遇到相同问题的用户使用(也就是说,Delphi 初学者级别并且需要链接相对于其项目 exe 文件的数据库文件)。

第一步是向项目添加数据模块。这是通过转到文件 -> 新建 -> 其他 -> Delphi 文件 -> 数据模块来完成的 enter image description here

第二步将数据模块添加到项目后,由于我的主申请表在创建时调用数据库,我必须确保首先创建数据模块。为此,我转到“项目”->“选项”->“表单”,并将数据模块拖动到自动创建的表单列表的第一个位置 enter image description here

第三步是在数据模块上放置 FDConnection 并设置除了数据库文件之外的所有参数。

第四步是将 OnCreate 事件添加到数据模块,以指定相对于应用程序 exe 的数据库路径并进行连接。它是这样完成的:

procedure TDataModule1.DataModuleCreate(Sender: TObject);
begin
  path := ExtractFilePath(ParamStr(0));

  FDConnection.Params.Add('Database='+path+'Database\sqlite.db');
  FDConnection.Connected := True;
end;

第五步也是最后一步是将数据模块添加到需要连接到数据库的所有其他单元的使用子句中。

我意识到这个解决方案远非完美,正如经验丰富的用户已经说过的那样,将数据库存储在与主应用程序 Exe 相同的文件夹(或子文件夹)中并不是一个好的解决方案。

此外,我决定在创建 DataModule 时连接到数据库,但另一种解决方案可能是在触发查询之前按需连接,然后断开连接。这取决于您和您的需求

感谢大家的帮助、提示和建议

数学

PS:请注意,我没有检查我的答案是否被接受为最佳答案,这是不公平的:-)

关于sqlite - 使用 Delphi 和 Firedac 设置 sqlite 数据库的相对路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44123752/

相关文章:

python - 如何防止 SQLite 数据库在部署到 OpenShift 后被还原?

delphi - 用 Delphi 编写请等待屏幕的最简单方法是什么?

excel - 使用相对路径之前如何引用文件夹?

relative-path - lcov 绝对路径与相对路径

SQLite:防止重复

PHP 对数组中的多个变量运行 1 个查询

delphi - TControl 作为 TPicture?

c# - 使用 SoundPlayer 播放声音

SQL中集合的Python字典

c++ - 检测当前安装的防病毒软件