问题标签 [tdatasetprovider]
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 - 将数据从数据集结构移动到另一个结构的更快方法(在 TDatasetProvider 中)
我有一个自定义的 TDatasetProvider,它允许为它提供的任何数据创建新字段。
因此,假设您在原始数据集上获得了以下字段:
- 客户ID
- 姓名
- 年龄
您需要使用显示位图在 DBGrid 上选择它。好吧,你可以,因为我的 DSP 可以添加一个调用Selected
数据集数据的布尔字段。
我现在这样做的方式:
- 创建 2 个 TClientDataset 对象(Origin 和 Target)
- 在 Origin 中,我加载了从 InternalGetRecords 方法的参数中获取的数据(我覆盖了它)
- 在 Target 中,我创建了从 Origin 数据集定义的 fielddef,并添加了开发人员在设计时创建的 fielddef
- 在目标上执行 CreateDataset
- 并且,逐行(和逐字段)将数据从 Origin 数据库复制到 Target 数据集
- 最后,将 Data 变量作为 InternalGetRecords 的返回值返回。
我真的不知道是否有更优雅(更快)的方式来做到这一点。还有另一种(更快和/或优雅)的方式来获得这个结果吗?
delphi - TClientDataSet 错误“尝试修改只读字段”
我使用下一个链
获取 Items 和 ItemType 表的数据并离线使用。项 TADOQuery 的 SQL 属性包含一个简单的查询
ItemType 更简单:
现在 - 对于 cdsItems,我将 TypeName 字段修改为查找字段并将其链接到 cdsItemType - 没什么不寻常的 - 并将 cdsItems 绑定到网格。但是当我尝试通过在网格中使用组合框来修改数据时 - 它会引发错误“尝试修改只读字段”。
我设置为 TCliendDataSet ReanOnly:= false 的所有字段。此外,在我将数据输入 TClientDataSets 之后 - 使用 for - 我再次将所有字段设置为 ReadOnly:=False。但即便如此,我仍然得到“尝试修改只读字段”。
使用的数据库是 MS SQL Server 2005 Express 版本。
delphi - ClientDataSet 仅从 TADOQuery 传输部分数据
我有两个数据库,我需要确保一个数据库中的所有记录在另一个数据库中都有匹配的记录。我将这些称为 DB-SQL 和 DB-Legacy
如果两者都有 SQL 接口,这将很容易,但不幸的是,我只有这种类型的访问权限,另一个我有一个“查找记录/第一个/下一个”类型的接口。
我选择执行此任务的方法是通过以下代码将 DB-SQL 传输到客户端数据集:
这是基于http://www.podgoretsky.com/ftp/docs/Delphi/D5/dg/5_ds3.html#20536的代码
然后,这将允许我使用 First/Next 直到 EOF 迭代 DB-legacy,使用 FindKey 搜索 ClientDataSet 以确保 DB-Legacy 中的所有记录都存在于 DB-SQL 中。通过将 FoundInGIS 标记设置为 1,我可以按此值进行筛选,以查找 DB-SQL 中但 DB-Legacy 中没有的所有记录。
我的问题是我们的一个数据库比其他数据库大得多,有 3,310,510 条记录。lQuery 的记录数是正确的,但是在过程结束时 lDataSet 只有大约 2,500,000 条。
现在,我想使用 cds 来使用 FindKey 方法,TADOQuery 不支持该方法,但是如果它忽略了 1/3 的记录,它就没有多大用处了!我猜测 DataSetProvider 或 ClientDataSet 中的某处可能存在整数溢出,尽管如果是这样它不会引发异常,这有点顽皮!有没有其他人遇到过这种问题,有没有办法对其进行排序(也许通过以较小的块下载数据或使用另一种填充 CDS 的方式)?
在这种情况下,SQL-DB 是 Oracle,但代码也需要与 SQL-Server 一起使用,尽管我怀疑这是一个数据库问题。
编辑:我现在的行为略有不同。当我尝试从查询中删除一些字段时,它运行良好。所有字段都可以单独运行,但它无法处理所有字段(这支持我的溢出假设)。我现在是,但是偶尔会出现异常。例外是
这是一种误导,因为深入研究 Debug DCU 表明错误是由
在 TCustomClientDataSet.SetData (DBClient 行 1482)。这会引发 ESafeArrayError (AResult = -2147024882),它会变成“意外的变体或安全数组错误”,但它无法处理对 FormatStr 的后续调用。
web-services - 提供程序未在 Delphi SOAP Server + Client 中导出
我正在使用 Delphi XE7 + Employee Interbase DB。
我正在尝试使用 Datasnap 构建一个 SOAP 服务器。
我在一台服务器中有 3 个 SOAP 服务器数据模块,每个都有一个表:客户、员工、国家/地区,每个都以相同的方式制作(文件、新的、其他、SOAP 服务器数据模块),然后从数据资源管理器中拖动一个表数据模块(Delphi 创建一个 TSQLCONnection 和一个 TSQLDataset),然后添加一个 TDatasetProvider。这三个数据模块是相同的。
在客户端应用程序中,我有 WSDL 导入器创建的三个接口
这三个接口是相同的(当然名称和 GUIDS 不同)。
在客户端表单中,我有三个按钮,它们执行相同的操作:
仅更改 ServerID、URL、ProviderName。
三个 Data Module ini 中的三个 DatasetProvider 已“导出”检查。
一开始,第一个 SOAP 服务器数据模块(客户)运行良好:在我的客户中,我看到了客户表。当我尝试员工或国家/地区时,我总是得到“提供商未导出”。
我犯了一个大错误:试图改变一些我取消选中导出标志,编译并运行服务器和客户端:没有工作。好的,我预料到了。然后我重新检查了标志......现在检查了导出的标志,但没有一个提供者正常工作......(是的,现在工作的那个不工作)。
服务器和客户端都在同一台 PC 上运行。
有人可以告诉我什么是错的吗?我认为问题出在服务器上,但在服务器的哪里?
postgresql - 在 applyupdates 上更新的最后一个表
我有一个包含 5 个表的 CRUD,我需要在服务器端进行一些处理,改变最后一个表已更新,datasetprovider 上的事件发生在每个单独的表之后。
就像,我有 3 张桌子,人,车,人车。我填写我点击保存的字段,首先它会保存人,然后是汽车,最后是人车。在事务块中,我怎么知道最后一个表?
我找不到合适的“事后”活动...
delphi - Delphi Datasnap:使用 TDatasetProvider 时如何手动构建数据集
我想手动构建 TDatasetProvider 使用的数据集,以将数据返回给客户端。
SQL 请求作为查询运行需要很长时间,我试图通过在代码中拆分逻辑并使用 kbmMemtable 来保存我的数据,然后再将其返回给客户端来加快速度。
我可以这样做:
kbmMemtable -> TDatasetProvider -> TClientDataset
如果可以做到这一点,在我的 TDatasetProvider 的什么情况下,我应该在 memtable 中设置数据?
使用德尔福 XE
tclientdataset - TClientDataset 或 TDataSetProvider (dbexpress) 所需的 assign、memcpy 或其他方法
我在 Embarcadero C++Builder XE 环境中使用 dbExpress 组件。我有一个相对较大的表,其中包含 20k 到 100k 条记录,我将其显示在 DBGrid 中。我正在使用连接到 SQLQuery 的 DataSetProvider 和连接到 DataSetProvider 的 ClientDataSet。
我还需要分析数据,因此我需要遍历整个表。对于较小的表,我总是使用代码,基本上是这样的:
当然这可行,但是当我需要运行整个 DBGrid 时,它非常慢。对于大约 50000 条记录,可能需要几分钟时间。我的怀疑是,由于 DBGrid 需要重新绘制,因为实际的 Dataset 增加了它的地址,所以大部分性能都丢失了。因此,我正在寻找一种方法,它允许我在不操作实际 ClientDataSet 的情况下读取数据。也许是一种将列的数据复制到变量中的方法,或者是另一种更有效的遍历数据集的方法。我敢肯定,如果我在变量中有一个副本,那么操作将花费不到几秒钟的时间......我现在用谷歌搜索了几个小时,但到目前为止没有发现任何有用的东西。
最好的问候, 博多
delphi - 由 TDataSetProvider poUseQuoteChar 和小写表名引起的异常不会出现
默认TDataSetProvider.Options.poUseQuoteChar
值为真。
当我的 SQL 语句使用小写的表名并且我TClientDataSet.ApplyUpdates(0)
没有进行任何更新而不引发异常时,我(再次)被这个咬住了。
在捕获异常DataSnap.Provider
的代码中:function TCustomResolver.InternalUpdateRecord(Tree: TUpdateTree): Boolean;
我看到那E.Message
是
[FireDAC][Phys][FB]动态 SQL 错误'#$D#$A'SQL 错误代码 = -204'#$D#$A'Table unknown'#$D#$A'tt_calendar'#$D#$A'At第 1 行,第 8 列
我没有ReconcileErrorHandler
,并且在上面的代码中HandleUpdateError
返回 false,但由于某种原因,异常没有出现。
我的设置是:
在 DevExpress 中创建的新事件TcxSchedulerStorage
连接到TDataSource -> TClientDataSet -> TDataSetProvider -> TFDQuery -> TFDConnection
,在这种情况下连接到 Firebird 数据库。一切默认设置,简单select * from tablename
中TFDQuery.SQL.Text
,
使用Delphi Tokyo 10.2.3。
是否有一个我可以更改的设置会强制异常可见并一劳永逸地解决这个问题(对于任何数据库类型)?
我什至愿意修补一个 Delphi 文件。
我现在已经用运行时代码“解决”了这个问题:
但宁愿不必每次都考虑这一点。
delphi - Delphi DataSetProvider BeforeUpdateRecord WideMemoField OldValue 缺失
为我们的数据库应用程序编写一点更改日志,我面临以下问题:在我的 DataSetProvider 的 BeforeUpdateRecord 事件中,缺少任何(修改的)WideMemo 字段的 OldValue。
显然,它在我 ApplyUpdates 之前就存在于 ClientDataSet 中,因此在创建增量或由 DataSetProvider 解包的某个地方,它被删除了。
我怎样才能得到那个值?
以防万一,这是我使用的组件
客户端:TClientDataSet TDataSource
服务器端:TIBQuery TDataSetProvider
连接到 Firebird 数据库
德尔福东京和Datasnap
干杯!
delphi - 如果我只想停止执行并报告错误,在 Delphi TDataSetProvider.OnUpdateError 中该怎么办?
我有带有 TIBQUery-TDataSetProvider-TClientDataSet 的 Delphi 应用程序,它或多或少地模拟了 CachedUpdates 模式(在以前的 BDE 组件中)。目前没有错误处理代码,因此根本没有错误消息。我只想启用以下场景:当查询遇到来自数据库的任何错误时,所有链应该停止工作,保持在当前值,回滚已经发布的更改并显示消息。我猜——所有这些都可以通过实现 TDataSetProvider.OnUpdateError 来完成。我有 2 个代码提案。首先:
另一种变体:
这些代码模式是否相当健全?OnUpdateError
如果只想停止执行并报告错误,有哪些指导方针?我希望应用程序中的零智能 - 我只能提供更有意义的错误消息,但所有更正都应由用户完成。