gpt4 book ai didi

sql-server - 在基础查询中使用 REPLACE 打开 TClientDataSet 时内存不足

转载 作者:行者123 更新时间:2023-12-03 15:55:44 26 4
gpt4 key购买 nike

我的 Delphi 代码打开一个 TFDQuery (FireDAC),然后打开通过 TDataSetProvider 连接到它的 TClientDataSet:

ClientDataSetData.Close;
with QueryData do
begin
Close;
SQL.Clear;
SQL.Add(ASelectSQL);
Open;
end;
ClientDataSetData.Open;

ASelectSQL 包含此 SQL:

SELECT TT_NIV_ID,
TT_NIV,
REPLACE(TT_NIV_NAME, '|', '!') as TT_NIV_NAME2
FROM TT_SYS_PRJ_NIV

ClientDataSetData.Open 在包含 42200 条记录的数据集上出现内存不足错误。

如果我检查结果数据(在 Delphi 代码中),我会发现 TT_NIV_NAME2 是一个长度为 8000 的字符串!
来自 REPLACE() documentation :

If string_expression is not of type varchar(max) or nvarchar(max), REPLACE truncates the return value at 8,000 bytes

...所以这似乎正在发生;不仅仅是截断,还设置结果类型。

TT_NIV_NAMEVARCHAR(50),因此快速修复方法是将 SQL 更改为

SELECT TT_NIV_ID,
TT_NIV,
CAST(REPLACE(TT_NIV_NAME, '|', '!') as VARCHAR(50)) as TT_NIV_NAME2
FROM TT_SYS_PRJ_NIV

但这是我无法控制的用户定义的 SQL。下次他可能会在其他东西上运行带有REPLACE的...我更喜欢通用的解决方案。

我可以对 Delphi 代码做些什么(TClientDatasetTFDQueryTFDConnection 设置?)这可以防止这么高的内存使用率吗?

坦率地说,当 TT_NIV_NAMEVARCHAR(50) 时,为什么 REPLACE 会得出“string_expression 不是 varchar(max) 类型”的结论)?

注释:

  • 使用多个 SQL Server 驱动程序进行测试 - 这不是驱动程序问题。
  • TFDConnection 具有 FetchOptions.Mode := fmAllFetchOptions.Items := FetchOptions.Items - [fiMeta]
    fmAll 必须保持*,并且不减去 fiMeta 没有区别。
  • 相关[1]但这里 string_expression 长度超过 8000,或 [2]其中 string_expression 不是 varchar(max) 类型,但两者都不适用于我的 SQL 数据。
  • Delphi Tokyo 10.2.3 使用 FireDAC 针对 SQL Server 2012、在 Win7 或 Win10 下运行的 Win32 应用

* .. 防止在仅安装非常基本的 SQL Server 驱动程序的环境中出现著名的 hstmt 错误;在我的测试应用程序中,不设置它没有任何区别。

最佳答案

我们通过专门针对这个 8000 个字符的 ANSI 字符串应用映射规则来“解决”了这个问题。我知道,它很脏,但对于旧版应用程序来说它可以工作(特别是因为我们在切换到 FireDAC 之前使用 SQLDirect,并且 varchars > 256 字节已经转换为备忘录)。

with FDConnection.FormatOptions.MapRules.Add do
begin
SourceDataType := dtAnsiString;
SizeMin := 8000;
SizeMax := 8000;
TargetDataType := dtMemo;
end;

此映射特定于 SQL Server,因为我们支持的其他两种数据库类型(Oracle、FireBird)中的 REPLACE 函数不具有 SQL Server 行为。

关于sql-server - 在基础查询中使用 REPLACE 打开 TClientDataSet 时内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50569010/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com