问题标签 [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 - 主详细信息中的 TClientDataset 未关闭详细信息查询
我使用一个提供程序在主详细信息中有 2 个 ClientDatasets。2 个基础查询作为主详细信息与数据源连接,并且主查询将详细信息作为字段 (TDatasetField)
我的问题是关闭主(甚至是细节)数据集会关闭主查询,但细节没有关闭......如果我们稍后尝试使用相同的参数重新启动相同的查询,则会导致问题。
我认为无论如何都应该关闭详细查询...
有什么帮助吗?
谢谢
c++builder - 使用 VCL 组件在网格中显示非常大的数据集
我的 C++ CAD 应用程序维护用户建模操作的日志,以便可以取消应用和重新应用它们。任何特定项目可能只包含几个操作,也可能包含数十万个操作。我已经有了自己的数据结构,可以以一种内存效率高的方式管理这些数据,而且效果很好。但现在我添加了一个功能,允许用户在网格中检查他的操作日志。(我使用的是 Embarcadero RAD Studio 2010;所有 GUI 都使用 VCL。)
目前,我正在使用 TDBGrid 组件向用户显示行中的操作数据。这是我连接组件的方式:
TDBGrid.DataSource = 一个 TDataSource
TDataSource.DataSet = 一个 TClientDataSet
TClientDataSet.ProviderName = 一个 TDataSetProvider
TDataSetProvider.DataSet = 一个 ProjectDataSet
ProjectDataSet 是我从 TDataSet 派生的一个类。
因为我是从我自己的数据结构中而不是从数据库中提取操作数据,所以我在我的 ProjectDataSet 类中覆盖了 GetFieldData 和 GetRecord 函数(以及其他几个函数),以便它直接从我自己的数据结构中返回数据(不做任何数据库查询)。这行得通。
为了在显示大量操作时最大限度地减少内存使用,我在 TClientDataSet 中设置了“FetchOnDemand”属性,并将“PacketRecords”设置为 100。因此,最初只有前 100 个操作出现在网格中。一旦用户滚动到网格底部,接下来的 100 个操作将由 TClientDataSet 自动获取并显示在网格中。
所有这些都非常有效。我的问题是,当用户在网格中滚动时,TClientDataSet 会继续获取越来越多的记录,而不会释放任何记录。因此,如果用户在一个非常大的项目中向下滚动足够远,我最终会耗尽内存。
所以,我的问题是:让这个 GUI 工作的最佳方法是什么?本质上,我希望网格表现得像电子表格。我希望用户能够在操作列表中上下滚动(或跳转到特定行),不管有多少操作,我不希望 GUI 组件在内存中保留很多东西用户并不迫切需要。
我假设 TDBGrid(或其他一些 VCL 组件)旨在通过一次仅获取几条记录来显示任意大的数据集,那么它是如何完成的呢?
如果我需要重新考虑 GUI,那很好。但是如果我可以使用同一个 GUI 来显示 10 个操作项目或 100,000 个操作项目,那就太好了。
谢谢。
performance - ClientDataset 性能 TBlobfields
打开一个 TClientDataset,并获取包含 3 个 TBlob 字段的 10.000 行需要3 分钟。
打开完全相同的数据,但将 BLOB 字段转换为 Varchar,需要1 秒!
唯一的区别是,TQuery(或 TsqlQuery)有 TStringfields,而不是 TBlobfields。但数据是一样的。保存到文件的整个表大约为 3 MB。我使用 TsqlQuery 或 TQuery 连接到(火鸟)数据库得到了相同的结果。
该数据库位于运行 Firebird 2.1 的服务器上。在客户端上运行数据库时(两者都<1秒),差异消失了,所以我想它一定是网络流量的东西......
它变得更加奇怪:客户端数据集实际上是否填充了 BLOB 字段并不重要。所以,如果客户端数据集只有 1 个持久字段(数字整数),性能是一样的......
这个错误(?)对我来说是个大问题......我希望有人能解释一下......
delphi - 当我在 Delphi 中使用 SOAP 通过 SOAP 将数据远程读取到客户端数据集中时,从 TXMLTransform 发送的 XML 解析错误是什么意思?
前段时间我问了另一个与 SOAP 相关的问题,它要求为 Delphi XE 及更高版本提供一个工作的 Soap 客户端和服务器。
没有人有开箱即用的解决方案,所以我将 Delphi 2007 时代的演示恢复为 Delphi XE 和 XE2 的工作状态。我有演示工作,我有一个基于 INDY VCL 表单的服务器(在 Indy 上运行的独立 HTTP 服务器)和一个 Soap 服务器。服务器演示的两个部分是“自定义方法”(普通的soap 函数调用)和“远程数据集”。这是我无法工作的远程数据集。
当我将客户端数据集设置为活动时,我遇到的错误出现在客户端表单中,当我在演示客户端中执行此行时,服务器发回异常:
这又会通过这个 RIO 调用进入 DBClient.pas 代码, TDataSet.OpenCursor
调用 DoGetRecords
试图从中读取的ProviderName = 'XMLTransformProvider1'
调用:
这会以典型MessageBox
形式显示此异常:
Indy Soap 数据模块的服务器端异常调用堆栈如下所示:
我相信正在发生的是我们得到一个空的 HTTP 响应。如果没有任何效果,这对我来说非常有意义,并且我们正在访问的 HTTP url 不起作用。我们正在访问的网址是,并且可以通过网络浏览器访问:
返回到导致错误消息的客户端的 XML 如下所示:
我的问题是:这个 SOAP 错误的真正含义是什么,为什么会发生,你如何解决它?
c++ - CDS 客户端数据集文件 - 是否有其他方法来操作这些文件?
我有一个 C++ 应用程序,它历史上使用 Delphi IClientTable 接口(MIDAS.DLL??)来维护本地文件数据库(.CDS 文件)。在我们的 C++ 应用程序中,IClientTable 是一个 COleDispatchDriver MFC 接口/对象。
我个人希望完全摆脱这一点并使用 SQLite,但不幸的是我现在无法做到这一点。
有人可以告诉我这个 COM 开销是否有开源替代品?我想要一个简单的 DLL、库或源文件集来编译到我的程序中,以摆脱让我非常痛苦的 COM 接口。
如果你真的想知道我为什么要去掉 COM 接口——这很奇怪——我们已经使用了 10 年没有问题。最近我们发现一个使用 Windows XP Embedded 的客户,由于某种原因,当我们使用 IClientTable COM 调度接口时,这会导致 Windows WM_QUERYENDSESSION 消息被吸收,或者不再到达我的应用程序。在我停止使用 IClientTable 接口的那一刻,我收到了 WM_QUERYENDSESSION 消息。
简而言之:IClientTable COM 调度接口似乎阻止了 Windows 被允许注销/关闭。
xml - 使用 TXMLTransformProvider 时控制 XML 节点的顺序
我正在使用 TXMLTransformProvider 使用 TClientDataSet 编辑 XML 文件(这很酷)。我希望能够控制 XML 文件中节点的顺序 - 使用主键或类似键。但是当我执行 ClientDataSet1.ApplyUpdates 时,新记录将添加到 XML 文件的末尾,而不是按照我的首选顺序(我在 DBGrid 中看到它们的顺序)。有没有一种简单的方法来保存我的订单,或者我是否必须放弃我的 TXMLTransformProvider 来保存数据并使用 TXMLDocument 手动对其进行编码。
database - 由于数据库表约束,TClientDataset ApplyUpdates 错误
我有一个旧的 Delphi 7 应用程序,它从一个数据库表中加载数据,进行许多操作和计算,最后将记录写入目标表。
出于性能原因,这个旧应用程序每 500 条记录调用一次 ApplyUpdates 。
问题是,有时,在这一堆记录中存在一个会触发数据库约束的记录;Delphi在 ApplyUpdates 上引发异常。
我的问题是我不知道是哪条记录导致了这个异常。有500名候选人!
是否可以询问 TClientDataset 哪个是违规记录?
我不想为速度问题对每个附加记录应用更新。
delphi - 为什么ClientDataSet 的Locate 方法找不到存在的记录?
每隔一段时间,以我无法预测的方式,代码行
解析为真(即,无法aName
在“名称”字段中找到字符串),即使我知道有记录。我可以关闭并重新打开应用程序,加载完全相同的文件,运行完全相同的命令——换句话说,重复我的所有操作——并让下一次一切都按预期工作。以及之后的时间。我什至可以重新打开同一个文件,代码将按预期运行......我不知道问题是什么,坦率地说,像这样断断续续的东西我什至不知道去哪里找!
关于从哪里开始有什么想法吗?...
delphi - 将数据从数据集结构移动到另一个结构的更快方法(在 TDatasetProvider 中)
我有一个自定义的 TDatasetProvider,它允许为它提供的任何数据创建新字段。
因此,假设您在原始数据集上获得了以下字段:
- 客户ID
- 姓名
- 年龄
您需要使用显示位图在 DBGrid 上选择它。好吧,你可以,因为我的 DSP 可以添加一个调用Selected
数据集数据的布尔字段。
我现在这样做的方式:
- 创建 2 个 TClientDataset 对象(Origin 和 Target)
- 在 Origin 中,我加载了从 InternalGetRecords 方法的参数中获取的数据(我覆盖了它)
- 在 Target 中,我创建了从 Origin 数据集定义的 fielddef,并添加了开发人员在设计时创建的 fielddef
- 在目标上执行 CreateDataset
- 并且,逐行(和逐字段)将数据从 Origin 数据库复制到 Target 数据集
- 最后,将 Data 变量作为 InternalGetRecords 的返回值返回。
我真的不知道是否有更优雅(更快)的方式来做到这一点。还有另一种(更快和/或优雅)的方式来获得这个结果吗?
delphi - DELPHI:将计算值放入主明细中,其中明细位于网格中
我使用 ClientDataSets(服务和插件)创建了一个主从关系。服务显示在 DBLookupComboBox (cboServices) 中,一旦选择了服务,插件就会显示在 DBGrid (grdMain) 中。
插件有一个复选框来指示插件被选中、一个名称字段、一个用户可以更改的数量字段、一个单价字段和一个总价字段。
我创建了一个 OnQuantityChange 方法来使用单价和数量更新总价,但是如何从行中获取实际数据来进行更新?如何引用各个字段以执行以下操作: