Как правильно работать с данными в .NET? - PullRequest
0 голосов
/ 15 апреля 2010

Я использую сетку данных в C # WinForms с данными из базы данных Sybase, и символы отображаются некорректно. Вот что я вижу:

мой обзор данных http://i42.tinypic.com/10ifjwo.jpg

Знаете, как я могу это исправить?

Ответы [ 4 ]

3 голосов
/ 15 апреля 2010

Это не так, поскольку CultureInfo служит другой цели. Вам нужен класс кодирования. Вы получите один с:

  var enc = Encoding.GetEncoding(850);

Что вы можете затем использовать для преобразования текста, используйте enc.GetString ().

Сделайте шаг назад, хотя эта кодировка действительно старая, 25 лет - это долгое время в разработке программного обеспечения. Вы действительно должны рассмотреть возможность обновления этой базы данных. Более того, кодирование должно обрабатываться вашим поставщиком базы данных Sybase. Он должен уже конвертировать текстовые столбцы в Unicode. Вам нужно только преобразовать себя, если текст каким-то образом содержится в BLOB-объекте.

2 голосов
/ 21 апреля 2010

У меня часто возникала эта проблема с получением данных из моей базы данных Sybase в Windows. Вы сохраняете данные как cp850 (что хорошо), sybase может вернуть их вам в любом наборе символов, который вы пожелаете, однако клиент должен сообщить серверу, какой набор символов ему нужен, и сервер преобразует его для Вы перед возвратом данных.

Однако по умолчанию соединения ado.net, oledb или odbc не определяют набор символов клиента. Sybase не будет применять никаких преобразований, и Windows (или ваше приложение) предполагает, что данные находятся в его предпочтительном наборе символов.

Исправление заключается в указании набора символов при подключении. Тот, который работал для меня, это "iso_1". (Вы также можете найти WIN1252 в качестве альтернативы, но я его не проверял)

Так что, если вы используете odbc или oledb, откройте диспетчер соединений, перейдите на вторую или третью страницу и поместите «iso_1» в поле набора символов. Вы также можете указать это в строке подключения, но я не могу вспомнить точный синтаксис, возможно "; charset = iso_1". ​​

Если вы используете ado.net, я уверен, что вы можете сделать то же самое, но опять же, я не уверен в точном синтаксисе.

1 голос
/ 16 апреля 2010

Вы подключаетесь через строку подключения? Попробуйте добавить в строку подключения:

; Текущий язык = испанский

0 голосов
/ 03 июля 2015

Наконец, я нашел решение в сообщении .

Вы должны добавить в строку подключения следующий параметр:

KeepOrgMultibyte = 1;

...