ADO.Net は、SQL Server プロバイダーからのすべての文字列型を C# 文字列として公開します。これは、既に Unicode に変換されていることを意味します。または のような非 Unicode ソース列 (明らかにそうであるように) のchar(n)
場合varchar(n)
、ADO.Net SQL Server プロバイダーはソース照合情報を使用してエンコードを決定します。したがって、Unicode 以外の SQL Server データが間違ったエンコーディングで .Net に表示される場合は、間違った照合順序でプロバイダーに提示されたに違いありません。データに適切な照合順序を選択すると、SQL Server 用の ADO.Net プロバイダーが適切なエンコーディングを使用して変換します。たとえば、Collation and Code Page Architectureに記載されているように、キリル文字の照合はコード ページ 1251になります。、これはあなたが望むものである可能性が非常に高いです。リンクされた記事には、問題を解決するために必要なすべての情報が含まれています。
using System;
using System.Text;
using System.Data.SqlClient;
using System.Windows.Forms;
public class Hello1
{
public static void Main()
{
try
{
using (SqlConnection conn = new SqlConnection("server=.;integrated security=true"))
{
conn.Open ();
// The .cs file must be saved as Unicode, obviously...
//
string s = "Работа в германии";
byte[] b = Encoding.GetEncoding(1251).GetBytes (s);
// Create a test table
//
SqlCommand cmd = new SqlCommand (
@"create table #t (
c1 varchar(100) collate Latin1_General_CI_AS,
c2 varchar(100) collate Cyrillic_General_CI_AS)",
conn);
cmd.ExecuteNonQuery ();
// Insert the same value twice, the original Unicode string
// encoded as CP1251
//
cmd = new SqlCommand (
@"insert into #t (c1, c2) values (@b, @b)", conn);
cmd.Parameters.AddWithValue("@b", b);
cmd.ExecuteNonQuery ();
// Read the value as Latin collation
//
cmd = new SqlCommand (
@"select c1 from #t", conn);
string def = (string) cmd.ExecuteScalar ();
// Read the same value as Cyrillic collation
//
cmd = new SqlCommand (
@"select c2 from #t", conn);
string cyr = (string) cmd.ExecuteScalar ();
// Cannot use Console.Write since the console is not Unicode
//
MessageBox.Show(String.Format(
@"Original: {0} Default collation: {1} Cyrillic collation: {2}",
s, def, cyr));
}
}
catch(Exception e)
{
Console.WriteLine (e);
}
}
}
結果は次のとおりです。
---------------------------
---------------------------
Original: Работа в германии Default collation: Ðàáîòà â ãåðìàíèè Cyrillic collation: Работа в германии
---------------------------
OK
---------------------------