c # sql в любом месте через форматирование текста odbc - PullRequest
0 голосов
/ 14 мая 2018

Я обращаюсь к базе данных any-sql через odbc с помощью c #. Когда я выбираю некоторые текстовые значения из базы данных, умлауты (ö, ä, ü) не отображаются правильно. Я искал здесь https://www.connectionstrings.com/ способ передать форматирование через строку подключения, но я не смог ничего найти.

Должен ли я преобразовывать строки с помощью c # после получения их из базы данных? Как я могу сделать это в C #? Или есть ли способ, которым я могу сказать мое соединение, чтобы автоматически отформатировать его?

Вот кодексанипета

var connectionString = "Driver={SQL Anywhere 17};Host=localhost;Server=myserver;db=mydatabase;uid=dba;pwd=sql;trusted_connection=yes;";

using (var context = SqlContext.Create(connectionString, SqlProvider.AnySql))
{
    foreach (var dataRow in context.ExecuteReader("SELECT NAME FROM PERSON"))
    {
         var name = dataRow.Get<string>("NAME");

         Console.WriteLine(name); //Output is "G÷ppel" isntead of "Göpel"
    }
}

База данных, с которой я работаю, принадлежит клиенту. У него есть программа, которая использует базу данных. Когда я использую SQL Center для поиска данных, он также говорит «G ÷ ppel», но когда клиент использует свою программу для работы с базой данных, он говорит «Göppel».


Я пытался использовать charste = utf8 (и cp437) в моей строке подключения, но разницы нет. Моя строка подключения теперь выглядит так "Driver={SQL Anywhere 17};Host=localhost;Server=myserver;db=mydatabase;uid=dba;pwd=sql;trusted_connection=yes;charset=utf8"

Центр SQL сообщает, что тип данных столбца varchar.

1 Ответ

0 голосов
/ 14 мая 2018

Мне удалось получить правильный набор символов с помощью запроса.SELECT DB_PROPERTY('CharSet') Он сказал мне, что набор символов imb850.Я пытался передать набор символов через строку подключения, но это не помогло.Поэтому мне пришлось кодировать строку, которую я получил из базы данных.

Вот метод расширения для IDataRecord, который я использую:

public static T Get<T>(this IDataRecord dataRecord, int ordinal, T defaultValue)
{
    //Here i call my default generic extensionmethod
    T value = DatabaseAccessLibrary.Extensions.IDataRecordExtensions.Get<T>(dataRecord, ordinal, defaultValue);

    //Here is the extracode
    if (value != null)
    {
        if (typeof(T) == typeof(string))
        {
            //If the value is not null and typeof string, i encode the value with the characterset
            string correctedValue = Encoding.Default.GetString(Encoding.GetEncoding("ibm850").GetBytes(value.ToString()));

            return (T)Convert.ChangeType(correctedValue, typeof(T));
        }
    }            

    return value;
}
...