c# sql 通过 odbc 文本格式化变音符号在任何地方 (öäü)

c# sql anywhere via odbc text formatting umlauts (öäü)

我使用 c# 通过 odbc 访问任何-sql-数据库。当我 select 一些来自数据库的文本值时,变音符号 (ö,ä,ü) 无法正确显示。我在这里 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 中心查找数据时,它也显示 "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。

我能够通过查询获得正确的字符集。 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;
}