.NET Core 2 + System.Data.OracleClient。汉字不起作用

时间:2017-09-06 12:22:31

标签: oracle asp.net-core .net-core

我正在使用.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添加到连接字符串,但中文字符仍然不起作用。

3 个答案:

答案 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))
{
    //...
}