新しく質問する

VB.NETのOleDbCommandにて文字列を操作する際、文字列にダブルクォーテーションが入っていた場合は?

役に立った:1件
  • 質問者:ryozyryozy
  • 投稿日時:2008/06/21 09:01
  • 困り度:すぐに回答が欲しいです
  • 友達に紹介
  • ブログに書く
  • 教えて!gooお気に入り

以下のようにmdbのT_テーブルにある「名称」というフィールドの文字列を操作するだけの単純なプログラムなのですが、
この「名称」にダブルクォーテーションが入ることがあり、その場合に「構文が不正です」エラーで途中でこけてしまいます。
このような場合、どのように対処すれば宜しいのでしょうか?
宜しくお願い致します。

Len_Shohin = fxMidB(dread("名称"), 30)
Len_Koumoku = fxMidB(dread("名称"), 34)
Str_Hyouji = StrConv(dread("名称"), VbStrConv.Narrow)

com = New OleDb.OleDbCommand("update T_テーブル set 商品名称 = Left(名称, " & Len_Shohin & "), " _
& " 慣用句名称 = Left(名称," & Len_Shohin & "), 項目名称 = Left(名称," & Len_Koumoku & "), " _
& " 一般名 = Left(名称," & Len_Shohin & "), 表示名称 = Left( """ & Str_Hyouji & """,36) " _
& " where オーダコード = '" & dread("オーダコード") & "'" & "")

com.Connection = cn
com.ExecuteNonQuery()

この質問への回答は締め切られました。
このQ&Aは役に立ちましたか?(役に立った:1件)
  • 参考になった:0件

No.3ベストアンサー20pt

  • 回答者:K-Sogacchi
  • 回答日時:2008/06/23 09:27

たびたびすみません。ANo.1です。
ごめんなさい、Accessで直接試してみたんですが、副問合せは使わなくてもいけそうですね(汗)
すみませんです…
とりあえず、
表示名称 = Left( """ & Str_Hyouji & """,36)
のあたりのクォーテーションを修正して実行しなおしてみてください。
(あと、Len_??? は数値でしょうから、出来ればCStrかCType(???,String)で
 変換掛けておいた方がいいかもしれません)

通報する

この回答へのお礼

色々とありがとうございました。
まぁなんとかいけました。。。

  • 参考になった:0件
  • 回答者:K-Sogacchi
  • 回答日時:2008/06/23 09:02

ANo.1です。すみません勘違いしてました。
で、そのUpdate文ですが、
Left(名称,…
の「名称」ってのはフィールド名ですよね?
そこにフィールド名を直接関連付けるには、副問合せを使う等しないと
不可能だと思います。
(副問合せの結果に直接関数を適用ってのは、やった事無いけど…普通に出来るのかなぁ?)
今回の場合は、「名称」を使う部分が多いので、先に該当の「名称」を取得して
その文字列を直接編集した方が楽だと思います。
"update T_テーブル set 商品名称 = Left('" & meisyou & "', " & CStr(Len_Shohin) & …
みたいな感じで。
(meisyou は、取得した文字列を格納した変数)

あ、あと、SQL文で文字列の指定はシングルクォートですよ。
Left( """ & Str_Hyouji & """,36) とかは直さないといけません。
…ん? そもそもStr_Hyouji を「SQL文で」編集する必要は無いような…?

通報する

  • 参考になった:0件
  • 回答者:K-Sogacchi
  • 回答日時:2008/06/21 16:32

"""(ダブルクォーテーション3つ)で、実際の文字列として " (ダブルクォーテーション1つ)を、
""""(同4つ)で実際には ""(同2つ)を指定する事になります。
試しに、
MessageBox.Show("""Test"""" ")
を貼り付けたプログラムを実行してみて下さい。分かると思います。

なお、この書き方だと分かりにくい、という場合は、Chr(34) (=Chr(&H22))
を使うという手もあります。
例:MessageBox.Show(Chr(34) & "Test" & New String(Chr(&H22), 2))

通報する

この回答への補足

ご回答ありがとうございます。

それはわかるんですが、今回の場合はどのようにすればいいですか?

あらかじめ全レコードで「名称」を検索してダブルクォーテーションが
あるかどうかを判断して、その場合にどこかのフィールドにフラグをたてて
UPDATEのときに読み飛ばすぐらいしか思いつかないのですが。。。

宜しくお願いします。

  
このQ&Aは役に立ちましたか?(役に立った:1件)

このページのトップへ

Facebook公式ページ

公式Twitter