- 題名: ウインドウズアプリからWebのBDに挿入すると文字化けする
- 日時: 2011/11/09 9:05:46
- ID: 29344
- この記事の返信元:
- (なし)
- この記事への返信:
- [29349] Re[1]: ウインドウズアプリからWebのBDに挿入すると文字化けする2011/11/10 19:14:53
- ツリーを表示
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のばあい、 日本語の文字が化けます。
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
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 稼働中のもので可能かどうかについてはそこまで深い知識を持ち合わせていませんの でわかりません。
分類:[.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");
}