Oracle database over ODBC преобразует неанглийские символы в вопросительные знаки

#oracle #asp.net-core #unicode #odbc

#Oracle #asp.net-ядро #юникод #odbc

Вопрос:

Я работаю над извлечением данных из источника данных Oracle, однако у меня возникают проблемы с заменой неанглийских символов вопросительными знаками. Некоторая предыстория:

  • Я извлекаю данные из представления Oracle, столбцы которого определены как VARCHAR2
  • При доступе к указанному представлению через Oracle SQL Developer результаты отображаются правильно
  • Я попытался обновить свой System.Web.Odbc до последней версии, но безрезультатно
  • Я знаю, что консоль неправильно отображает определенные символы Юникода, но даже при просмотре необработанных данных с использованием точек останова указанные символы заменяются на ‘?’

Вот доступный для выполнения пример, в котором удалены некоторые конкретные детали реализации:

 using System;
using System.Data;
using System.Data.Odbc;

namespace OdbcTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Trying ODBC Connection");
            DataTable odbcData = GetData("SELECT NAME as name FROM SYSADM.[ViewName] WHERE TRUNC(sysdate) - to_date(HIRE_DT) BETWEEN 0 AND 20");
            Console.WriteLine(odbcData.Rows.Count.ToString()   "rows extracted.");
            foreach (DataRow dataRow in odbcData.Rows)
            {
                foreach (var item in dataRow.ItemArray)
                {
                    Console.WriteLine(item);
                }
            }
            Console.ReadKey();
        }
        public static DataTable GetData(string SQLStatement)
        {
            try
            {
                using (System.Data.Odbc.OdbcConnection connection = new OdbcConnection([DSN Details]))
                {
                    DataSet ds = new DataSet();
                    OdbcCommand command = new OdbcCommand(SQLStatement, connection);
                    OdbcDataAdapter adapter = new OdbcDataAdapter(command);

                    command.CommandTimeout = 600;
                    connection.Open();

                    adapter.Fill(ds);
                    connection.Close();
                    return ds.Tables[0];
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }
    }
}

 

Комментарии:

1. Установлен ли у вас NLS_LANG? Существуют различные другие вопросы / ответы SO, которые показывают, как это сделать.

2. Какой драйвер ODBC вы используете?

3. Что вы получаете SELECT DUMP(NAME, 1016) FROM ... ? Каков ожидаемый результат? Каков набор символов вашей базы данных?

4. Это приложение, которое будет развернуто на управляемых серверах, поэтому изменение NLS_LANG может оказаться невозможным. Драйвер ODBC — это OraClient 11g; результат дампа: AL32UTF8, который, я считаю, должен поддерживать unicode.

5. Быстрое обновление — я установил NLS_LANG локально в соответствие с AL32UTF8, чтобы устранить это как причину, и получил тот же результат при тестировании.