@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

ADO.NET における機種依存文字の更新

1
投稿者投稿内容
るいるい
常連さん
会議室デビュー日: 2004/08/01
投稿数: 21
投稿日時: 2008-07-01 14:47
現在、文字コードが Shift_JIS のデータベースに対する更新で悩んでいることがあり、皆さんのお知恵を拝借させていただきたくて、投稿させていただきます。

Shift_JIS 上の鰍ニいう文字ですが、ご存知の方も多いかもしれませんが、IBM拡張文字(0xFA58)とNEC拡張文字(0x878A)の2種類が存在します。

問題は、IBM拡張文字の""の含むデータを 、OracleCommandBuilder で UpdateCommand を自動生成した OracleDataAdapter で、更新をしようとすると「同時実行違反」のエラーが発生します。

原因は、UpdateCommand の SQL が問題と思われます。 Unicode 上の ""は Shift_JIS において IBM 拡張文字(0xFA58)の "" に割り当てられいるので、生成される WHERE 句の値は、DB 上の値と不一致となります。よって、更新対象データが存在しない→「同時事項違反」となるかと。

そもそも、CommandBuilder で自動生成した UpdateCommand の SQL はすべての項目を WHERE 句に記述するので、手動で PK の項目だけが WHERE 句になるような Update 文を生成すれば解決するはずです。とはいえ、レアケースとはいえ万一、PK のカラムにこのような文字が含まれていると、やはり同様のエラーになってしまい、根本的な解決とは言いがたい状態です。

前置きが長くなりましたが、皆さまにお知恵を拝借したいのですが、そもそもこのようなデータが存在するテーブルの更新はどのように更新していらっしゃいますでしょうか。何か打開策、過去に同様の経験をしたなどがございましたらぜひご教授頂ければ幸いです。

このようなShift_JIS と Unicode が n:1 となる文字は ""以外にも多数あり、何とかしたいと考えております。

# とはいえ、個人的には.NET Framework をはじめとする Unicode で文字を表す実行環境や
# 言語ではこのようなデータは更新できないのでは?とやや諦めモードになっています。
ぴんふ
ベテラン
会議室デビュー日: 2006/07/13
投稿数: 80
投稿日時: 2008-07-01 17:03
こんにちは。ぴんふです。

文面からDBはOracleと思われますがバージョンは?
文字コードがShift_JISのDBとのことですが、キャラクタセットは
JA16SJISTILDEまたはJA16SJISということでしょうか?

私の場合は
アプリケーションの種類、利用対象者、仕様にもよりますが、まずは機種依存文字の使用を禁じることをお客様にお奨めし、了承が得られればバリデーションではじきます。
どうしてもというのなら事前に文字コードをチェックして然るべきものに読み替えるとか・・・・。

るいるい
常連さん
会議室デビュー日: 2004/08/01
投稿数: 21
投稿日時: 2008-07-01 17:14
ぴんふさん
ご返信ありがとうございます。

文字コードは、JA16SJIS です。
新規に入力するデータであれば、当然ながらご指摘の通り、機種依存文字の入力を禁じることで問題ないですね。しかし、今回問題となっているのは過去のシステムから引き継いだデータや、他システムからの受け取ったデータなんです。

機種依存文字についてはデータパッチしてしまいたいところです。しかし、詳細については申し上げられないのですが、結果的に言うと業務要件的にこれらデータは修正することが出来ず難儀しております。

おそらくこのような現象は .NET だけではなく Java 等の言語でも発生していると思われます。
ぴんふ
ベテラン
会議室デビュー日: 2006/07/13
投稿数: 80
投稿日時: 2008-07-01 17:26
やっぱり過去データがらみですか・・・。
ストアドプロシージャにしてDBに任せるとかじゃだめですか?
テッテ
ベテラン
会議室デビュー日: 2008/03/16
投稿数: 91
投稿日時: 2008-07-01 17:31
引用:

るいるいさんの書き込み (2008-07-01 14:47) より:
そもそも、CommandBuilder で自動生成した UpdateCommand の SQL はすべての項目を WHERE 句に記述するので、手動で PK の項目だけが WHERE 句になるような Update 文を生成すれば解決するはずです。とはいえ、レアケースとはいえ万一、PK のカラムにこのような文字が含まれていると、やはり同様のエラーになってしまい、根本的な解決とは言いがたい状態です。


この部分に関しては、手動でやらずともConflictOption プロパティ を OverwriteChanges にすれば、
WHERE句が主キーだけで生成されると思います。
るいるい
常連さん
会議室デビュー日: 2004/08/01
投稿数: 21
投稿日時: 2008-07-01 17:51
ぴんふさん
いずれにしても、.NET では Unicode で文字を表現しているので、パラメーターなどで値を渡しても、NG なんですよね。
こんな無理難題にもかかわらずレスありがとうございます。

テッテさん
ConflictOption というプロパティがあることをまったく見逃していました。少なくとも OverwriteChanges 指定することで、エラーが発生せず更新はできるようになりますね。
文字コードが変わってしまうという現象は回避できませんが、更新できるようになるだけでも、ありがたいです。
1

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