Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi XE7 BDE别名-在运行时设置它?_Delphi - Fatal编程技术网

Delphi XE7 BDE别名-在运行时设置它?

Delphi XE7 BDE别名-在运行时设置它?,delphi,Delphi,我使用DelphiXe7,我们的一个大型遗留应用程序仍然广泛使用BDE和Paradox表。我知道BDE已被弃用,但我们对此应用没有选择 此应用程序当前在运行时和启动时设置BDE别名。它使用BDE提供的标准默认会话,使用“TSession.AddStandardAlias”添加别名,并引用数据模块中定义的许多表 现在,我需要能够在应用程序运行的后期更改别名所指的文件夹路径,但发现该路径存在问题。基本上,它似乎可以工作,但在更改别名后,它仍然以某种方式引用以前的路径。即使是“TSession.Get

我使用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,然后它会报告表不存在

如有任何建议,将不胜感激

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;
问题不在于无法识别路径更改,而在于如果这些更改是针对正在使用的别名进行的,则无法识别这些更改,如测试程序中的此场景所示:

  • 单击按钮1:路径已更改
  • 单击按钮2:未找到表
  • 在“编辑1”中更改路径以引用回原始别名路径
  • 使用按钮1重置路径
  • 单击按钮2:仍未找到表
  • i、 e.如果您要做的第一件事是更改路径,那么别名确实反映了更改后的路径。问题是,一旦您使用了别名,对路径的更改就不会随后反映出来

    通过关闭并重新打开会话,您可以确保别名已正确“重置”

    在您的实际应用程序中,这可能会导致在关闭和重新打开会话后需要重新打开数据库连接的连锁反应,尽管这是我的推测

    替代方法 作为关闭会话以便在运行时修改别名的替代方法,另一种方法可能是使用