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;
}
我使用 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;
}