Delphi XE7 BDE别名-在运行时设置它?
我使用DelphiXe7,我们的一个大型遗留应用程序仍然广泛使用BDE和Paradox表。我知道BDE已被弃用,但我们对此应用没有选择 此应用程序当前在运行时和启动时设置BDE别名。它使用BDE提供的标准默认会话,使用“TSession.AddStandardAlias”添加别名,并引用数据模块中定义的许多表 现在,我需要能够在应用程序运行的后期更改别名所指的文件夹路径,但发现该路径存在问题。基本上,它似乎可以工作,但在更改别名后,它仍然以某种方式引用以前的路径。即使是“TSession.GetAliasParams”也会报告新路径,但是Bde.DBTables中会出现错误,因为它试图访问以前的路径,而以前的路径已不存在 鉴于这个应用程序很大,我在下面的示例项目中重现了一个类似的问题。如果有人愿意尝试,这是一个非常简单的应用程序,只有主窗体。您需要设置两个文件夹,并将任何Paradox表放到一个文件夹中,然后在编辑框中指定该文件夹的路径,然后按下“设置别名路径”按钮,该按钮将设置别名,然后它会写入按钮下方的标签,告诉您别名所指的路径。然后,“FindTable”按钮和编辑框使用“TSession.GetTableNames”查找表的存在 最简单的方法是设置两个文件夹“C:\TEMP\testBDE\path1”和“C:\TEMP\testBDE\path2”,并将任何Paradox表放到path1中。运行应用程序时,按“设置别名路径”按钮,然后按“查找表”按钮,它将报告表存在 然后将别名更改为引用path2(为空),它会报告指向path2的别名,但也会报告表存在。然后很容易将表从路径1移动到路径2,然后它会报告表不存在 如有任何建议,将不胜感激Delphi XE7 BDE别名-在运行时设置它?,delphi,Delphi,我使用DelphiXe7,我们的一个大型遗留应用程序仍然广泛使用BDE和Paradox表。我知道BDE已被弃用,但我们对此应用没有选择 此应用程序当前在运行时和启动时设置BDE别名。它使用BDE提供的标准默认会话,使用“TSession.AddStandardAlias”添加别名,并引用数据模块中定义的许多表 现在,我需要能够在应用程序运行的后期更改别名所指的文件夹路径,但发现该路径存在问题。基本上,它似乎可以工作,但在更改别名后,它仍然以某种方式引用以前的路径。即使是“TSession.Get
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses
Bde.DBTables;
const
myAlias = 'ALIAS1';
function getPathFromAlias(tempAlais : String ): String;
var
MyStringList : TStringList;
i, k: integer;
tempStr, newDirectory: String;
begin
newDirectory:='';
MyStringList := TStringList.Create;
try
Session.GetAliasParams(tempAlais,MyStringList);
{ fill stringlist with driver names }
for i := 0 to MyStringList.count-1 do
begin
tempStr:= uppercase(trim(MyStringList.Strings[i]));
k := pos('PATH=', tempStr);
if k > 0 then
begin
delete(tempStr,1, k+4);
newDirectory:=tempStr;
end;
end;
finally
MyStringList.Free;
end;
result:=newDirectory;
end;
procedure setAliases( apath : String);
var
MyStringList : TStringList;
begin
(*
MyStringList := TStringList.Create;
try
MyStringList.Add( 'PATH='+apath);
MyStringList.Add( 'ENABLE BCD=FALSE');
MyStringList.Add( 'DEFAULT DRIVER=PARADOX');
Session.ConfigMode := cmSession;
if Session.IsAlias( myAlias) then
Session.ModifyAlias( myAlias, MyStringList)
else
Session.AddStandardAlias( myAlias, apath, 'PARADOX');
Session.ConfigMode := cmSession;
finally
MyStringList.Free;
end;
*)
Session.ConfigMode := cmSession;
if Session.IsAlias( myAlias) then
Session.DeleteAlias( myAlias);
Session.AddStandardAlias( myAlias, apath, 'PARADOX');
Session.ConfigMode := cmSession;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
setAliases( Edit1.Text);
Label1.Caption := getPathFromAlias( myAlias);
end;
function TableExists(const aDataBaseName, aTableName:string): Boolean;
var
TableNames: TStringList;
begin
TableNames:=TStringList.Create;
try
Session.GetTableNames(aDatabaseName,'',True,False,TableNames);
Result:=(TableNames.IndexOf(aTableName)<>-1);
finally
TableNames.Free;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
temps : String;
myTable : TTable;
begin
if TableExists( myAlias, Edit2.Text) then
Label2.Caption := 'Exists'
else
Label2.Caption := 'Not found'
end;
end.
单元1;
接口
使用
Winapi.Windows、Winapi.Messages、System.SysUtils、System.Variants、System.Classes、Vcl.Graphics、,
Vcl.控件、Vcl.窗体、Vcl.对话框、Vcl.stdctrl;
类型
TForm1=类(TForm)
编辑1:TEdit;
按钮1:t按钮;
按钮2:t按钮;
编辑2:TEdit;
标签1:TLabel;
标签2:TLabel;
程序按钮2点击(发送者:对象);
程序按钮1点击(发送方:ToObject);
私有的
{私有声明}
公众的
{公开声明}
结束;
变量
表1:TForm1;
实施
{$R*.dfm}
使用
Bde.dbs表;
常数
myAlias='ALIAS1';
函数getPathFromAlias(tempAlais:String):String;
变量
MyStringList:TStringList;
i、 k:整数;
tempStr,newDirectory:String;
开始
新目录:='';
MyStringList:=TStringList.Create;
尝试
GetAliasParams(tempAlais,MyStringList);
{用驱动程序名称填充stringlist}
对于i:=0到MyStringList.count-1 do
开始
tempStr:=大写(trim(MyStringList.Strings[i]);
k:=pos('PATH=',tempStr);
如果k>0,则
开始
删除(tempStr,1,k+4);
newDirectory:=tempStr;
结束;
结束;
最后
MyStringList.Free;
结束;
结果:=newDirectory;
结束;
过程集合别名(apath:String);
变量
MyStringList:TStringList;
开始
(*
MyStringList:=TStringList.Create;
尝试
Add('PATH='+apath);
Add('ENABLE BCD=FALSE');
Add('defaultdriver=PARADOX');
Session.ConfigMode:=cmSession;
如果Session.IsAlias(myAlias),则
Session.ModifyAlias(myAlias,MyStringList)
其他的
AddStandardAlias(myAlias,apath,'PARADOX');
Session.ConfigMode:=cmSession;
最后
MyStringList.Free;
结束;
*)
Session.ConfigMode:=cmSession;
如果Session.IsAlias(myAlias),则
Session.DeleteAlias(myAlias);
AddStandardAlias(myAlias,apath,'PARADOX');
Session.ConfigMode:=cmSession;
结束;
程序TForm1.按钮1单击(发送方:TObject);
开始
setAlias(Edit1.Text);
标签1.标题:=getPathFromAlias(myAlias);
结束;
函数TableExists(const aDataBaseName,aTableName:string):布尔值;
变量
表名:TStringList;
开始
TableNames:=TStringList.Create;
尝试
gettablename(aDatabaseName',True,False,tablename);
结果:=(TableNames.IndexOf(aTableName)-1);
最后
表名。免费;
结束;
结束;
程序TForm1.按钮2单击(发送方:TObject);
变量
temps:字符串;
myTable:TTable;
开始
如果存在表(myAlias,Edit2.Text),则
标签2.标题:=“存在”
其他的
标签2.标题:=“未找到”
结束;
结束。
在更改别名属性之前,您需要关闭会话,然后再次打开会话:
procedure TForm1.Button1Click(Sender: TObject);
begin
Session.Close;
setAliases( Edit1.Text);
Label1.Caption := getPathFromAlias( myAlias);
Session.Open;
end;
问题不在于无法识别路径更改,而在于如果这些更改是针对正在使用的别名进行的,则无法识别这些更改,如测试程序中的此场景所示: