如何让Delphi访问可执行文件目录中的Sqlite数据库?

时间:2017-02-03 12:30:24

标签: sqlite delphi

关闭选民,副本&那些认为我在询问的目录是哪个目录是我的程序在运行?",请实际 阅读 这个问题。而且,如果您不完全理解它,请悄悄地转到下一个问题。

[更新]正确答案如下。

我使用的是Sqlite,而不是MySql,因为它更简单,不需要额外运行的软件,只需要我的可执行文件。

为了简单起见,我希望将数据库文件放在与我的可执行文件相同的目录中, ,以便能够复制或移动该文件夹其他地方仍然有程序工作。这意味着它可以在新位置找到与之一起复制的Sqlite数据库文件。

但是,看起来我必须指定数据库文件的绝对路径。

有没有办法在运行时更改此内容?

对于那些不太熟悉的人,我会尝试解释:

  • 让我们说我的应用程序的.exe位于C:\A\A.exe
  • 所以,我想将数据库文件放在同一目录中。让我们称之为C:\A\A.db
  • Delphi 似乎 需要绝对路径。即,C:A\A.db而非.\A.db
    • 我希望能够将.exe及其数据库复制到C:\B,并且仍然可以让.exe能够找到其数据库文件,该文件现在位于C:\B\A.db

如何在运行时以编程方式执行此操作?

答案

数据库的路径存储在数据库连接组件中,类似于myConnection.aprameters.database := 'C:\my_database.db;

3 个答案:

答案 0 :(得分:4)

使用以下方法即时计算SQlite3数据库文件名:

myDbFileName := ExtractFilePath(paramstr(0)) + 'mysqlite3file.db3';

这将指出例如运行c:\my\app\folder\mysqlite3file.db3。{/ p>时到c:\my\app\folder\myprogam.exe文件

答案 1 :(得分:1)

首先,您要将数据库复制到EXE文件夹:

if FileExists(FDConnection1.Params.Database) then
CopyFile(Pchar(FDConnection1.Params.Database),Pchar('EXE Folder\A.db'),True);

然后您可以更改与新数据库(副本)的连接:

if FileExists('EXE Folder\A.db') then
begin
  FDConnection1.Params.Database := 'EXE Folder\A.db';
  FDConnection1.Connected := True;
end;

答案 2 :(得分:1)

您始终必须指定数据库文件的绝对路径。替代方案是执行完全搜索数据库文件,这是愚蠢的。 这是我用来创建数据库备份的一小段代码,以便您了解:

procedure TForm1.dxBarButton1Click(Sender: TObject);
var fileSource, fileDest,dirName: string;
 begin
 dirname := ExtractFilePath(Application.ExeName)+'\backup database' ;
 if not directoryexists(dirName) then
 CreateDir(dirName);

 if MessageDlg('Create database copy ?'+ #13#10 +'Attention,new copy will overwrite existing one',
    mtConfirmation, [mbYes, mbNo], 0, mbYes) = mrNo then
    exit
    else
  try
  dataModule2.ACRDatabase1.Close;  
  fileSource := ExtractFilePath(Application.ExeName)+'sgit.adb';
  fileDest := ExtractFilePath(Application.ExeName)+'\backup database\sgit.adb';
  If CopyFile(PChar(fileSource), PChar(fileDest), False) then begin
     dataModule2.ACRDatabase1.Open;
     dataModule2.FIRME.Open;
     ShowMessage('Copy was made !');
  end  else
     RaiseLastOSError;
  except  on E: Exception do
     showMessage(Format('Error during copying : %s',[E.Message]));
  end;
end;

因此,在您的情况下,您可以写入复制数据库的* .ini文件,然后在应用程序启动期间加载信息。所以基本上你必须始终提供数据库路径(fileSource)。你是怎么做的取决于你。只是一个想法...