- PR -

Oracleとシングルコーテーション

1
投稿者投稿内容
さっちん
ベテラン
会議室デビュー日: 2006/09/13
投稿数: 64
投稿日時: 2007-11-02 17:33
いつも参考にしています。

Oracleでシングルコーテーション付きのデータを書き込む場合
「']を「''」で変換すれば書き込みできますが、
既に、VB.NETで画面内容に応じてSQL文を作成し
以下のようなSQLができたものを、共通的な処理で
以下のように変えることができないだろうか??
って思っています。

VBで関数などを作成しようと思いましたが
思いつきません。
何かいい案がありませんでしょうか?

前 INSERT INTO AAA(CD,NAME) VALUES(111,'aaa'aa')
後 INSERT INTO AAA(CD,NAME) VALUES(111,'aaa''aa')

ちなみに、画面項目から「'」を入力不可にはできません。
SQL文作成時に,VBの関数でReplaceで変換もOkですが
量は多すぎて対応しきれそうにありません。

どうか、知恵をお貸し下さい。。。
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2007-11-02 17:42
 私は.NETは概要しか知らないのですが、
Javaだと下記のようなSQLに対して、
後から「?」に値をセットする事が出来るクラスが用意されています。
勿論、セットした値は適切な形式に変換されます。

コード:
INSERT INTO AAA(CD,NAME) VALUES(?, ?) 



似たような事が.NETでも恐らく出来るはずです。
さっちん
ベテラン
会議室デビュー日: 2006/09/13
投稿数: 64
投稿日時: 2007-11-02 17:48
takuさんありがとうございます。

Vb.NETで可能かどうかはまだ確認していませんが
その場合、1つ1つを修正ですよね???

でも今製造してしまっている分を
書き換えるのはかなり時間がかかってしまうんです。

なので、共通的になんとかできないかと思ってます。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2007-11-02 18:01
taku氏がおっしゃる通り、パラメータでやるしかないと思います。
例えば以下のようなSQL文があったとして

INSERT INTO AAA VALUES('111','222')

これをSQL文が全て作成されてから
INSERT INTO AAA VALUES('111'',''222') /* 1列に[111','222]を挿入したい。 */
と変換するのか
INSERT INTO AAA VALUES('111','222') /* 2列に[111]と[222]を挿入したい。 */
と変換するのか判断できないと思います。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-11-03 11:33
元々の作り方が悪いので、手戻りは仕方がないと思います。
値をバインドするSQLにするにしても、
連結する値を関数で処理してから渡すにしても、
何かしらの改造は必要でしょう。

「面倒だから楽に解決できる、魔法のような解決法」なんてものは存在しません。
そもそも入力値をそのままSQLに連結するのは考慮漏れというよりも、
今のご時世、単純なバグです。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-11-04 14:05
引用:

さっちんさんの書き込み (2007-11-02 17:33) より:
VBで関数などを作成しようと思いましたが
思いつきません。
何かいい案がありませんでしょうか?

前 INSERT INTO AAA(CD,NAME) VALUES(111,'aaa'aa')
後 INSERT INTO AAA(CD,NAME) VALUES(111,'aaa''aa')


複雑なケースとして、
"INSERT INTO AAA(CD,NAME) VALUES(111,'aaa','aa')"
みたいなことを想定すると、つぎのやりかたが考えられます。

まず、"AAA(CD,NAME)" の部分を解析して、列数が2個であることを判別する。
つぎに、"VALUES(111,'aaa','aa')" の中の括弧の中をとりあえずシングルクォーテーションは無視して、カンマだけで2つに区切ることができるパターンをしらみつぶしに探す。この例の場合はつぎの2パターンがあります。
(a) "111" と "'aaa','aa'"
(b) "111,'aaa'" と "'aa'"
しかし(b)はおかしい。となると(a)だけが残るので、"'aaa','aa'" をエンコードして "'aaa'',''aa'" にします。

作ろうとしましたが、順列や組み合わせを生成するのがめんどくさくて、挫折しました。実行時に1つのパターンに特定できないときは、問い合わせの InputBox を画面に出せば良いでしょう。
(本気でそんなことをお勧めしているわけではありません。一度SQL文になったものを後からエンコードし直すことは厳密には無理です。)

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2007-11-04 14:09
引用:

さっちんさんの書き込み (2007-11-02 17:33) より:
ちなみに、画面項目から「'」を入力不可にはできません。


ちなみに、カンマ(",")を入力不可にできれば、原理的には対処できますね。(これもお勧めするわけではありません。あくまでもそういう考えはできる、というだけの話です。)

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2007-11-05 10:02
 でも、このシステムっていまどきこんな実装をやっていると、
セキュリティは大丈夫なのかと疑ってしまいますよね。
最低限、ログイン部分の実装は直さないと駄目っぽいですね。

[ メッセージ編集済み 編集者: taku 編集日時 2007-11-05 10:02 ]
1

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