问题标签 [tclientdataset]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
3233 浏览

delphi - 使用 TADOQuery 查询 TClientDataSet

我的问题很简单。我有一个通过 TDataSetProvider 链接到 TADOQuery 的 TClientDataSet。我可以将数据从 TADOQuery 放入 TClientDataSet,但是如何将 TClientDataSet 中的数据重新放入 TADOQuery?

当我运行查询然后将 TClientDataSet 的 Active 属性设置为 True 时,数据会自动从 TADOQuery 传输到 TClientDataSet,但是如果我停用 TADOQuery 然后再次激活它,如何从 TClientDataSet 中取回数据?

我在几个数据库上运行相同的查询并使用 TClientDataSet 连接结果。这工作正常。我现在的问题是我需要将连接的结果集从 TClientDataSet 中返回到 TADOQuery 中,以便我可以使用 TADOQuery 的 SaveToFile 过程(出于兼容性原因)。我怎样才能做到这一点?

0 投票
4 回答
2610 浏览

delphi - “bof 或 eof 为真或当前记录已被删除..” 包含删除操作的 applyupdates 错误

我在解决从 ClientDatset 到 TAdoDataset(绑定到访问表)的删除操作时遇到此错误。我正在使用德尔福 2010。

我在 TClientDataset 和 TAdoDataset 之间的 DatasetProvider :

此函数发生错误,由 TDataSetResolver.EndUpdate() 调用;

0 投票
3 回答
6193 浏览

delphi - 在 DBGrid 中移动列似乎会移动附加的数据集字段

上周我观察到了一些我没有预料到的事情,将在下面描述。我很好奇为什么会发生这种情况。它是 TDataSet 类内部的东西、TDBGrid 的工件还是其他东西?

打开的 ClientDataSet 中的字段顺序发生了变化。具体来说,我在使用 FieldDefs 定义其结构后,通过调用 CreateDatatSet 在代码中创建了一个 ClientDataSet。此 ClientDataSet 结构中的第一个字段是名为 StartOfWeek 的日期字段。不久之后,我也编写的代码(假设 StartOfWeek 字段位于第零位 ClientDataSet.Fields[0])失败了,因为 StartOfWeek 字段不再是 ClientDataSet 中的第一个字段。

经过一番调查,我了解到 ClientDataSet 中的每个字段都可能在特定时刻出现在与创建 ClientDataSet 时的原始结构不同的某个位置。我不知道这可能会发生,在谷歌上搜索也没有提到这种效果。

发生的事情不是魔术。这些字段本身并没有改变位置,也没有根据我在代码中所做的任何事情而改变。导致字段在 ClientDataSet 中物理出现位置变化的原因是用户更改了 ClientDataSet 附加到的 DbGrid 中列的顺序(当然是通过 DataSource 组件)。我在 Delphi 7、Delphi 2007 和 Delphi 2010 中复制了这种效果。

我创建了一个非常简单的 Delphi 应用程序来演示这种效果。它由一个带有一个 DBGrid、一个 DataSource、两个 ClientDataSet 和两个 Button 的表单组成。此表单的 OnCreate 事件处理程序如下所示

Button1(标记为 Show ClientDataSet Structure)包含以下 OnClick 事件处理程序。

要演示移动场效果,请运行此应用程序并单击标有 Show ClientDataSet Structure 的按钮。您应该会看到类似此处所示的内容:

接下来,拖动 DBGrid 的列来重新排列字段的显示顺序。再次单击 Show ClientDataSet Structure 按钮。这次您将看到与此处显示的内容类似的内容:

此示例的显着之处在于 DBGrid 的列正在移动,但对 ClientDataSet 中 Fields 的位置有明显影响,因此 ClientDataSet.Field[0] 中的字段位置为 1点不一定在片刻之后。而且,不幸的是,这显然不是 ClientDataSet 问题。我对基于 BDE 的 TTables 和基于 ADO 的 AdoTables 进行了相同的测试,得到了相同的效果。

如果您从不需要引用在 DBGrid 中显示的 ClientDataSet 中的字段,那么您不必担心这种影响。对于你们其他人,我可以想到几个解决方案。

避免此问题的最简单但不必要的优选方法是防止用户重新排序 DBGrid 中的字段。这可以通过从 DBGrid 的 Options 属性中删除 dgResizeColumn 标志来完成。虽然这种方法是有效的,但从用户的角度来看,它消除了潜在的有价值的显示选项。此外,删除此标志不仅会限制列重新排序,还会阻止调整列大小。(要了解如何在不删除列调整大小选项的情况下限制列重新排序,请参阅http://delphi.about.com/od/adptips2005/a/bltip0105_2.htm。)

第二种解决方法是避免根据字面位置引用数据集的字段(因为这是问题的本质)。换句话说,如果您需要引用 Count 字段,请不要使用 DataSet.Fields[2]。只要您知道字段的名称,就可以使用 DataSet.FieldByName('Count') 之类的名称。

然而,使用 FieldByName 有一个相当大的缺点。具体来说,此方法通过遍历 DataSet 的 Fields 属性来识别字段,并根据字段名称查找匹配项。由于每次调用 FieldByName 时都会执行此操作,因此在需要多次引用字段的情况下(例如在导航大型 DataSet 的循环中)应避免使用此方法。

如果您确实需要重复(并且多次)引用该字段,请考虑使用类似于以下代码片段的内容:

还有第三种解决方案,但这仅在您的 DataSet 是 ClientDataSet 时可用,就像我原来的示例中的那个一样。在这些情况下,您可以创建原始 ClientDataSet 的克隆,它将具有原始结构。因此,无论用户对显示 ClientDataSets 数据的 DBGrid 做了什么,在第零位置创建的任何字段仍将位于该位置。

这在以下代码中进行了演示,该代码与标记为 Show Cloned ClientDataSet Structure 的按钮的 OnClick 事件处理程序相关联。

如果您运行此项目并单击标有“显示克隆的 ClientDataSet 结构”的按钮,您将始终获得 ClientDataSet 的真实结构,如下所示

附录:

需要注意的是,基础数据的实际结构不受影响。具体来说,如果在更改 DBGrid 中列的顺序后,调用 ClientDataSet 的 SaveToFile 方法,则保存的结构是原始(真正的内部)结构。此外,如果将一个 ClientDataSet 的 Data 属性复制到另一个,则目标 ClientDataSet 也会显示真实的结构(这类似于克隆源 ClientDataSet 时观察到的效果)。

同样,对绑定到其他测试数据集(包括 TTable 和 AdoTable)的 DBGrid 的列顺序的更改实际上不会影响基础表的结构。例如,显示来自 Delphi 附带的 customer.db 示例 Paradox 表的数据的 TTable 实际上并没有改变该表的结构(您也不希望它改变)。

我们可以从这些观察中得出结论,DataSet 本身的内部结构保持不变。因此,我必须假设在某处存在 DataSet 结构的二级表示。而且,它必须与 DataSet 相关联(这似乎有点过头了,因为并非所有使用 DataSet 都需要这个),与 DBGrid 相关联(这更有意义,因为 DBGrid 正在使用此功能,但不是由 TField 重新排序似乎与 DataSet 本身持​​续存在的观察结果支持),或者是其他东西。

另一种选择是效果与 TGridDataLink 相关联,TGridDataLink 是为多行感知控件(如 DBGrids)提供数据感知的类。但是,我也倾向于拒绝这种解释,因为这个类与网格相关联,而不是与 DataSet 相关联,因为效果似乎与 DataSet 类本身有关。

这让我回到了最初的问题。这种效果是 TDataSet 类内部的东西、TDBGrid 的工件还是其他东西?

请允许我在这里强调一些我添加到以下评论之一的内容。最重要的是,我的帖子旨在让开发人员意识到,当他们使用可以更改列顺序的 DBGrid 时,他们的 TField 的顺序也可能会发生变化。该工件可能会引入难以识别和修复的间歇性和严重错误。而且,不,我不认为这是一个 Delphi 错误。我怀疑一切都按照设计的方式工作。只是我们中的许多人都不知道这种行为正在发生。现在我们知道了。

0 投票
5 回答
709 浏览

delphi - TClientDataset 组件应该放在哪里?

一些背景知识:我想开发一个桌面应用程序,以 SQL 数据库作为存储。一次只有一个用户连接到数据库。
为了使维护更容易,我想将 GUI 与 Busniss Logic 分开。因此,我想为每个 Dialog 使用 DataModule(实现 BL 的地方)。

我的问题:插入 TClientDataset 组件的合适位置在哪里?直接在 Dialog 中还是在 DataModule 中?

0 投票
2 回答
1411 浏览

delphi - 使用 TClientDataSets 发送文件

如何使用 TClientDataSet 发送文件?

我正在使用Delphi2010

谢谢

弗拉基米尔

我对这种混乱感到抱歉,我的意图是将 pdf 文件从一个 TCLientDataSet 发送/传输到另一个...我们正在使用 MIDAS...谢谢

0 投票
3 回答
7487 浏览

delphi - DataSetProvider - 数据集到 ClientDataSet

编辑:似乎 DataSetProvider 没有我需要的这个项目的功能,所以我将实现一个自定义类来将数据加载到 ClientDataSet 中。

我正在尝试从连接到我的数据库的 TMSQuery 中获取数据,并使用 DataSetProvider 使用其中一些数据填充 ClientDataSet。

我的问题是我需要修改其中一些数据才能进入我的 ClientDataSet。ClientDataSet 具有与原始数据库数据不匹配的持久字段。我什至无法将数据库中的字符串放入 ClientDataSet 的备注字段中。

ClientDataSet 是我的数据层的一部分,因此我需要将数据库中的数据逐个字段与 ClientDataSet 保持一致(当然大多数都可以直接通过,但许多需要路由和/或转换)。

这个事情谁有经验?

0 投票
3 回答
2580 浏览

delphi - 在 TClientDataset 的 ReconcileError 方法中处理多条记录中的更新错误

我正在尝试使用 ReconcileError 事件来允许用户在特定记录中发生更新错误后更正数据。

例子:

我有一个包含一个字段和 3 条记录的数据集,该字段对数据库有一个唯一约束,然后当它到达数据库时我将一个值更改为冲突,然后我在数据集上调用 ApplyUpdates。

这将在提供程序中生成错误(违反唯一约束)并中止 applyupdates 过程,并在 ReconcileError 方法的 Action var 中返回 raAbort。

在我尝试使用的 ReconcileError 方法中:

** 编辑 **

在调试和转储服务器返回的数据集记录后,我注意到这个数据集中有两条记录,第一条是旧记录,第二条是我对第一条记录所做的所有更改。

我有点困惑,我总是会得到这个带有 2 条记录的 DataSet 吗?我认为它应该只有一个旧/新值的记录。

谢谢。

0 投票
4 回答
3854 浏览

delphi - 捕获 TClientDataSet.CommandText 中的错误

我有一个连接到 TDataSetProvider 的 TClientDataSet,而 TDataSetProvider 又连接到 TAdsQuery。我设置了 SQL 命令,然后像这样打开 ClientDataset:

但是,如果 CommandText 中的 SQL 语句失败(语法错误或其他),我会在 Advantage 代码中得到一个异常,但它永远不会在我自己的异常处理代码中被捕获。

我有什么办法可以捕获此错误并将其很好地报告给用户。或者,有没有办法在执行 SQL 查询之前验证它的语法?

我正在使用 Delphi Pro 2009 和 Advantage Local Server 9。

0 投票
2 回答
2066 浏览

delphi - Delphi 客户端数据集查找/聚合

在 Delphi 中,我需要一些有关 ClientDatasets 的帮助。

我想要实现的是一个显示客户的网格,其中一列显示每个客户的订单数量。我将 ClientDataset 放在表单上并从 Delphi 演示数据加载 Customers.xml。另一个 ClientDataset 加载了 orders.xml。相对简单,我可以在订单 CDS 上定义一个聚合,显示每个客户的总金额(或计数)。(请参阅 Cary Jensens 关于此的文章:http ://edn.embarcadero.com/article/29272 )问题是从订单数据集中获取此汇总结果到客户数据集中。

这是一种反向查找,因为客户和订单之间存在 1-n 关系,而不是查找场景中通常的 n-1。

有任何想法吗 ?

索伦

0 投票
1 回答
862 浏览

delphi - tclientdataset 的 delta 属性

有人知道如何明确清除 TclientDataSet 增量中的数据吗?不使用 applyupdates

在此先感谢,维杰。