我正在使用.NET Core 2和几周前在这里发布的System.Data.OracleClient包:https://www.nuget.org/packages/System.Data.OracleClient/
我可以阅读数字,日期和普通英文字符。但不是中国人。可能还有很多其他非西方人物。
这是一个示例程序来说明错误:
using System;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Data.OracleClient;
namespace OracleConnector
{
class Program
{
static void Main()
{
TestString();
return;
}
private static void TestString()
{
string connStr = "Data Source = XE; User ID = testuser; Password = secret";
using (OracleConnection conn = new OracleConnection(connStr))
{
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText = "select 'some text in English language' as a, '储物组合带门/抽屉, 白色 卡维肯, 因维肯 白蜡木贴面' as b from dual";
var reader = cmd.ExecuteReader();
reader.Read();
string sEnglish = reader.GetString(0);
string sChinese = reader.GetString(1);
Trace.WriteLine("English from db: " + sEnglish);
Trace.WriteLine("Chinese from db: " + sChinese);
Trace.WriteLine("Chinese from the code: 储物组合带门 / 抽屉, 白色 卡维肯, 因维肯 白蜡木贴面");
}
}
}
}
输出:
English from db: some text in English languageဂ
Chinese from db: ¿¿¿¿¿¿/¿¿, ¿¿ ¿¿¿, ¿¿¿ ¿¿¿¿¿e
Chinese from the code: 储物组合带门 / 抽屉, 白色 卡维肯, 因维肯 白蜡木贴面
如您所见,普通代码中的汉字有效。但不是来自数据库。此外,英文文本中的最后一个字符是一些混乱的东西。我也尝试了相应的Mono nuget包,结果相同。
任何人都有任何线索如何解决这个问题?
编辑:尝试将Unicode = True添加到连接字符串,但中文字符仍然不起作用。
答案 0 :(得分:2)
这是System.Data.OracleClient DLL的问题。我遇到了同样的问题,其中2个,3个甚至4个字节的Unicode字符被添加到我的字符串末尾。
切换到Mono.Data.OracleClientCore有点帮助,但我仍然在一些字符串的末尾有一些奇怪的字符(Unicode退格和反斜杠)。
我刚刚尝试了以下库,它似乎适合我的需求(到目前为止): https://github.com/ericmend/oracleClientCore-2.0
您需要为Windows重新编译(在OciCalls.cs中更改为#define OCI_WINDOWS
)。如果我发现它没有继续工作,我会更新这个答案。
尽管如此,我认为我们必须等待Oracle为任何类型的生产就绪库发布其.NET Core支持的解决方案。
答案 1 :(得分:2)
请尝试
Environment.SetEnvironmentVariable ("NLS_LANG",".UTF8");
在创建connection-Object
。
System.Data.OracleClient-Implementations
使用外部Oracle库,它假定(至少在Windows上)ANSI-Charset。
设置NLS_LANG-Environmentvariable
通知Oracle-Libs你想要UTF8编码。
(更多)有关NLS_LANG-FAQ-Page的详细信息: http://www.oracle.com/technetwork/database/database-technologies/globalization/nls-lang-099431.html
答案 2 :(得分:1)
在连接字符串中添加“; Unicode = True”并在创建连接之前添加Environment.SetEnvironmentVariable ("NLS_LANG",".UTF8");
string conn = "DATA SOURCE=hostname.company.org:1521/servicename.company.org;PASSWORD=XYZ;USER ID=ABC;Unicode=True"
Environment.SetEnvironmentVariable("NLS_LANG", ".UTF8");
using (DbConnection conn = create_connection(app_conn))
{
//...
}