0

我有一些代码可以在网格上构建房间地图(图表),并在它们之间建立链接。它存储在 Firebird 数据库中,其中一个表中的房间和另一个表中的链接。数据通过 DB Express TSimpleDataset 数据集进行管理。

出口(链接)表的查询如下所示:

select
  EXITS.*,
  r1.x as x,
  r1.y as y,
  r2.x as x2,
  r2.y as y2 
from EXITS
inner join ROOMS r1 on r1.ROOM_ID = EXITS.ROOM1
inner join ROOMS r2 on r2.ROOM_ID = EXITS.ROOM2

问题是,当我添加一个新出口并调用 ApplyUpdates 时,DBX 的 SQL 解析器似乎不理解 ROOMS 表中的字段只是为了方便而不是原始表的一部分。它生成以下内容:

insert into "EXITS"
  ("EXIT_ID", "AORDER", "AEXIT", "PREACTION", "POSTACTION", "COLOR", "ROOM1",
   "ROOM2", "MAP1", "MAP2", "X", "Y", "X2", "Y2")
values
  (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

加上适当的参数,具有可预测的结果。有谁知道我怎样才能理解不应该插入或更新 Xs 和 Ys?

4

2 回答 2

1

使用提供者标志来告诉应该更新哪些文件,并告诉提供者应该更新哪个表(有一个 OnGetTableName 事件或类似事件)。另一种选择是使用 OnBeforeUpdateRecord 事件并编写一些代码来执行更新,而不使用 SQL 生成器中内置的 TDatasetProvider。

于 2010-01-01T22:17:53.673 回答
0

该查询的 SQL 是一个旨在返回数据的查询,不适合插入或更新。尽管 SimpleDataSets 允许双向使用,但并非所有情况都可以用它处理。我将创建两个不同的单向 ClientDataSet 一个用于查询,另一个直接访问表而不是使用查询。

引用 Martin Rudy 的 dbExpress 入门:

更合适的方法是使用 ClientDataSet (CDS) 和 DataSetProvider。使用 CDS 和 DSP 连接到数据 CDS 和 DSP 组件都位于数据访问组件选项板上。dbExpress 调色板中的 SQLDataSet 组件用于定义结果集。SQLDataSet 的 SQLConnection 属性分配给 SQLConnection 组件名称。SQLDataSet CommandText 属性定义 SQL 语句。DSP 的 DataSet 属性设置为 SQLDataSet 组件的名称。CDS 组件具有设置为 DSP 名称的 ProviderName 属性。最后一个属性值更改是对应分配给 CDS 组件名称的 DataSource DataSet 属性。将 CDS Active 属性设置为 True(或使用 Open 方法)检索数据。乍一看,与 SimpleClientDataSet 相比,您可能会觉得这工作量太大。随着我们介绍更多 CDS 和 DSP 功能,您将更好地理解为什么要使用 DSP 和 CDS 而不是 SimpleClientDataSet

另外,请阅读设置UpdateModeProviderFlags属性一章

关于控制数据集中用于查找和更新记录的字段,有很多有趣的信息。

使用 ClientDataSets,UpdateMode 属性位于 DataSetProvider 上。如果您使用组合 CDS/DSP 组件之一(例如 SimpleClientDataset),则这些组件由于内部 DataSetProvider 而具有 UpdateMode 属性。

于 2010-01-01T18:35:25.697 回答