.Net OracleClient 替换查询中的字符



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

select * from foo where bar = 'é';

当我使用 System.Data.OracleClient 编写 nUnit Unit Test 并通过 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 传递。 我该怎么做?

我找到了解决方案(或其中的一部分)。 将"unicode=true"添加到连接字符串会告诉客户端不要转换 Unicode 字符。 为什么只有WinForms应用程序才需要这样做,而不是ProcessInvocation86单元测试仍然是一个谜。

最新更新