2017-02-20 2 views
1

Мне нужно отобразить некоторые данные из Oracle. Но Адресное имя содержит специальный символ типа «Č, Ć, Š, Đ, Ž» и т. Д. Эти специальные символы отображаются в базе данных правильно, но когда я пытаюсь получить значения из базы данных с помощью C#, я получаю это от DataReader:Чтение таких знаков, как Č, Ć, Š, Đ, Ž, от Oracle

  • для Č, я получаю Э.
  • для č, я получаю è
  • для Ĉ, я получаю Æ
  • для Ĉ, я получаю æ
  • для Ž, я получаю \ u008e
  • для ž, я получаю \ u009e
  • для š, я получаю \ u009a

Что мне нужно сделать, чтобы получить от DataReader такое же значение, как значение из базы данных? Вчера я не нашел ответа на google, поэтому решил попросить здесь.

Кто-то, пожалуйста, помогите.

Я использую C# и Visual Studio 2015. Мне просто нужно выбрать строки из базы, я не могу обновлять или вставлять значения. Это мой код:

private OracleConnection _connection; 
private OracleCommand _command; 

public List<Address> GetAddressList() 
{ 
    string query = "SELECT id, name FROM address"; 

    _command = new OracleCommand(query, _connection); 
    OracleDataReader dataReader = _command.ExecuteReader(); 

    List<Address> addressList = new new List<Address>(); 

    while (dataReader.Read()) 
    { 
     Address address = new Address 
     { 
      id = dataReader["id"].ToString(), 
      Name = dataReader["name"].ToString() 
     }; 

     addressList.Add(address); 
    } 

    dataReader.Close(); 

    return addressList; 
} 
+0

Какой из них вы используете? (например, ODP.NET, управляемый драйвер ODP.NET, OraOLEDB). Каково ваше значение «NLS_LANG»? –

+0

Я использую управляемый драйвер ODP.NET, а значение NLS_LANG - American_America.WE8ISO8859P1 –

+0

. Набор символов базы данных - 'WE8ISO8859P1'. Этот набор символов не поддерживает такие символы, как Č, Ž, š, см. [ISO-8859-1] (https://en.wikipedia.org/wiki/ISO/IEC_8859-1). Если вы не используете тип данных NCHAR, перенесите свой набор символов базы данных на что-то еще, что вы не можете вставить или выбрать такие символы. –

ответ

0

Этот вопрос в основном тот же: Trouble using/displaying special characters from Oracle db in .Net app

У вас есть какие-то данные, хранящиеся в базе данных, и Вы должны отображать их. Есть несколько вещей, которые должны быть проверены:

1) я был с помощью правильного кодирования во время экономии?

2) Имеются ли данные в базе данных в удобочитаемой форме (правильный кодирующий кодек)?

3) Использую ли я правильное кодирование во время данных принимает (декодирование)?

Важно проверить все 3 вещи, так как вы можете кодировать их хорошо, но Oracle (или любой DB) просто преобразует их в окончательную кодировку, что может не поддерживать символы. Также, когда вы будете запрашивать это против БД, он будет возвращаться в установленной кодировке, и вы будете преобразовывать его в какую-то окончательную форму.

EDIT:

Поскольку база данных хранит все символы в этой кодировке: WE8ISO8859P1, я бы рекомендовал Вам прочитать другой StackOverflow ответ: - NLS_CHARACTERSET WE8ISO8859P1 and UTF8 issues in Oracle

Проблема заключается в том, что символы сохраняются как только 1 байт (8 бит), а кодировка для American_America, вы не сможете хранить такие символы, как 'ž' 'č' или другие.

решение было бы изменить , кодирующим в Table и/или лучше всего Database.

EDIT # 2, как Wernfried Domscheit заявил:

Вы набор символов базы данных WE8ISO8859P1. Этот набор символов не поддерживает такие символы, как Č, Ž, š, см. ISO-8859-1. Если вы не используете тип данных NCHAR, соответственно. перенесите свой набор символов базы данных на что-то еще, что вы не можете вставить или выбрать такие символы.

+0

- Большое спасибо за помощь, но я до сих пор не решил это. Я только что обновил свой пост. Я не могу делать какие-либо изменения в базе данных, только я могу это сделать, это использовать Select. Итак, я задаюсь вопросом, есть ли способ написать код C# для возврата значения из базы данных, которая будет содержать эти специальные символы? Если нет способа, я собираюсь использовать комбинацию find-replace (find È, replace to Č) –

+1

Не мог бы вы запустить этот запрос 'SELECT * FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';'? – Tatranskymedved

+0

Да, и я получаю это значение «WE8ISO8859P1» –