#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, чтобы устранить это как причину, и получил тот же результат при тестировании.