我将法国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传递。”我怎么能这样做?
答案 0 :(得分:0)
我找到了解决方案(或部分解决方案)。将“unicode = true”添加到连接字符串会告诉客户端不要转换Unicode字符。为什么只有WinForms应用程序才需要它,而不是ProcessInvocation86单元测试仍然是个谜。