问题标签 [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.
delphi - 使用 TADOQuery 查询 TClientDataSet
我的问题很简单。我有一个通过 TDataSetProvider 链接到 TADOQuery 的 TClientDataSet。我可以将数据从 TADOQuery 放入 TClientDataSet,但是如何将 TClientDataSet 中的数据重新放入 TADOQuery?
当我运行查询然后将 TClientDataSet 的 Active 属性设置为 True 时,数据会自动从 TADOQuery 传输到 TClientDataSet,但是如果我停用 TADOQuery 然后再次激活它,如何从 TClientDataSet 中取回数据?
我在几个数据库上运行相同的查询并使用 TClientDataSet 连接结果。这工作正常。我现在的问题是我需要将连接的结果集从 TClientDataSet 中返回到 TADOQuery 中,以便我可以使用 TADOQuery 的 SaveToFile 过程(出于兼容性原因)。我怎样才能做到这一点?
delphi - “bof 或 eof 为真或当前记录已被删除..” 包含删除操作的 applyupdates 错误
我在解决从 ClientDatset 到 TAdoDataset(绑定到访问表)的删除操作时遇到此错误。我正在使用德尔福 2010。
我在 TClientDataset 和 TAdoDataset 之间的 DatasetProvider :
此函数发生错误,由 TDataSetResolver.EndUpdate() 调用;
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 错误。我怀疑一切都按照设计的方式工作。只是我们中的许多人都不知道这种行为正在发生。现在我们知道了。
delphi - TClientDataset 组件应该放在哪里?
一些背景知识:我想开发一个桌面应用程序,以 SQL 数据库作为存储。一次只有一个用户连接到数据库。
为了使维护更容易,我想将 GUI 与 Busniss Logic 分开。因此,我想为每个 Dialog 使用 DataModule(实现 BL 的地方)。
我的问题:插入 TClientDataset 组件的合适位置在哪里?直接在 Dialog 中还是在 DataModule 中?
delphi - 使用 TClientDataSets 发送文件
如何使用 TClientDataSet 发送文件?
我正在使用Delphi2010
谢谢
弗拉基米尔
我对这种混乱感到抱歉,我的意图是将 pdf 文件从一个 TCLientDataSet 发送/传输到另一个...我们正在使用 MIDAS...谢谢
delphi - DataSetProvider - 数据集到 ClientDataSet
编辑:似乎 DataSetProvider 没有我需要的这个项目的功能,所以我将实现一个自定义类来将数据加载到 ClientDataSet 中。
我正在尝试从连接到我的数据库的 TMSQuery 中获取数据,并使用 DataSetProvider 使用其中一些数据填充 ClientDataSet。
我的问题是我需要修改其中一些数据才能进入我的 ClientDataSet。ClientDataSet 具有与原始数据库数据不匹配的持久字段。我什至无法将数据库中的字符串放入 ClientDataSet 的备注字段中。
ClientDataSet 是我的数据层的一部分,因此我需要将数据库中的数据逐个字段与 ClientDataSet 保持一致(当然大多数都可以直接通过,但许多需要路由和/或转换)。
这个事情谁有经验?
delphi - 在 TClientDataset 的 ReconcileError 方法中处理多条记录中的更新错误
我正在尝试使用 ReconcileError 事件来允许用户在特定记录中发生更新错误后更正数据。
例子:
我有一个包含一个字段和 3 条记录的数据集,该字段对数据库有一个唯一约束,然后当它到达数据库时我将一个值更改为冲突,然后我在数据集上调用 ApplyUpdates。
这将在提供程序中生成错误(违反唯一约束)并中止 applyupdates 过程,并在 ReconcileError 方法的 Action var 中返回 raAbort。
在我尝试使用的 ReconcileError 方法中:
** 编辑 **
在调试和转储服务器返回的数据集记录后,我注意到这个数据集中有两条记录,第一条是旧记录,第二条是我对第一条记录所做的所有更改。
我有点困惑,我总是会得到这个带有 2 条记录的 DataSet 吗?我认为它应该只有一个旧/新值的记录。
谢谢。
delphi - 捕获 TClientDataSet.CommandText 中的错误
我有一个连接到 TDataSetProvider 的 TClientDataSet,而 TDataSetProvider 又连接到 TAdsQuery。我设置了 SQL 命令,然后像这样打开 ClientDataset:
但是,如果 CommandText 中的 SQL 语句失败(语法错误或其他),我会在 Advantage 代码中得到一个异常,但它永远不会在我自己的异常处理代码中被捕获。
我有什么办法可以捕获此错误并将其很好地报告给用户。或者,有没有办法在执行 SQL 查询之前验证它的语法?
我正在使用 Delphi Pro 2009 和 Advantage Local Server 9。
delphi - Delphi 客户端数据集查找/聚合
在 Delphi 中,我需要一些有关 ClientDatasets 的帮助。
我想要实现的是一个显示客户的网格,其中一列显示每个客户的订单数量。我将 ClientDataset 放在表单上并从 Delphi 演示数据加载 Customers.xml。另一个 ClientDataset 加载了 orders.xml。相对简单,我可以在订单 CDS 上定义一个聚合,显示每个客户的总金额(或计数)。(请参阅 Cary Jensens 关于此的文章:http ://edn.embarcadero.com/article/29272 )问题是从订单数据集中获取此汇总结果到客户数据集中。
这是一种反向查找,因为客户和订单之间存在 1-n 关系,而不是查找场景中通常的 n-1。
有任何想法吗 ?
索伦
delphi - tclientdataset 的 delta 属性
有人知道如何明确清除 TclientDataSet 增量中的数据吗?不使用 applyupdates
在此先感谢,维杰。