2

我无法在我的程序的多个实例中打开某个表。发生的事情是我试图允许用户打开并用旧表(不包含在数据字典中)替换当前表(数据字典的一部分 - FileForm.ImagesTable)。它适用于程序的一个实例,但是当我们尝试在另一个实例上同时打开同一个文件时。我收到以下错误。

FileName.ADT 此文件正在使用中。输入新名称或关闭在另一个程序中打开的文件。

下面是我将表名和数据路径重新分配给所选表的代码。

OpenDialog1.FileName := '*.adt';
OpenDialog1.Filter := 'Software 6.0 Files (*.adt)|*.adt|Software 5.x Files (*.dbf)|*.dbf';
OpenDialog1.InitialDir := DataPath;
if OpenDialog1.Execute then
begin
    Str1 := Trim(OpenDialog1.FileName);
    if Length(Str1) = 0 then
        Exit;
    DSImage.Enabled := False;

    with FileForm.ImagesTable do
    begin
        Active := False;
        AfterOpen := FileForm.TableOther.AfterOpen;
        DataBaseName := ExtractFilePath(Str1);   
        TableName :=  ExtractFileName(Str1);
        Active := True;
    end;
 end;

编辑* 使用 Advtantage 8.1,似乎是一个窗口错误,因为错误发生在对话窗口中。是的 Exclusive 设置为 false。

错误


任何关于为什么会发生这种情况以及如何解决这个问题的想法都值得赞赏。

谢谢

4

2 回答 2

4

您不清楚具体错误 - 是 Windows 错误还是 Advantage 错误?

如果是 Windows 错误,可能是因为您指定了对表的独占访问权限 ( ImageTable.Exclusive = True)。这意味着应用程序的第一个实例可以打开它,但随后的尝试会因File is in use错误而失败。

如果是 Advantage 错误,Advantage 帮助文件(在v11 的文档中,因为您没有指定 ADS 的版本 - 请注意它在框架中,因此您可能需要使用此链接,导航到Advantage Developers Guide,展开Part 1->Chapter 4 - Dictionaries->Understanding Dictionaries主题)说:

数据字典是一个特殊文件,用作数据库表的唯一访问点

注意唯一的接入点。一旦表在数据字典中,它就属于数据字典。您试图用字典范围之外的内容替换该引用,这是不允许的。我很确定问题与此有关 - ADS 对字典中包含的表设置了专有锁,并通过字典通过服务器控制对这些文件的访问。

您需要从字典中删除表并将其用作空闲表,或者提出不同的策略来删除当前数据并将其替换为其他数据以保持字典的完整性。

于 2012-09-22T00:46:15.107 回答
3

看起来您只是使用“打开对话框”来获取表的名称。
在“打开”对话框中尝试设置ShareAware选项

OpenDialog1.Options := OpenDialog1.Options + [ ofShareAware ];

使用 Advantage 打开表后,模式为拒绝写入、拒绝读取,因此如果任何非 Advantage 尝试打开表,则将返回共享错误。

于 2012-09-25T18:47:06.873 回答