- PR -

ODP.NETでDataSetを使用したデータベース更新での文字化け

1
投稿者投稿内容
むーみん
常連さん
会議室デビュー日: 2005/06/23
投稿数: 41
投稿日時: 2008-04-14 14:31
VB2005でWindowsアプリケーションを開発しています。DatabaseはOracle9.2です。
データプロバイダは、ODP.NETを使用していて、画面で明細入力→DB更新のプログラムです。

具体的には、DataGridViewにデータベースのテーブルを基にしたDataTableをバインドさせ、明細入力を行い、更新ボタン押下でOracleDataAdapter.Update(dataTable)でデータベースを一括更新しています。

その際に、Insertコマンドが発行されたときに、文字化けが起こる項目(列)があります。
それは、データベースのデータ型はVarchar2で、DataTableでは、String型でその列は定義してあります。
実際のInsertコマンドは、以下のようなイメージでセットしています。

コード:

dim oraDa as New OracleDataAdapter()

oraDa.InsertCommand = New OracleCommand
oraDa.InsertCommand.Connection = Me.Connection
oraDa.InsertCommand.CommandText = "INSERT INTO table3 (CD, COMT)" & _
" VALUES (:CD, NVL(:COMT, ' '))"
oraDa.InsertCommand.CommandType = CommandType.Text
oraDa.InsertCommand.Parameters.Add(New OracleParameter("CD", OracleDbType.Varchar2, 20, "CD"))
oraDa.InsertCommand.Parameters.Add(New OracleParameter("COMT", OracleDbType.Varchar2, 40, "COMT"))


上記の「COMT」という列に、"こめんと"と入力するとそのまま適切に更新されるのですが、"こめんとこめんとこめんと"と入力すると、
"こめんとこめんと�アめんと"と文字化けして登録されてしまいます。

文字化けに関しては、この会議室でも何度か出ているのですが、過去のスレッドを見てみた結果、このケースは、特定の文字コードを表示する際に起きているわけではなく、当てはまらないように思えました。

また、特定の文字コードの文字化けの解決方法としてあがっていた、「データベースのキャラクタセットを直して再構築、Clientの環境変数を設定」をまずはしてみるべきなのだろうとは思うのですが、データベースの再構築はかなり大変なのと、私のような問題の起こっているスレッドがないので、なにか根本的に理解していないことがあって、プログラムに問題があるのではないかと思っています。
しかし。自分では解決できずにいます。

なにか、手がかり等ありましたら、お教えいただけるとありがたいです。


[ メッセージ編集済み 編集者: むーみん 編集日時 2008-04-16 09:41 ]
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2008-04-14 17:21
OracleParameterコンストラクタの第3引数って、バイト数を指定するのかしら?
DBの円コーディングに何を使用しているか分からないけど、
「こめんとこめんとこめんと」だと、Shift JISでも24Byte(UTF8だともっと多くなるかもしれない)
明らかにサイズオーバーなので、それが原因では?
対策は「ちゃんと入力チェックをしよう」としか、言えません。
むーみん
常連さん
会議室デビュー日: 2005/06/23
投稿数: 41
投稿日時: 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なので、そのとおりのつもりで記述しました。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-04-14 21:13
見た感じではソースコードに問題はなさそうですので、

・INSERTする値を変えてみる(別の文字、字数、マルチバイトの有無)
・INSERT文を変えてみる(列を指定しないとか、列数とか)
・ODP.NETのバージョンを変えてみる
・ODP.NETをやめて、別のデータプロバイダ(System.Data.OracleClientとか)を使ってみる

あたりを調べてみられるといかがでしょう。
# データプロバイダを変えただけで直るようであれば、ODP.NETがあやしいのかな?
こあら
大ベテラン
会議室デビュー日: 2007/06/26
投稿数: 157
投稿日時: 2008-04-15 10:19
コード:
    oraDa.InsertCommand.Parameters.Add(New OracleParameter("CD", OracleDbType.Varchar2, 20, "CD"))

    oraDa.InsertCommand.Parameters.Add("COMT", OracleDbType.Varchar2, 40, "COMT"))



(これが問題になるとは思えませんが)
"CD"と"COMT"で使っているAddメソッドが違っているのが気になります。
むーみん
常連さん
会議室デビュー日: 2005/06/23
投稿数: 41
投稿日時: 2008-04-16 09:40
rainさん、こあらさん、ありがとうございます。
返事が大変遅くなってしまいまして、申し訳ありません。

こあらさんにご指摘いただいた件は、私のコードの記述ミスです。
コードを貼り付けて編集するときにミスしてしまい、きづかずにいました。
申し訳ありません。

コード:
    oraDa.InsertCommand.Parameters.Add(New OracleParameter("CD", OracleDbType.Varchar2, 20, "CD"))

    oraDa.InsertCommand.Parameters.Add(New OracleParameter("COMT", OracleDbType.Varchar2, 40, "COMT"))


↑が正しいです。
元の投稿も直しておきます。

rainさんにご指摘いただいたのは、これから調べてみます。
遅くなりまして申し訳ありませんでした。
1

スキルアップ/キャリアアップ(JOB@IT)