问题标签 [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 投票
0 回答
1162 浏览

delphi - Delphi:ResolveToDataset 问题

我正在TClientDataset为提供程序使用以下选项:

提供程序连接到管理 NO_INVOICE 密钥生成器的 TIBCQuery。

在 AfterUpdateRecord 上完成了以下代码(如在组中的许多地方发现的那样,在发布到数据库时真正传播密钥更改)

然后使用以下代码添加记录:

如果我ClientDataSet1.Refresh在 之后调用ApplyUpdate,则使用 -1 的原始参数而不是新键重新打开底层 TIBCQuery ......即使ClientDataSet1NO_INVOICE.AsInteger显示合并记录后分配的新值......这里使用 Refresh 只是为了简化此示例...当我们插入记录、应用更新并再次编辑记录时,就会出现问题。

我是否错过了使用该ResolveToDataset选项的某些内容,还是应该使用新参数明确地重新打开查询?

我以前在其他项目上使用时从未遇到过这个问题ResolveToDataset = False......

0 投票
2 回答
1477 浏览

delphi - 使用 poFetchBlobsOnDemand 时检查是否已获取 blob 字段的正确方法

我有一个带有多条记录的 TClientDataSet,我想加载所有记录,但一次加载一个按需加载 blob 字段。

我注意到调用 FetchBlobs 两次获取 blob 两次,并且检查字段的 IsNull 属性总是返回 False。

因此,到目前为止,我发现的唯一解决方案是访问 Value 或 BlobSize 之类的属性,如果尚未获取 Blob,则会引发 EDBClient 异常,并显示消息“尚未获取 Blob”,因此如果引发此异常,我将调用 FetchBlobs .

有没有更好的方法来做到这一点?

0 投票
1 回答
2400 浏览

sql - ClientDataset.RefreshRecord 在 Delphi XE 中不再适用于连接表 - 任何解决方法?

TClientDataset.RefreshRecord 在尝试刷新连接到在 SQL 语句中具有连接表的数据集的 ClientDataset 上的记录时,不再生成 SQL 的表连接部分。

因此,调用此方法会导致每个不在主表中的字段的SQL 错误“列名无效” 。

这在 Delphi 2010 及更早版本中不是问题。

连接到 TClientDataset 的 DBX4 或 BDE 组件都会发生错误,因此问题很可能是 TClientDataset 代码更改的问题。

要复制此问题:

在 Delphi XE 中创建一个只有一个表单的新应用程序,并将所需的数据库组件(TSQLMonitor、TSQLConnection、TSQLQuery、TDatasetProvider、TClientDataset、TDatasource 和 TDBGrid)放在上面并将它们相互绑定。

创建了一个带有表连接的简单 SQL 语句,并将其放在 TSQLDataset.SQL 属性中。

SQL 语句仅包含两个字段 - 主表的键字段和连接表中的字段 - 例如在伪代码中:

将这两个字段作为持久字段添加到 TSQLQuery 和 TClientDataset 中,并为包括 pfInKey 在内的关键字段提供 Provider 标志(如果不知道哪个字段是关键字段,RefreshRecord 将不起作用,因此必须使用持久字段)。

在表单上添加两个按钮 - 一个只是打开 Clientdataset,第二个按钮调用 clientdataset.refreshrecord;

运行应用程序,按下按钮以打开数据集并在网格中显示数据。

按刷新记录按钮,您将收到连接字段的 SQL 错误“列名无效”。

关闭应用,打开 SQLMonitor 日志,在 Delphi 生成的刷新记录 SQL 语句中,你会看到它没有包含 table join 语句。

====

我非常感谢有关如何解决此问题的任何想法。

0 投票
1 回答
5346 浏览

delphi - Delphi:如何仅聚合 TClientDataset 中的范围记录?

我需要使用 TClientdataset进行一些聚合。在 SQL 中,这些聚合可以使用如下脚本完成:

因为在很长的过程和很慢的网络中我需要更快的速度,所以我想使用内存聚合而不是使用 sql 。我的想法是使用如下表达式向 ClientDataset 添加聚合:

并创建 Date_Column 索引,然后像这样过滤客户端数据集:

我期待看到这个范围的聚合结果,但不幸的是,聚合忽略了范围并继续给出所有记录的结果!

所以,我的问题是:如何在 TClientdataset 中实现这一点?或者,您还有其他想法如何在内存中进行范围聚合?

0 投票
1 回答
4257 浏览

delphi - TClientDataSet 不释放内存

我有一个 DataSnap 服务器,它创建一个 TSQLQuery、TDataSetProvider 和一个 TClientDataSet,它们对给定用户的会话是唯一的,用于从数据库中检索数据并将 TClientDataSet.Data(一个 OleVariant)发送到客户端。它工作得很好,除了一个问题。

当我通过调用其 Open 方法填充 TClientDataSet 时,分配的内存不会被释放,直到用户断开其客户端与 DataSnap 服务器的连接。随着用户使用应用程序并继续从 DataSnap 服务器检索数据,内存继续被分配(数百兆)。当用户断开连接时,所有内存都被释放。它需要在每次请求后释放分配的内存,以便长时间连接的用户不会因消耗所有 RAM 而导致服务器崩溃。

我认为在用户请求数据时创建 TSQLQuery、TDataSetProvider 和 TClientDataSet 组件可能会起作用,然后在每次请求后立即销毁它们。这并没有改变行为。RAM 继续分配,直到用户断开连接才释放。

为什么 DataSnap 服务器在使用 TClientDataSet 时要保留分配的内存,即使每次请求后组件都被销毁?

谢谢,詹姆斯

<<< 编辑:2011 年 7 月 7 日下午 6:23 >>>

根据 Jeroen 的建议,我创建了一个复制问题的小程序。有两个部分,服务器(4 个源文件)和客户端(4 个源文件)。如果有将文件附加到此讨论的功能,我还不能使用它 - 没有足够的声誉点...,所以我粘贴下面的代码。服务器是一项服务,因此必须在构建后进行注册(例如,C:\ProjectFolder\Server.exe /install)。

在构建服务器之前,设置 SQLConnection1 的属性,并编辑 ServerMethodsUnit1.pas 中的 SQL 语句。查看内存分配问题的唯一方法是在每个请求中检索相当数量的数据(例如,500k)。我要查询的表包括uniqueidentifiervarchar(255)varchar(max)nvarchar(max)intbitdatetime其他列。我验证了所有数据库数据类型都存在内存问题。传输到客户端的数据集越大,服务器在不释放内存的情况下分配内存的速度就越快。

构建两个应用程序并注册/启动服务后,使用 ProcessExplorer 查看服务器服务使用的内存。然后启动客户端,点击连接,点击按钮获取数据。请注意 ProcessExplorer 中服务器的内存增加。单击断开连接,观察内存全部释放。

服务器.dpr

ServerContainerUnit1.dfm

ServerContainerUnit1.pas

ServerMethodsUnit1.pas

客户端.dpr

ClientUnit1.dfm

ClientUnit1.pas

代理方法.pas

0 投票
2 回答
1854 浏览

oracle - 在 ADO 中具有 ftBCD 数据类型参数的 oracle 中的数字列发生“未指定错误”(OleDB 的 Oracle 提供程序)

我用 ADO + DataSetProvider + ClientDataSet 编写了一个 delphi。在 ClientDataSet 的 ApplyUpdates 中,这会生成带有基于字段数据类型的参数的 ADO 命令。

当参数为 ftBCD 时,发生“未指定错误”。如果您更改 ftFloat、ftExtended 或 ftCurrency 的数据类型,则该命令将成功执行。但是使用 ADO+ClientDataSet 不能改变参数的数据类型。使用的提供程序是“Oracle Provider for OleDB”。

“Microsoft provider OleDB for oracle”执行没有问题,但速度很慢,而且我的 CLOB 列有问题。oracle是11g,客户端是11.2.0.2。

Delphi 是 Delphi XE。错误示例代码:

0 投票
2 回答
6354 浏览

delphi - SQL Server 2008 中的 Delphi TClientDataSet“尝试修改只读字段”错误,2000 中可以

Embarcadero® Delphi® 2010 版本 14.0.3593.25826

我们正在尝试将数据库从 SQL Server 2000 移动到 SQL Server 2008。我有一个 TClientDataSet,它加载了一个包含计算列的 SELECT,即“SELECT Comp_Col = Column1 + '' + Column2 ...”。

针对 SQL Server 2000 数据库运行,我可以使用以下代码修改 TClientDataSet 中列的值:

但是,针对 SQL Server 2008 数据库运行时,我在执行 .Post() 时收到“尝试修改只读字段”错误。

我还尝试在上面的代码中为列设置 .ProviderFlags = '[]'(除了 .ReadOnly = false),但仍然出现错误。我还尝试在设计时通过 IDE 设置 .ReadOnly = false 和 .ProviderFlags = '[]' ,但这也无济于事。

有人知道在针对 SQL Server 2008 数据库运行时如何在 TClientDataSet 中设置计算列吗?

谢谢!

*更新:已回答*

我发现了问题——或者至少是一种解决方法……

我为TClientDataSet对象中的列设置 .ReadOnly = false 这适用于 SQL Server 2000,但不适用于 SQL Server 2008。

如果我为列设置 .ReadOnly = false而不是在作为提供者的TADOQuery对象中设置,那么我可以在运行时在 TClientDataSet 对象中设置计算列的值。

对我来说并不理想,因为这是在 TClientDataSet 对象的通用函数中实现的(与提供者无关),但现在必须这样做。

0 投票
1 回答
4406 浏览

delphi - “操作不适用”异常

我正在delphi6中开发一个应用程序。
我有一个 ClientDataSet (cds)、一个 DataSetProvider (dsp) 和一个 DataSource (ds),ds 的 DataSet 是 cds,而 cds 的 ProviderName 是“dsp”。
我在某些特定条件下将一些记录添加到 CD 中。
在我为 cd 设置过滤器并将其 Filtered 属性设置为 True 后,当我想关闭它时,即使我清除了 Filter 属性并将 Filtered 属性设置为 false,它也会通过“操作不适用”消息引发异常。
如何正确关闭 ClientDataSet?

0 投票
2 回答
2529 浏览

delphi - Delphi 2006 TClientDataSet 索引问题

我使用ClientDataSet带有DataSetProvider链接到本地​​数据集的 a。当我想编辑 DataSet 中的数据时,我打开 ClientDataSet 并向其添加一些索引。完成数据编辑后,我关闭 ClientDataSet。一切正常,除了当我再次打开 ClientDataSet 并选择一个索引时,它会抛出异常消息"index 'xxx' not found". 我做错了什么?

下面是打开 ClientDataSet 的代码:

DM.tblCCardDep 是 ClientDataset

0 投票
3 回答
3467 浏览

mysql - Delphi 2010 MySQL更新通过ClientDataSet失败

我正在使用 Delphi 2010 并使用 dbexpress 连接到 MySQL 数据库。连接工作 100%,我正在检索我的数据。当我尝试通过 dbGrid 更新数据时,问题就来了。我正在遍历表中的所有条目,对它们进行检查。调用 ApplyUpdates 方法时,我收到“未找到记录或其他用户更改记录”。

将 DataSetProvider 上的 updateMode 更改为 upWhereKeyOnly,我现在处于收到“无法找到记录,未指定密钥”的情况。我试过添加

这是代码,但我得到了同样的错误。我尝试将 ProviderFlags 添加到 SQLQuery,但我没有得到这样的字段“idPolicy”