Delphi 链接两个独立的MDB(access数据库)文件,而不是表

Delphi 链接两个独立的MDB(access数据库)文件,而不是表,delphi,ms-access,Delphi,Ms Access,这有点类似于主细节情况,但有一些变化 问题:我有两个独立的MS Access数据库文件(.mdb),需要链接它们 第一个数据库包含零件号、零件详细信息、供应商等 第二个数据库将单个零件号作为表名,这些表中包含使用该零件的客户和产品号 我找不到合适的主细节链接方法,主要是因为表格名称必须随着网格中单元格数据的更改/更新而动态更改 因此,我提出了一种替代链接方法,如下所示。我不能完全肯定这是一个连接它们的好方法 {DBGrid1显示ADOTable1}中的值 {DBGrid2显示ADOTable

这有点类似于主细节情况,但有一些变化

问题:我有两个独立的MS Access数据库文件(.mdb),需要链接它们

  • 第一个数据库包含零件号、零件详细信息、供应商等
  • 第二个数据库将单个零件号作为表名,这些表中包含使用该零件的客户和产品号
我找不到合适的主细节链接方法,主要是因为表格名称必须随着网格中单元格数据的更改/更新而动态更改

因此,我提出了一种替代链接方法,如下所示。我不能完全肯定这是一个连接它们的好方法

{DBGrid1显示ADOTable1}中的值 {DBGrid2显示ADOTable2中的值,其表名会发生更改}

procedure TForm1.DBGrid1CellClick(Column: TColumn);
var PartTableName: string;
begin
if DBGrid1.Fields[2].IsNull then exit
  else
   begin
     if ADOTable2.active then ADOTable2.Close;
     PartTableName:= DBGrid1.Fields[2].AsString;
     while pos('-',TableString) > 0 do
       PartTableName[pos('-',PartTableName)] := '_';
     ADOTable2.TableName:= PartTableName;  //obtained from cell click in DBGrid1
     ADOTable2.Open;
   end;
end;
DBGrid2显示使用在DBGrid1中单击的任何零件号的客户和产品


一定有更好的办法吗?这种连接方式对我来说似乎很粗糙。我也希望在OnDataChange方法中使用此选项,但似乎不起作用。

您可以在Access中设置此选项。这是一个比在Delphi中更健壮的解决方案

在Access版本中找到链接表管理器,它允许您将另一个数据库中的表链接到现有数据库中。然后,您可以使用delphi访问单个mdb并获取所有表。

是另一种选择

引述:

TxQuery组件是可以使用的TDataSet子组件 使用SQL查询一个或多个TDataSet子体组件 声明


我建议您考虑使用ADO组件来过滤表的内容,而不是重新查询。这大致相当于一个主细节安排,其优点是只执行“内存中”操作,而不会在每次“主”行更改时命中db。(每次更改主行时,只需更改子表上的筛选条件即可)

为什么不合并2.mdb文件并重构生成的数据库?是的,我可以这样做,但我希望将所有详细信息都保存在一个外部.mdb文件中。将所有这些数据集中到一个mdb中也意味着我的数据库最终将在一个文件中包含300多个表。我不太喜欢这个主意。我很确定access对一个文件中可以有多少个表有限制。我还不知道那是什么,我相信menjaraz的意思是通过重构来摆脱所有那些不必要的表。只需将零件号添加为列。每个表都是一个零件,每个零件都有几个使用该零件的不同客户,以及他们的产品号。每个表都指向后面或链接到第一个mdb文件和表中的零件号。欢迎使用SO。请考虑一个关于如何规范和简化数据库和表设计的新问题。我在网上看到过这些信息。但是,我没有MS访问权限。所以我一直坚持按代码来做。我确实遇到了一个称为MDB Plus Viewer的小巧实用程序。但是还没有找到链接部分。@M.L.Tomson:当您导入“Microsoft DAO 3.6对象库”(也称为Microsoft Jet引擎)时,您可以在代码中完成。您应该能够在安装了MS Access的计算机上找到它。如果仅安装MS Excel,则可能存在,因为它也使用喷气发动机。否则,您可以尝试下载MDAC(2.5或更高版本)库。微软经常改变主意,是否将其包括在Windows和/或Office中,或作为单独的下载提供。这需要一点OLE自动化。@M.L.Tomson:根据您的Delphi版本,Diamond Access组件(不再维护,但仍可通过Torry.net获得)也可能会有所帮助,因为它们过去是本地访问MS Access数据库的组件集。它们将DAO tlb封装在更易于使用的组件中。Delphi数据集中的过滤传统上非常缓慢。Delphi的更高版本可能并非如此。使用ADO进行过滤确实非常快,而且一直如此。使用TTable+BDE进行过滤可能会很慢,是的。