- - PR -
ODP.NETでDataSetを使用したデータベース更新での文字化け
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-04-14 14:31
VB2005でWindowsアプリケーションを開発しています。DatabaseはOracle9.2です。
データプロバイダは、ODP.NETを使用していて、画面で明細入力→DB更新のプログラムです。 具体的には、DataGridViewにデータベースのテーブルを基にしたDataTableをバインドさせ、明細入力を行い、更新ボタン押下でOracleDataAdapter.Update(dataTable)でデータベースを一括更新しています。 その際に、Insertコマンドが発行されたときに、文字化けが起こる項目(列)があります。 それは、データベースのデータ型はVarchar2で、DataTableでは、String型でその列は定義してあります。 実際のInsertコマンドは、以下のようなイメージでセットしています。
上記の「COMT」という列に、"こめんと"と入力するとそのまま適切に更新されるのですが、"こめんとこめんとこめんと"と入力すると、 "こめんとこめんと�アめんと"と文字化けして登録されてしまいます。 文字化けに関しては、この会議室でも何度か出ているのですが、過去のスレッドを見てみた結果、このケースは、特定の文字コードを表示する際に起きているわけではなく、当てはまらないように思えました。 また、特定の文字コードの文字化けの解決方法としてあがっていた、「データベースのキャラクタセットを直して再構築、Clientの環境変数を設定」をまずはしてみるべきなのだろうとは思うのですが、データベースの再構築はかなり大変なのと、私のような問題の起こっているスレッドがないので、なにか根本的に理解していないことがあって、プログラムに問題があるのではないかと思っています。 しかし。自分では解決できずにいます。 なにか、手がかり等ありましたら、お教えいただけるとありがたいです。 [ メッセージ編集済み 編集者: むーみん 編集日時 2008-04-16 09:41 ] | ||||
|
投稿日時: 2008-04-14 17:21
OracleParameterコンストラクタの第3引数って、バイト数を指定するのかしら?
DBの円コーディングに何を使用しているか分からないけど、 「こめんとこめんとこめんと」だと、Shift JISでも24Byte(UTF8だともっと多くなるかもしれない) 明らかにサイズオーバーなので、それが原因では? 対策は「ちゃんと入力チェックをしよう」としか、言えません。 | ||||
|
投稿日時: 2008-04-14 17:58
かずくんさん。アドバイスありがとうございます。
OracleParameterの引数は、OracleParameterクラスのコンストラクタで、New(paramerterName As String, type As Oracle.DataAccess.Client.OracleDbType, size As Integer, srcColumn As String)というのがあったので、それを使用しています。 DBのエンコーディングというのは、V$NLS_PARAMETERSビューのNLS_CHARACTERSETパラメータの値のことでいいのでしょうか? よくわからないのですが、過去のスレッドを参考に、Oracleのグローバリゼーションのマニュアルを見て調べたりはしたのですが、、、すみません。 教えていただけると助かります。 ちなみに、上記の値は、JA16SJISになっています。 文字化けしてしまう項目は、データベース上のサイズは、Varchar2の40なので、そのとおりのつもりで記述しました。 | ||||
|
投稿日時: 2008-04-14 21:13
見た感じではソースコードに問題はなさそうですので、
・INSERTする値を変えてみる(別の文字、字数、マルチバイトの有無) ・INSERT文を変えてみる(列を指定しないとか、列数とか) ・ODP.NETのバージョンを変えてみる ・ODP.NETをやめて、別のデータプロバイダ(System.Data.OracleClientとか)を使ってみる あたりを調べてみられるといかがでしょう。 # データプロバイダを変えただけで直るようであれば、ODP.NETがあやしいのかな? | ||||
|
投稿日時: 2008-04-15 10:19
(これが問題になるとは思えませんが) "CD"と"COMT"で使っているAddメソッドが違っているのが気になります。 | ||||
|
投稿日時: 2008-04-16 09:40
rainさん、こあらさん、ありがとうございます。
返事が大変遅くなってしまいまして、申し訳ありません。 こあらさんにご指摘いただいた件は、私のコードの記述ミスです。 コードを貼り付けて編集するときにミスしてしまい、きづかずにいました。 申し訳ありません。
↑が正しいです。 元の投稿も直しておきます。 rainさんにご指摘いただいたのは、これから調べてみます。 遅くなりまして申し訳ありませんでした。 |
1