关闭选民,副本&那些认为我在询问的目录是哪个目录是我的程序在运行?",请实际 阅读 这个问题。而且,如果您不完全理解它,请悄悄地转到下一个问题。
[更新]正确答案如下。
我使用的是Sqlite,而不是MySql,因为它更简单,不需要额外运行的软件,只需要我的可执行文件。
为了简单起见,我希望将数据库文件放在与我的可执行文件相同的目录中, 和 ,以便能够复制或移动该文件夹其他地方仍然有程序工作。这意味着它可以在新位置找到与之一起复制的Sqlite数据库文件。
但是,看起来我必须指定数据库文件的绝对路径。
有没有办法在运行时更改此内容?
对于那些不太熟悉的人,我会尝试解释:
C:\A\A.exe
C:\A\A.db
C:A\A.db
而非.\A.db
C:\B
,并且仍然可以让.exe能够找到其数据库文件,该文件现在位于C:\B\A.db
如何在运行时以编程方式执行此操作?
数据库的路径存储在数据库连接组件中,类似于myConnection.aprameters.database := 'C:\my_database.db;
答案 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)。你是怎么做的取决于你。只是一个想法...