- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个客户端-服务器应用程序。客户端(TCP Client)是一个Delphi应用程序,它向服务器(TCP Server,C++ Builder应用程序)发送命令。
它们都是用 Rad Studio XE2 编写的。
服务器响应命令,从 SQL Server 获取数据并将其发送到客户端。
服务器使用TClientDataSet并将其保存到发送给客户端的TMemoryStream。
客户端还使用 TClientDataSet 并对从服务器接收的流调用 TClientDataSet.LoadFromStream()。
这很好用。
但有一种情况是数据大小较大(~160 MB),有时会在调用 TClientDataSet.LoadFromStream() 时抛出 "Error creating variant or safe array"> 在客户端。
服务器通过这种方式向客户端发送流:
//...
FContext->Connection->IOHandler->LargeStream = true;
FContext->Connection->IOHandler->Write(Stream, 0, true);
客户端是这样接收的:
AClient.IOHandler.LargeStream := True;
AClient.IOHandler.ReadStream(Stream, -1, False);
客户端收到后,将流的位置改为18。
因为实际数据是在 18 字节之后开始的。然后调用 TClientDataSet.LoadFromStream()。
//...
MemTable.LoadFromStream(Stream);
LoadFromStream() 抛出“创建变体或安全数组时出错”。但在某些情况下它可以正常工作。
有人知道吗?
最佳答案
根据 Delphi 10 的源代码,问题来自 SafeArrayCreate
失败,很可能是因为 EOutOfMemory 异常。
SafeArrayCreate
尝试分配 160MB 的内存,这需要是连续的。进程的虚拟内存中可能没有足够大的“洞”来容纳那么多内存。在 32 位进程中,我猜这不太可能。
稍微缓解此问题的一种方法可能是激活/LARGEADDRESSAWARE 标志。但这只会稍微降低错误发生的可能性,并可能在未来很快再次出现。
其他选项包括:
编译为 64 位应用程序。
使用适当的数据库而不是内存中的数据集。
关于c++ - Delphi 中的 TClientDataSet.LoadFromStream() 中的 "Error creating variant or safe array",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41616773/
如何从 TClientDataset 获取更改? 我有一个名为 GetDataset 的 TClientDataset 并且有一个网格。我希望在名为 ChangeDataset 的新 TClientD
我有一个包含以下控件的表单:TDBEdit,TDBMemo,TDataSource,TClientDataSet 如果用户编辑字段,然后单击表单上仅调用MyCDS.Cancel方法的按钮(以取消编辑)
我有一个简单的 Delphi (2007) 过程,它给定一个 TDataSet 和一个(子)字段列表返回一个新的 TClientDataSet 和 不同的值 从给定的 TDataSet。 这工作得很好
我们有一个系统可以根据我们的数据创建报告。我们可以处理大量数据。超过 150,000 行的想法并非不可能。 不幸的是,我们对 TClientDataSet 的体验是它的局限性,因为当数据变得太大时,它
我有一个数据库表,我需要在其中插入记录。我正在使用可更新的 TClientDataset,一切正常。 现在,我需要添加一个虚拟字段;不是计算出来的。我可以在其中写入行状态的一个字段(只是我将在 App
我需要过滤TClientDataset,实际上我正在使用这段代码。 if Value<>'' then begin ClientDataSet1.DisableControls;
一些背景:我想开发一个桌面应用程序,使用 SQL 数据库作为存储。一次只有一个用户连接到数据库。 为了使维护更容易,我想将 GUI 与 Busniss Logic 分开。因此,我想到为每个对话框使用一
当我试图支持 this question 时,我被触发问这个问题。具有 MCVE。 我最近开始注意到 TClientDataSet 很快就会耗尽内存。我在生产中遇到了一个问题,它无法加载大约 60.0
我有一个在线程 1 中管理的 TClientDataset。 在另一个线程中,我有一个 TClientDataset 的克隆图像。 我会遇到线程问题吗? 编辑 克隆的图像以只读模式使用。 最佳答案 简
我有一个 DataSnap 服务器,它创建对给定用户 session 唯一的 TSQLQuery、TDataSetProvider 和 TClientDataSet,它们用于和重用从数据库检索数据并将
是否可以将对多个表的多个查询的结果放入 TClientDataset 中? 有点像 SELECT * from t1; SELECT * from t2; SELECT * from t3; 我似乎无
这是我想要完成的: 通过 TSQLDataset 的 CommandText 从数据库中检索 1 条记录:SELECT * FROM myTable WHERE ID = 1 使用TClientDat
我有一个简单的 TClientDataSet 组件,用于填充一些数据感知组件。但是,如果我使用此数据集将数据插入我的数据库,我似乎无法找到将其同步回我的 TClientDataSet 组件的正确方法。
在 TClientDataSet 组件中调用 CreateDataSet 方法时出现“无效参数错误”的原因是什么?导致此错误的原因。 最佳答案 当您有一个 ftString 数据类型字段并且其大小为零
你好代码爱好者! 我有一个问题,这无疑是由于我对 Delphi XE2 知识缺乏经验。我会在这里尝试解释一下。 简介: 我有一个包含数据的 Interbase 数据库。该数据库位于远程机器上。我正在开
我需要在 TClientDataSet 中创建一个聚合字段,但如文档中所述: Choose OK. The newly defined aggregate field is automatically
我使用一个提供程序在主详细信息中有 2 个 ClientDatasets。 2 个基础查询作为主详细信息与数据源连接,并且主查询将详细信息作为字段 (TDatasetField) 我的问题是关闭主(甚
在我的应用程序中,我将 TADOQuery 与 select (MSSQL) 一起使用,并与其 TClientDataSet 链接。我必须插入大约一百万条记录并应用更新。 那么我在 SQL Serve
我想知道是否可以将一个数据集嵌套在一个数据集中,然后将该数据集嵌套在另一个数据集中。因此有 3 层嵌套。目前,我只能将一个数据集嵌套在另一个数据集中。当尝试嵌套第三层时,数据库在我第一次编译程序并且能
我正在使用 TClientDataset 创建一个内存数据集作为接收缓冲区。添加数据很棒,但是一旦我开始处理它,我希望能够从数据集中删除该行。调用删除有效 - 某种程度上 - 行/索引仍然可以访问,但
我是一名优秀的程序员,十分优秀!