DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ウインドウズアプリからWebのBDに挿入すると文字化けする

環境/言語:[Windows Vista/7 C# VC2010 Winアプリ]
分類:[.NET]

いつも大変お世話になっております。

SQLでウインドウズアプリよりWeb上にあるDBにアクセスするという件でお世話になりました。

この件は、OKですが、実際(まだ、テスト環境の話です)にInsert, Update すると、日本語(漢字、カタカナ)が、'?' に文字化けします。

エンコードの問題(?)と考えますが、どこをどう変更したらいいのでしょうか?

教えてください。下記コードは、挿入でテスト(開発環境)では、挿入自身は上手くいってます。日本語は文字化けですが、数字とアルファベットは問題なし。

コード
string sqlSelect = string.Format("SELECT id, data, .... FROM xxxTable ORDER BY id");
string sqlInsert = string.Format("insert into xxxTable (id, data, .... ") values ('@id', '@data', ..... )");
上記文字は、一部割愛。

try
{
SqlDataAdapter adapter = new SqlDataAdapter(sqlInsert, conn);

// select用コマンド・オブジェクトの作成
SqlCommand selectCmd = new SqlCommand();
selectCmd.Connection = conn;
selectCmd.CommandText = sqlSelect;

// データアダプタの作成
adapter.SelectCommand = selectCmd;

// データセットへの読み込み
System.Data.DataSet ds = new System.Data.DataSet();
adapter.Fill(ds, "xxxTable");

// データの追加
System.Data.DataTable dt = ds.Tables["xxxTable"];

foreach (ReportForWEB data in report)
{
System.Data.DataRow newRow = dt.NewRow();

newRow["id"] = data.id;
newRow["data"] = data.data;
:
:
dt.Rows.Add(newRow);
}

// コマンド自動作成
SqlCommandBuilder cb = new SqlCommandBuilder(adapter);

// データベースの更新
num = adapter.Update(ds, "xxxTable");
}
2011/11/10(Thu) 22:30:18 編集(投稿者)

■No29344に返信(Hiroさんの記事)
SqlDataAdapterのコンストラクタの第一引数にはSelectステートメントを指定する
必要がありますのでそこの部分のコードはすこし違うと思いますが、文字化けに関し
て確率が高いか低いかは別にして可能性があるものとしては以下のようなことが考え
られます。

・reportに化けた文字が入っている。
・ReportForWEBが列挙されるときに文字が化ける。
・ReportForWEBのプロパティが参照されるときに文字が化ける。
・DBに文字が格納されるときに文字が化ける。
・DBから文字を取得するときに文字が化ける。
・文字を表示する過程で文字が化ける。

System.Data.DataRow newRow = dt.NewRow();    
newRow["id"] = 1;
newRow["data"] = "タージマハル";
:
:
dt.Rows.Add(newRow);

こんな感じにreportやReportForWEBオブジェクトを除去してデータの挿入を試みて
文字化けが起こるようであれば、列挙した可能性のうちの上三つは除外されるだろう
とそのように思います。

ところで、文字化けしていることはMicrosoft SQL Server Management Studioか何か
でデータベースの内容をを見て確認されましたか?もしそうであれば文字を表示する
過程で文字が化けるというのも除外することができます。

文字化けする列のデータ型と照合順序はどのように定義されていますか?データ型が
ncharやnvarchar型であれば文字はUnicodeで格納されます。文字化けは起こりません。
しかしデータ型がchar型やvarchar型のばあい、文字は照合順序のコードページで
格納されます。文字化けが起こる可能性があります。たとえば、
Latin1_General_CI_AIのコードページはWindows-1252です。日本語の文字を扱うこと
ができません。データ型がvarcharで照合順序がLatin1_General_CI_AIのばあい、
日本語の文字が化けます。
■No29349に返信(もりおさんの記事)
> 2011/11/10(Thu) 22:30:18 編集(投稿者)
>
> ところで、文字化けしていることはMicrosoft SQL Server Management Studio
やってみました、結論から言うと「照合順序がLatin1_General_CI_AI」になっていました。DBを削除して作り直して、「Japanese_CI_AS」であることを確認後に挿入など行うと上手くいきました。

> データ型がvarcharで照合順序がLatin1_General_CI_AIのばあい、日本語の文字が化けます。
最初にDBファイルを作成した時になぜこの形になったのかわかりませんが結果ご指摘の通りでした。
多分、VS2010のソリューションエクスプローラーのApp_Dataを右クリックしてDBを追加作成した気がします。

大変助かりました、ありがとうございました。
解決済み!
2011/11/13(Sun) 07:10:46 編集(投稿者)

■No29351に返信(Hiroさんの記事)
原因が特定されたようでなりよりです。SQL Serverのバージョンは2005でしょうか。
SQL Serverで文字を扱ううえでのガイドラインがあります。詳しくはそちらをご覧いただく
のがよいのですが、文字化けを避けるための方策としましてはデータ型をncharやnvarchar型に
して照合順序をJapanese_90_BIN2にするのがよいと思われます。

Japaneseのコードページは932です。データ型がchar型やvarchar型のばあいコードページ932で
文字が格納されます。コードページ932にない𠮟や剝などの文字が化けます。データ型を
nchar型やnvarchar型にすればUnicodeで文字が格納されますので問題ありません。

文字化けとは関係ありませんが、照合順序がJapanese_CI_ASだと一部の文字の比較が行われな
いためにデータを登録するときやデータを取得するときに意図しない動作をすることがありま
す。Japanese_90_BIN2だと問題ありません。

SQL Server の JIS2004 対応に関するガイドライン 
http://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyID=e942342a-719f-4841-a9d2-f6d9fd58299f&displaylang=ja
解決済み!
お世話になります。


■No29354に返信(もりおさんの記事)
> 2011/11/13(Sun) 07:10:46 編集(投稿者)
>
> ■No29351に返信(Hiroさんの記事)
> 原因が特定されたようでなりよりです。SQL Serverのバージョンは2005でしょうか。
SQLは、VS2010 をインストールしたとき、バージョンが2008になったと思います(開発環境)。実際運用するサーバーは、OSがWindows Server 2008 Small Business(微妙に単語の並びがちがうかも?)でこちらも2008です。
おそらく、大きな差はないと思いたいですが....

> 文字化けを避けるための方策としましてはデータ型をncharやnvarchar型に
> して照合順序をJapanese_90_BIN2にするのがよいと思われます。
これは、文字型として保管するものすべてでしょうか?今まで、varcharで数字文字やアルファベット、日本語を保存していました。これらをすべて移行すべき?という意味ですか?
それと、「照合順序をJapanese_90_BIN2」は、DB作成後でも変更できますか?今回のトラブルは、まだやり直せますが現在稼働中のものも変更したいと考えた時、変更可能でしょうか?
2011/11/13(Sun) 22:38:09 編集(投稿者)

■No29355に返信(Hiroさんの記事)
Hiroさんの言われるすべての列を変更すべきという意味ではありませんで、日本語の
文字が文字化けすることを避けるうえで一般論として望ましいという意味です。個別
にはそれぞれ検討すべき事柄があると思います。日本語の文字が入力されないのであ
れば変える必要はありませんし、コードページ932にある文字しか入力されない仕様
であったり、他のシステムと連携をとるうえで現在のデータ型や照合順序が必要なも
のであれば変更しないほうがよいと思います。

照合順序は列単位で設定することができます。既存の列の照合順序を変えるばあいは
次のようなSQLで可能です。SQL Server 2008にはより多くの文字に対応した
Japanese_XJIS_100という照合順序があります。

ALTER TABLE tableName
    ALTER COLUMN columnName nvarchar(50) COLLATE Japanese_XJIS_100_BIN2

データを取得するときなどに指定することも可能です。

SELECT
    columnName
FROM
    tableName
ORDER BY
    columnName COLLATE Japanese_XJIS_100_BIN2
 
稼働中のもので可能かどうかについてはそこまで深い知識を持ち合わせていませんの
でわかりません。
■No29356に返信(もりおさんの記事)
> 2011/11/13(Sun) 22:38:09 編集(投稿者)

> 他のシステムと連携をとるうえで現在のデータ型や照合順序が必要なも
> のであれば変更しないほうがよいと思います。
私なりに調べた結果(DBと照合順序の意味)とりあえず現状で動いているものは構わずに置くことにしました。
現状、Japanese_CI_ASの構成になっています。
これ以降は、Japanese_XJIS_100やJapanese_90_BIN2が推奨とのことですので変更していきます。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板