问题标签 [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 回答
1974 浏览

delphi - “参数无值”错误消息

我是 Delphi7 的新手。

当我尝试在 TClientDataSet 对象上使用编辑器的“添加所有字段”功能时,会出现一个消息框(经典的错误消息框),并显示消息“参数没有值'(参数的名称)'”。
我不能再使用“所有字段”功能添加字段。
如何找到“无参数值”错误的来源?

0 投票
3 回答
3528 浏览

delphi - 使用带有单独 DataSetProvider 的 ClientDataSet.AppyUpdates 的主详细信息

我将两个 ClientDataSet 用于主从关系,并为每个 CDS 使用一个 DataSetProvider。我不对细节使用嵌套 CDS,因为我对主从关系进行了内存过滤。

我遇到的问题是当我需要将更改应用到底层数据库(火鸟)时。对于细节插入,我必须先应用主,对于细节删除,我必须先应用细节(不违反数据库中的主从关系)。到目前为止,一切都很好。但是,当我的详细 CDS 包含 INSERT 和 DELETE 时,我该怎么办?然后我不能在主 CDS 之前或之后应用它。

在不使用嵌套 CDS 的情况下如何处理这种情况?

0 投票
2 回答
5080 浏览

delphi - 如何在 BIGINT (TLargeintField) 的 TClientDataSet 中使用聚合字段?

我需要计算一个字段的最大值,但我在这样做时遇到了麻烦。假设我的字段名为“VALUE0”。我想使用 TClientDataSet 的聚合函数来做到这一点。我该怎么办?

此代码只会在我的 SQL 表中为 BIGINT 的字段中失败:

我在“cds.Open”行得到这个异常:

编辑

根据评论中的要求,VALUE0 的字段的类名是 TLargeintField,FieldKind 是 fkData。

编辑 2

更改了文本中的问题和某些部分,因为现在我知道问题出在 TClientDataSet 聚合函数中的 BIGINT 与 INTEGER 之间。

0 投票
0 回答
843 浏览

delphi - TClientDataSet and processing records with StatusFilter

I'm using a TClientDataSet as a local dataset without the provider concept. After working with it a method is called that should generate the corresponding SQL statements using the StatusFilter to resolve the changes (generate SQL basically).

This looked easy initially after reading documentation (set StatusFilter to [dsInsert], process all inserts SQL, set StatusFilter to [dsModified] process all updates, the same with deletes) but after a few tests now looks far from trivial, for example:

If I add a record, then edit it: setting the StatusFilter to [dsInserted] displays it, but with the original data.

If I add a record, then edit, then delete it: the record appears with StatusFilter set to [dsInserted] and [dsModified] also.

And other similar situations..

1) I know that if first I process all inserts, then all updates then all deletes the database will be updated in the correct state but it looks far from right this approach (generating useless sql statements).

2) I've tried to access the PRecInfo(ClientDataSet.ActiveBuffer + ClientDataSet.RecordSize).Attribute information (dsRecNew, dsRecOrg, etc.) but still not manage to resolve the logic.

3) I can program the logic to resolve it, for example before processing and insert, set StatusFilter to [dsDeleted], and locating by the primary key if the record to see if its deleted thereafter.. the same with edits, before inserting, checking if the record was updated after so the insert sql in the updated version and so on.. but it should be more easy..

¿Did someone tried to solve this in an elegant and straightforward way? ¿I'm missing something? Thanks

0 投票
1 回答
9867 浏览

delphi - Delphi TClientDataSet 定位问题

我正在使用Delphi7,MS VistaDevart's dbExpress驱动程序(4.70 版)。我放弃 a TSQLConnection, a TSQLTable( tabA), a TDataSetProvider, a TClientDataSet( cdsA), aDataSource和 a DBGrid

我通过图形设计工具进行了所有设置。一切正常,当我打开cdsA时,我可以看到 Grid 中的所有数据。这是我的代码:

fieldA并存fieldB在于表中,也定义于其中cdsA.Fields。当我执行此代码时,Locate指令会生成异常EVariantInvalidArgError ... Invalid argument。我想知道怎么了。TIA。

弗朗切斯科

0 投票
1 回答
1022 浏览

sql-server - 使用公文包模型的本地 TClientDataSet 上的主键

当 DataSnap 客户端应用程序连接到 DataSnap 服务器的远程数据模块并使用TDataSetProvider+TClientDataSet时,它会缓存客户端应用程序本地的数据库表(或视图)。用户可以在本地对 TClientDataSet 中的数据进行更改,ApplyUpdates(0)并将更改与服务器同步。这一切都说得通。

使用 SQL Server 2008 db,主键可以是identity一个字段或GUID字段。假设用户在向本地添加新记录时会离线,那么当用户创建TClientDataSet记录时,本地TDataSetProvider和处理主键字段的分配如何?由于本地创建的记录可能是主/从关系的一部分,因此需要在本地创建新的主键似乎是合乎逻辑的。当用户执行“ApplyUpdates(0)”时,如何解决?TClientDataSet

当几个用户在离线模式下创建记录时,当他们每个人都做一个时如何解决主键冲突ApplyUpdates(0)

领域比identity领域更好GUID,反之亦然?为什么?

0 投票
1 回答
2004 浏览

delphi - 协调错误:有人遇到过截断错误消息的问题吗?

我又来找你帮忙了。这一次我相信很少有人会回应,因为我将要提到的问题非常特殊。我从 DataSnap 的世界开始,仍然有一些我不明白我将如何关联这个错误的事情。

我的 Delphi 是 XE(版本 1,Update1)。我正在使用 Postgres,它会在葡萄牙语(巴西葡萄牙语)中生成错误消息,因此错误消息带有重音符号。连接组件是 ZeosLib 包。

我正在使用对话框“协调错误”来显示因应用更新而产生的错误并进行测试,我试图插入一条已经存在的记录,从而违反了唯一键,从而显示了协调错误对话框。

在对话框的备忘录中,出现的消息被截断,即截断。看看这个:

但实际上应该返回的是这样的:

我在服务器上做了debug,看看是不是ZeosLib的问题,但是发现服务器上生成的错误信息是完整的,证明ZeosLib没有截断信息。一切都是unicode。在我的程序和 ZeosLib 中,所有字符串都是 WideString(默认)。

众所周知,要在服务端抛出,异常是通过DataSnap转发到客户端,而在客户端,TClientDataSet的Reconcile方法验证是否有问题,然后抛出著名的异常EReconcileError,可以在 TClientDataSet 的 OnReconcileError 事件中处理,因此我相信该消息正在被 DataSnap 截断。

在客户端上,我调试 Reconcile 方法 (DBClient.pas) 并在抛出异常之前立即进入 cpp 源代码中的函数,我认为该函数是 midas.dll 库的一部分,更具体地说是 MidasLib.obj,因为我是使用此策略,不必将 DLL 与我的应用程序一起分发。

此调用在 Delphi XE Update1 上的单元 DBClient.pas 的第 1952 行完成。按 F7,调试器进入源 C++ (cpp),所以我相信它在 midaslib.obj 中。我怎么不太懂 C++,我按 Shift-F8 退出当前方法并返回下一条指令,该指令已经在事件 OnReconcileError 中!!因此,截断必须在我提到的函数内、cpp 源代码内、midaslib 内完成。

我的目的是使 Reconcile Error 对话框不仅成为最终用户的工具,而且还支持个人,分别提供错误、详细信息和上下文信息。这对发现问题有很大帮助。

现在的问题是使消息完整显示。有没有人遇到过这种消息被 midas 截断的问题?

还有一点 DSClient.pas 我可以提取错误消息,因为它被传递给异常:

如果您删除引号并将#$A(1 个字符)替换为一个空格(一个字符),您将看到该字符串正好有 255 个字符!!

我还发现 dspickle.cpp 中的“GetErrorString”使用在 bdetypes.h 中定义为 127(255 的一半)的常量 DBIMAXMSGLEN。就像我们在 Unicode 的世界中一样,将这个值增加到 255 以便每个字符有两个字节不是问题吗?这只是猜测...

我把这个问题悬而未决,因为我缺乏理解 C++ 的知识 :) 谁能帮忙,看看 dspickle.cpp 中的函数实现“GetErrorString”。有这个:

pString 是错误消息并且 DBIMAXMSGLEN = 127。

0 投票
2 回答
2010 浏览

delphi - Delphi TClientDataSet,每个索引的最大字段数

我有一个简单的 Delphi (2007) 过程,它给定一个 TDataSet 和一个(子)字段列表,返回一个新的 TClientDataSet,它具有来自给定 TDataSet的不同值。

这工作得很好。

在我的过程中,我使用 TClientDataSet 索引来填充不同的值。它又快又容易。

问题是 TClientDataSet 索引最多支持 16 个字段。如果您添加更多它们,它们将被默默地忽略。

我需要数据集中超过 16 个字段(因此在索引中)。

有什么解决办法吗?一些黑客?也许一些开源库可以用作解决方法?

我正在离线工作,所以我必须在内存中进行。数据集的大小不是很大

0 投票
2 回答
987 浏览

delphi - Delphi 不会让我插入缺少列的行,但会为这些字段添加触发器和生成器

问题很简单:我的 Firebird 2.1.4 数据库中有触发器和生成器,可以在每次插入时自动增加列。

系统架构如下:

但是,如果我尝试在我的 TClientDataSet 中发布一些缺少列的更新,Delphi 会这样抱怨:

如果我在缺少这些字段的情况下使用 SQL 插入语句,则会插入行并且触发器和生成器按预期工作。

我如何让 Delphi(DBX、DataSnap 等)理解我想要做什么(并允许它)?

编辑

根据@mj2008 的评论提供更多信息:此 TClientDataSet 是在运行时使用 CloneCursor 方法创建的。调用 CloneCursor 后,我将此字段的 Required 属性设置为 False。它对这个问题没有帮助。例子:

这导致抛出相同的异常。

0 投票
2 回答
1709 浏览

delphi - 如何从属性Required设置为false的字段中检索信息?

我的软件中有以下 DBX 结构:

我的 TClientDataSet 中的一个字段将Required 属性设置为false,因为该字段会根据数据库(Firebird)上的触发器和生成器自动递增。

但是,在配置了不需要此字段的 TSQLDataSet 和 TClientDataSet 之后,当我尝试从 TClientDataSet 中读取此字段时,我得到了非常奇怪的结果。我怀疑我可能需要做一些额外的事情来强制我的 TClientDataSet 在这种情况下获取该字段的值。

我在这里想念什么?

提前致谢。

编辑

Required 属性的帮助文件说明了这一点,但我不太明白它要我做什么。

描述

指定是否需要字段的非空值。

使用必填来确定字段是否需要值或该字段是否可以为空。

如果字段是使用字段编辑器创建的,则此属性是根据基础表设置的。对于必须具有值(例如,密码或部件号)但基础表不需要该字段的字段,将 Required 设置为 true 的应用程序必须编写 OnValidate 事件处理程序以强制执行该属性。

当Required 属性反映基础数据库表的属性时,尝试发布应用空值会导致引发异常。当基础表不需要该字段时,将 Required 属性设置为 true 的应用程序应在 OnValidate 事件处理程序中针对空值引发 EDatabaseError 异常,以实现相同的结果。

编辑 2

忘了说:在 TDataSetProvider 和 TClientDataSet 之间,有一个 DataSnap 层(TClientDataSet 连接是通过 DataSnap 驱动建立的)。

编辑 3

我用这个 DataSnap 设置创建了一个小测试用例,它运行良好。该项目是遗留的,混乱的,我想要么我在某个地方配置了一个模糊的选项,这让我很痛苦,要么我偶然发现了一个 DataSnap 错误。