0

我有一个法国 Oracle 数据库恢复到美国服务器。该数据库的 NLS_CHARACTERSET 是 AL32UTF8。该数据库中的表中有一个 VARCHAR2 字段,可以包含 unicode 文本。一条记录的该字段的值为“é”。我可以在 SQL*Plus 和 TOAD 中运行以下查询,一切正常。

select * from foo where bar = 'é';

当我使用 System.Data.OracleClient 编写一个 nUnit 单元测试并通过 TestDriven.net 运行它时,它运行完美。当我从 WinForms 应用程序运行完全相同的代码时,查询将转换为以下内容:

select * from foo where bar = 'e';

这会导致查询不从 .Net 应用程序返回任何行,即使它从 SQL*Plus、TOAD 和 .Net 单元测试返回行也是如此。

我知道 System.Data.OracleClient 已被贬低,但它仍然有效。此代码位于 Oracle 正在逐步淘汰的系统中,因此转换或升级几乎没有意义。

查询从 TestDriven.Net (ProcessInvocation86.exe) 工作的事实告诉我 OCI 客户端和 OracleClient 能够接受查询中的 unicode 字符。WinForms 应用程序将 'é' 转换为 'e' 告诉我,.Net WinForms 中的某处正在翻译它。我该如何关闭它?如果可以避免,我不想对注册表进行任何更改,并且应用程序需要在法国和美国运行,并且配置差异尽可能少。这里的目标是告诉 .Net “永远不要转换查询字符。始终将它们全部作为 Unicode 的 CLOB 传递。” 我怎样才能做到这一点?

4

1 回答 1

0

我找到了解决方案(或部分解决方案)。将“unicode=true”添加到连接字符串告诉客户端不要翻译 Unicode 字符。为什么只需要 WinForms 应用程序而不是 ProcessInvocation86 单元测试仍然是一个谜。

于 2013-09-14T12:15:44.727 回答