Используя C #, возможно ли заставить System.Data.OleDb обрабатывать специальные символы? - PullRequest
4 голосов
/ 12 сентября 2011

У меня есть проект C #, который читает текстовый файл и загружает его в базу данных Oracle, используя System.Data.OleDb в качестве поставщика.Проблема заключается в том, что если файл имеет символы верхнего регистра ascii (например, АСÓ, неразрывный пробел), он всегда генерирует ошибку при попытке загрузить его в Oracle:

Ошибка: Значение данных параметра команды OLEDBConnectionневозможно преобразовать по причинам, отличным от несоответствия знака или переполнения данных .

Наш Oracle может принимать символы ascii верхнего регистра (вставка через SQL * PLUS работает нормально), это System.Data.OleDb, которая имеетпроблема.

Кто-нибудь знает, если есть настройка, чтобы изменить это?Не могу поверить, что это принимает только AZ-0-9.Просматривал всю документацию, но ничего не смог найти.

Если это невозможно, как вы дадите OLEDB знать, чтобы скрыться от персонажа.Надоело ставить \ в файл перед спецсимволами, но все равно выдает ошибку с тем же сообщением.

Ответы [ 3 ]

3 голосов
/ 13 сентября 2011

Обычно это возможно без каких-либо проблем ... так как вы не предоставляете подробности только некоторые общие указатели:

  • База данных Charset должна быть установлена ​​на AL32UTF8Вы можете проверить это, выполнив SELECT parameter, value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';
  • Клиентская кодировка должна быть установлена ​​на AL32UTF8см. параметры этого реестра для NLS_LANG
  • Столбцы должны быть VARCHAR2
  • Строка подключения должна содержать OLEDB.NET=Trueдля дальнейшего ознакомления см. http://download.oracle.com/docs/cd/B28359_01/win.111/b28431/using.htm#i1017221

Другие пункты для проверки могут быть версиями для ОС и клиента и OLEDB ... в некоторых есть ошибки или странное поведение ...

2 голосов
/ 12 сентября 2011

Возможно, вам придется использовать HEX преобразования. Например,% c4 равен Ä.

Попробуйте и дайте мне знать, если это работает. Вот функции преобразования, которые вы можете использовать.

internal String convertAsciiTextToHex(String asciiText)
{
StringBuilder sBuffer = new StringBuilder();
for (int i = 0; i < asciiText.Length; i++)
{
    sBuffer.Append(Convert.ToInt32(asciiText[i]).ToString("x"));
}
return sBuffer.ToString().ToUpper();
}

internal String convertHexToAsciiText(String hexString)
{
    StringBuilder sb = new StringBuilder();

 for (int i = 0; i < hexString.Length; i += 2)
 {
   string hs = hexString.Substring(i, 2);
   sb.Append(Convert.ToChar(Convert.ToUInt32(hs, 16)));
 }
    String ascii = sb.ToString();
    return ascii;
}
1 голос
/ 13 сентября 2011

Ваш тип данных и тип параметра nvarchar2?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...