Parameter.As String 在 Oracle/SQL 下失败 - Parameter.Value 2 字节字符在 Oracle 下

2023-11-26

更改为 FireDAC 后,我无法让此代码在 MSSQL/Oracle 上运行:

with DataFormsettings do
begin
  Close;
  if Params.Count=0 then FetchParams;
  Params.ParamByName('TT_EMP_ID').Asinteger := AEmpID;
  Params.ParamByName('TT_FORM').AString := UpperCase(AKey);  
  Open;
  if (RecordCount>0) then
     S := FieldByName('TT_VIEWDATA').Asstring;     
end;   

AKey 和 S 都是字符串。

Open语句报错

[FireDAC][Phys][MSSQL]-338 Param type changed from [ftString] to [ftWidestring]
[FireDAC][Phys][Ora]-338 Param type changed from [ftString] to [ftWidestring]

连接到 MSSQL 或 Oracle 数据库时;连接到 FireBird 时不会。
之后FetchParams, DataFormsettings.params[1].datatype总是一个ftString.

如果我更换

Params.ParamByName('TT_FORM').AString := UpperCase(AKey);  

with

Params.ParamByName('TT_FORM').Value := UpperCase(AKey);

... Open 语句没有错误。我认为这已经解决了,尽管我并不真正理解这个错误。毕竟,这应该是所有默认的 Delphi String 类型......
但现在 Oracle(不是 FireBird 或 MSSQL)的 S 分配失败了,因为我看到返回了 2 字节字符。 S 包含:

\'#0'S'#0'o'#0'f'#0't'#0'w'#0'a'#0'r'#0'e'#0'\'#0'T'#0'i'#0'm'#0'e'#0'T'#0'e'#0'l'#0'l'#0'...

我可以用例如来处理这个问题

S := TEncoding.Unicode.GetString(FieldByName('TT_VIEWDATA').AsBytes);  

对于 Oracle,但是(当然)在使用其他两种数据库类型时不起作用:

No mapping for the Unicode character exists in the target multi-byte code page

我在这里缺少什么?具体来说,我想让 AsString 检索/分配工作。
请注意设置 AsString 属性将 DataType 属性设置为 ftWideString 或 ftString中的备注FireDAC TFDParam.AsString 文档。似乎参数值分配只是将类型从 ftString 切换到 ftWideString(如原始错误所示)。

DataFormSettings is a TClientDataSet在客户端应用程序中,连接到服务器应用程序,其中TDataSetProvider and TFDQuery居住。查询是

select
  TT_FORMSETTINGS_ID,
  TT_EMP_ID,
  TT_FORM,
  TT_VERSION,
  TT_VIEWDATA
from TT_FORMSETTINGS
where TT_EMP_ID=:TT_EMP_ID
and TT_FORM=:TT_FORM

这些表的创建方式如下:

火鸟:

CREATE TABLE TT_FORMSETTINGS
(
  TT_FORMSETTINGS_ID    INTEGER DEFAULT 0 NOT NULL,
  TT_EMP_ID     INTEGER,
  TT_FORM       VARCHAR(50),
  TT_VERSION        INTEGER,
  TT_VIEWDATA       BLOB SUB_TYPE TEXT SEGMENT SIZE 80,
  TT_TAG    INTEGER,
  TT_TAGTYPE    INTEGER,
  TT_TAGDATE    TIMESTAMP
);

Oracle:

CREATE TABLE TT_FORMSETTINGS
(
  TT_FORMSETTINGS_ID    NUMBER(10,0) DEFAULT 0 NOT NULL,
  TT_EMP_ID     NUMBER(10,0),
  TT_FORM       VARCHAR(50),
  TT_VERSION        NUMBER(10,0),
  TT_VIEWDATA       CLOB,
  TT_TAG    NUMBER(10,0),
  TT_TAGTYPE    NUMBER(10,0),
  TT_TAGDATE    DATE
);

MSSQL:

CREATE TABLE TT_FORMSETTINGS
(
  TT_FORMSETTINGS_ID    INTEGER  NOT NULL CONSTRAINT TT_C0_FORMSETTINGS DEFAULT 0,
  TT_EMP_ID     INTEGER NULL,
  TT_FORM       VARCHAR(50) NULL,
  TT_VERSION        INTEGER NULL,
  TT_VIEWDATA       TEXT NULL,
  TT_TAG    INTEGER NULL,
  TT_TAGTYPE    INTEGER NULL,
  TT_TAGDATE    DATETIME NULL
);

我已经查过TT_VIEWDATA所有数据库中包含正确的数据;它是一个包含 CRLF 的长字符串:

\Software\TimeTell\Demo8\Forms\TFormTileMenu'#$D#$A'Version,1,80502'#$D#$A'\Software\TimeTell\Demo8\Forms\TFormTileMenu\TileControlMenu'#$D#$A'\Software\TimeTell\Demo8\Forms\TFormTileMenu\TileControlMenu\FormTileMenu.TileControlMenu'#$D#$A'Version,4,2'#$D#$A'\Software\TimeTell\Demo8\Forms\TFormTileMenu\TileControlMenu\FormTileMenu.TileControlMenu...

Notes:

  • 目前正在 SQL Server 2008 和 Oracle 10 上进行测试,但我预计其他版本也没有什么不同。
  • FWIW, select * from NLS_database_PARAMETERS where parameter like '%CHARACTERSET%'回报NLS_CHARACTERSET=WE8MSWIN1252 and NLS_NCHAR_CHARACTERSET=AL16UTF16
    Query SELECT dump(dbms_lob.substr(tt_viewdata,100,1), 1016), tt_viewdata FROM tt_formsettings确认 CLOB 包含 Win1252 代码页的 ASCII 字节:
    Typ=1 Len=100 CharacterSet=WE8MSWIN1252: 5c,53,6f,66,74,77,61,72,65,5c,54,69,6d,65,54,65,6c,6c,5c,44,65,...
  • FieldByName().AsANSIString给出相同的结果FieldByName().AsString

附加信息:这是一个遗留应用程序,在DataFormsettings TClientDataset. TT_VIEWDATA被定义为TMemoField:

DataFormsettingsTT_VIEWDATA: TMemoField;

在一个小型测试应用程序(直接连接到 Oracle;不是客户端服务器)中,我让 Delphi 添加字段定义,然后它说:

DataFormsettingsTT_VIEWDATA: TWideMemoField;

如果我在主应用程序中使用它,Oracle 工作正常,但 MSSQL 会出现“垃圾”。

我还尝试为 Oracle 连接设置映射规则,例如(许多变体):

with AConnection.FormatOptions.MapRules.Add do
begin
  SourceDataType := dtWideMemo;
  TargetDataType := dtMemo;
end;
AConnection.FormatOptions.OwnMapRules := true;

但这没有帮助。


这是它不起作用的原因:

In FireDAC.Stan.Option:

procedure TFDFormatOptions.ColumnDef2FieldDef()
...
dtWideHMemo:
  // Here was ftOraClob, but then will be created TMemoField,
  // which does not know anything about Unicode. So, I have
  // changed to ftFmtMemo. But probably may be problems ...
  ADestFieldType := ftWideMemo;

Indeed, 可能有问题.

解决方案是添加一个映射规则来转换dtWideHMemo to dtMemo.
之后,读取和写入 CLOB.AsString工作正常。

报告为RSP-19600在 Embarcadero 质量门户网站中。


为了完整起见:因为我的其他答案中提到的映射不再有效,所以您必须使用以下命令更改对参数的访问权限.Value代替.AsString.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Parameter.As String 在 Oracle/SQL 下失败 - Parameter.Value 2 字节字符在 Oracle 下 的相关文章

  • 是否可以声明长度受限且不从 0/1 开始的字符串类型?

    在 Delphi 中 可以声明整数值的子范围 例如 type myInt 2 150 它将 myInt 类型的值限制为 2 到 150 之间的值 但是如果我想限制字符串的长度怎么办 如果我写 type myString string 150
  • Delphi应用程序窗口z顺序和MainFormOnTaskBar属性

    我正在维护一个最初用 Delphi 7 编写并移植到 Delphi XE 的应用程序 使用 Windows 7 我们遇到了一些问题 例如模态窗口出现在主窗口下方 以及最终无法与程序交互 因为用户需要与模态窗体交互 而这是不可能的 因为它位于
  • 如何使 StringGrid 的列适合网格的宽度?

    我已经寻找解决方案很长时间了 但没有任何运气 有谁知道一个简单的方法来做到这一点 例如 我想拉伸网格的第二列以适应网格的宽度 Use the ColWidths财产 像这样 with StringGrid1 do ColWidths 1 C
  • 在 Delphi 或 C++ Builder 中使用 Chromium Edge WebView2 [重复]

    这个问题在这里已经有答案了 既然 Microsoft Chromium Edge 已经最终确定 是否可以在 Delphi 或 C Builder 中使用它 据我了解 它是基于WebView2成分 是否有一个组件 例如TWebView2或者E
  • 将数据从 oracle 移动到 HDFS,处理并从 HDFS 移动到 Teradata

    我的要求是 将数据从 Oracle 移至 HDFS 处理HDFS上的数据 将处理后的数据移至 Teradata 还需要每 15 分钟执行一次整个处理 源数据量可能接近50GB 处理后的数据也可能相同 在网上搜索了很多之后 我发现 PRARO
  • 根据由另一列分组的不同列的最大值获取值[重复]

    这个问题在这里已经有答案了 我想根据由另一列分组的不同列的最大值来获取列的值 我有这张表 KEY NUM VAL A 1 AB B 1 CD B 2 EF C 2 GH C 3 HI D 1 JK D 3 LM 并想要这样的结果 KEY V
  • 以编程方式插入行(父行和子行)

    我正在使用 Spring 和 JDBCTemplate 该场景是 CUSTOMER 表和 ORDERS 表的父子关系 我想做一个插入 例如 1 个客户和 5 个订单 但我不确定如何以编程方式在 CUSTOMER 表中插入一行 如何获取 Or
  • Oracle JDBC 预取:如何避免 RAM 不足/如何使 oracle 更快高延迟

    使用 Oracle java JDBC ojdbc14 10 2 x 加载包含多行的查询需要很长时间 高延迟环境 这显然是 Oracle JDBC 中的默认预取默认大小 10 每 10 行需要一次往返时间 我正在尝试设置一个激进的预取大小来
  • 阻止 IDE 自动添加使用单位

    我正在将 Lazarus 项目转移到德尔福西雅图 Lazarus 项目依赖于 40 多个单元 包括控件 并具有多种应用程序 在所有项目的使用条款中 他们使用了以下内容 uses Classes SysUtils Forms Controls
  • Java、Oracle 中索引处缺少 IN 或 OUT 参数:: 1 错误

    您好 我使用 Netbeans 8 0 2 和 Oracle 11g Express Edition 在 JSF 2 2 中编写了一个图书馆管理系统 我有几个名为 书籍 借阅者 等的页面 以及数据库中一些名为相同名称的表 我的问题是这样的
  • PLSql 返回值

    我再次使用一些 PLSql 我想知道 是否有任何方法可以像选择一样使用以下函数 而不必将其转换为函数或过程 这样我就可以从包含它的脚本中看到代码 代码如下 DECLARE outpt VARCHAR2 1000 flow rI VARCHA
  • 如果 Oracle SQL 中存在视图,则删除视图[重复]

    这个问题在这里已经有答案了 我是 Oracle 数据库系统的新手 Oracle 12c 中以下 SQL 语句的等效项是什么 DROP VIEW IF EXIST
  • Delphi XE7 Android 全屏(隐藏软键)

    如何在XE7中全屏显示 隐藏顶部 标题 和底部 软键 工具栏 在 XE6 中 我可以通过在应用程序部分写入来调整 AndroidManifest 以使我的应用程序全屏显示并且没有操作栏 android theme android style
  • 执行 `EXECUTE IMMEDIATE ` Oracle 语句出现错误

    我是 Oracle 的新手 当我执行以下语句时 BEGIN EXECUTE IMMEDIATE SELECT FROM DUAL END 我得到错误为 命令中从第 2 行开始出错 立即开始执行 从双选择 结尾 错误报告 ORA 00911
  • 从其可执行文件的路径获取服务名称

    我有一个可执行文件的路径 它是一个正在运行的服务应用程序 例如 C Program Files x86 Someapp somesvc exe 我想停止并启动它 为此我想我需要获取服务的名称 如下所示 this https stackove
  • SQL查询json字典数据

    我的表中的 CLOB 字段包含 JSON 如下所示 a value1 b value2 c value3 我正在尝试编写一个 SQL 查询来返回一个包含键和值字段的表 如下所示 key value a value1 b value2 c v
  • 如何将今天的日期返回到 Oracle 中的变量

    我想做这个 DECLARE today as smalldatetime SELECT today GetDate 但我需要一个oracle翻译 甲骨文使用SYSDATE 还有 ANSI 标准CURRENT TIMESTAMP 除其他外 S
  • 如何读取和更改 TEdit 控件的值?

    我有一个表格TForm1有 5TEdit and 2 TBitBtn 我还需要该程序 以便在输入数字数据后Edit1 and Edit2 on BitBtn1Click Edit1 and Edit2值将被求和并显示在Edit3 你想做这样
  • FireMonkey iOS RAD Studio XE2 - 在从 URL 加载的表单上显示图像

    是否可以将 TImage 放置在 iOS 的 FMX 表单上 并将图像 jpg 从 URL 加载到此 TImage 中以在 iOS 应用程序中显示 我尝试过但没有成功 任何正确方向的提示或指出都会受到赞赏 将 TButton TImageC
  • Oracle SQL PLS-00049:错误的绑定变量

    我收到此错误 这似乎是列拼写问题 然而 我 99 确信我拼写的所有内容都是正确的 但我看不出有任何理由会出现我所犯的错误 这是来源 CREATE OR REPLACE TRIGGER update qoh trigger AFTER INS

随机推荐

  • 通过带范围的关联保存时丢失属性 (Rails 4.0.0)

    代码 Rails 4 0 0 class Track lt ActiveRecord Base has many artist tracks has many owning artists gt where artist tracks gt
  • 创建“金字塔”矩阵

    假设给定一个具有奇数长度的对称行向量 其中每个元素都小于向量前半部分的下一个元素 并且每个元素都大于后半部分的下一个元素 并且中间元素是最大的 例如 1 2 3 2 1 or 10 20 50 20 10 我想创建一个方阵 其中行向量是它的
  • 有没有办法从大比例图像创建 xxhdpi、xhdpi、hdpi、mdpi 和 ldpi 可绘制对象?

    有没有办法从大尺寸图像自动创建 xxhdpi xhdpi hdpi mdpi 和 ldpi 可绘制对象 例如 假设我有一个 512x512 图像 并且我希望在适当的文件夹中针对 Android 支持的不同屏幕分辨率拥有该图像的不同版本 选项
  • 如何在C#中增加控制台窗口的大小?

    我正在为将在应用程序中实现的一项功能创建一个原型 特别是我正在将集合中的数据显示到控制台窗口 但不幸的是 某些行的跨度比控制台窗口的默认宽度更宽 我做了一点挖掘并发现增加窗口宽度的唯一方法是深入研究 Kernel32 dll 并手动完成 尽
  • 加快 Vagrant 上主机和来宾之间的同步延迟(NFS 同步文件夹)

    我正在使用 vagrant 在本地计算机上运行 wordpress 开发环境 并将 nfs 设置为默认文件共享机制 我在 Mac 上 总体性能非常好 除了一件事 同步延迟 我已经在来宾上设置了 grunt 观察程序来重新编译 css jav
  • UTF-8 编码与 Base-64 编码

    我想对一个文件 可能是图像或任何 pdf 进行编码并将其发送到服务器 我必须遵循哪种类型的编码和解码 服务端和客户端都在我们公司 我们可以在两个地方写逻辑 UTF 8 编码java默认支持 并使用Base 64编码我必须导入外部jar 对于
  • Jupyter 笔记本中的自动完成功能不起作用

    安装Anaconda最新版本后 我尝试了以下步骤 我无法让自动完成功能正常工作 关于我还需要尝试什么的任何建议 步骤1 1 pip安装jupyter contrib nbextensions 2 pip安装jupyter nbextensi
  • 忽略 ASP .NET MVC 中的文件夹

    我有一个现有的 ASP NET MVC 应用程序 我想忽略其中的特定文件夹 我打算在其中放置 PHP 脚本 我尝试按照描述添加忽略路由here但它不起作用 因为我仍然收到标准 ASP NET 配置错误 例如 假设我有这个文件夹结构 root
  • 如何使用 Async/Await 快速进行进度报告?

    我有一个需要 2 个回调的函数 我想将其转换为异步 等待 但我怎样才能在等待的同时不断返回进度呢 我在用https github com yannickl AwaitKit摆脱回调 typealias GetResultCallBack S
  • 使用 GROUP BY 和 Count(*) 进行匿名类型的 LINQ 查询

    我尝试使用 LINQ 查询来确定我拥有的每种特定对象类型的数量 并将这些值记录到匿名类型中 假设我有一些看起来像这样的数据 确实有暴露此属性的对象 但它的工作原理相同 GroupId 1 1 2 2 2 3 我知道如何在 SQL 中格式化我
  • 使用 JeMalloc 查找 Java 应用程序中的本机内存泄漏

    目前我正在尝试解决 Java 内存问题 我的 Java 应用程序不断使用越来越多的内存 最终它被 Linux OOM 杀手杀死 很可能是本地内存泄漏 因为经过检查 使用 VisualVM 的 JVM 的元空间和堆看起来都不错 使用top命令
  • 一台服务器上的多个 Zend 框架站点

    我在设置 httpd conf 或 htaccess 文件以识别一台服务器上的多个 zend 框架站点时遇到问题 对于开发 我只有一台服务器 我正在尝试设置站点 以便我可以访问它们 例如 localhost app1 localhost a
  • python pdb lambda函数全局名称错误

    我正在使用测试修复pdb set trace 在实施之前确保它按照我预期的方式工作 并不断出现奇怪的错误 Pdb test 1 2 3 4 4 3 2 1 Pdb max range len test key lambda i test i
  • 内容解析器返回错误的大小

    我正在从图库中选择一张图像并通过以下方式查询其大小ContentResolverAPI 它返回29kb 但是 当我使用 adb 检查文件时ls al它是 44kb 这是我查询图像大小的方法 private fun getFileInfo c
  • 我们如何在 iOS 应用程序中使用自定义字体? [复制]

    这个问题在这里已经有答案了 可能的重复 我可以在 iPhone 应用程序中嵌入自定义字体吗 如何在 iPhone 应用程序中自定义字体 是否可以 我怎样才能在a中使用这个自定义字体UILabel 我正在尝试添加MYRIADPRO SEMIB
  • 如何使用 OkHttp 设置连接超时

    我正在使用 OkHttp 库开发应用程序 我的麻烦是我找不到如何设置连接超时和套接字超时 OkHttpClient client new OkHttpClient Request request new Request Builder ur
  • Android房间数据库不会导出所有数据

    我正在尝试设置 Room 数据库备份功能 问题是 下载后 sql 数据库文件不包含应用程序中的最新数据集 它总是会错过一些最近的记录 有没有导出房间数据库的正确方法 附 在使用 sqliteHelper 处理我的数据库时 我没有遇到类似的问
  • Delphi XE2后台IDE编译器找不到源路径

    我刚刚购买了 XE2 版本 安装了更新 1 ISO 并制作了我的开源项目用它来编译 In fact 我将库的源代码路径添加到常规设置IDE中 适用于我使用的所有平台 即到目前为止的Windows 32位和64位 我编译了TestSQLite
  • 如何将 Python 3.5 设置为 MacOS 上的默认版本?

    我刚刚在 Mac 上安装了 Python 3 5 1 运行最新版本的 OSX 我的系统安装了 Python 2 7 当我打字时IDLE在终端提示符下 我的系统会启动原始的 Python 2 7 而不是新安装的 Python 3 5 当我从终
  • Parameter.As String 在 Oracle/SQL 下失败 - Parameter.Value 2 字节字符在 Oracle 下

    更改为 FireDAC 后 我无法让此代码在 MSSQL Oracle 上运行 with DataFormsettings do begin Close if Params Count 0 then FetchParams Params P