我有一个法国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、TOAD和.Net单元测试返回行。
我知道System.Data.OracleClient已经过时了,但它仍然可以工作。这段代码所在的系统中Oracle正在逐步淘汰,因此转换或升级几乎没有意义。
从TestDriven.Net (ProcessInvocation86.exe)执行查询的事实告诉我,OCI客户端和OracleClient能够接受查询中的unicode字符。WinForms应用程序将'é‘转换为'e’,这告诉我.Net WinForms中的某个地方正在翻译它。我怎么把它关掉?如果我可以避免它,我不想做任何注册表更改,并且应用程序需要在法国和美国工作,尽可能少的配置差异。这里的目标是告诉.Net“永远不要转换查询字符。总是将它们作为CLOB传递,它们都是Unicode。”我该怎么做呢?
发布于 2013-09-14 20:15:45
我找到了解决方案(或部分解决方案)。在连接字符串中添加"unicode=true“将告诉客户端不转换Unicode字符。为什么这只是WinForms应用程序所必需的,而不是ProcessInvocation86单元测试,这仍然是一个谜。
https://stackoverflow.com/questions/18791884
复制相似问题