VB.NETのOleDbCommandで文字列を操作する際にダブルクォーテーションの対処方法

このQ&Aのポイント
  • VB.NETのOleDbCommandを使用して文字列を操作する際に、文字列にダブルクォーテーションが入っている場合の対処方法を教えてください。
  • 特に、mdbのT_テーブルの「名称」というフィールドにダブルクォーテーションが入ることがあり、その場合に「構文が不正です」エラーが発生してしまいます。
  • 現在のプログラムでは、ダブルクォーテーションが入った文字列を正しく操作する方法がわかりません。どのように対処すればよいでしょうか?
回答を見る
  • ベストアンサー

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

以下のように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()

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

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

ryozyryozy
質問者

お礼

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

その他の回答 (2)

回答No.2

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

回答No.1

"""(ダブルクォーテーション3つ)で、実際の文字列として " (ダブルクォーテーション1つ)を、 """"(同4つ)で実際には ""(同2つ)を指定する事になります。 試しに、 MessageBox.Show("""Test"""" ") を貼り付けたプログラムを実行してみて下さい。分かると思います。 なお、この書き方だと分かりにくい、という場合は、Chr(34) (=Chr(&H22)) を使うという手もあります。 例:MessageBox.Show(Chr(34) & "Test" & New String(Chr(&H22), 2))

ryozyryozy
質問者

補足

ご回答ありがとうございます。 それはわかるんですが、今回の場合はどのようにすればいいですか? あらかじめ全レコードで「名称」を検索してダブルクォーテーションが あるかどうかを判断して、その場合にどこかのフィールドにフラグをたてて UPDATEのときに読み飛ばすぐらいしか思いつかないのですが。。。 宜しくお願いします。

関連するQ&A

  • VB.NETからAccessテーブルの文字列を操作する際・・

    VB2005からAccessのmdbのテーブルのあるカラムより数バイトを切り出して別のカラムにコピーするだけの単純なプログラムなのですが、以下のように30バイトや34バイトで切り出しているにもかかわらず16バイトしか入ってきません。 cn.ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0;" _ & "Data Source = d:\csmain\cstool\egz0omen.mdb" cn.Open() com = cn.CreateCommand() com.CommandText = "select カラムA from T_テーブル" dread = com.ExecuteReader Do While (dread.Read()) com = New OleDb.OleDbCommand("update T_テーブル set カラムB = LeftB(カラムA, 30), " _ & " カラムC = LeftB(カラムA, 34) , " _   & " カラムE = LeftB(カラムA, 36) ") com.Connection = cn com.ExecuteNonQuery() Loop <実行結果> カラムA             123456789012345 カラムB~カラムE全て 12345678 試しにバイト数を10バイトずつ増やして、30→40、34→44、36→46にしても結果は同じでした。 宜しくお願い致します。

  • SQLを連続発行する時の正しい(?)書き方は?

    Microsoft Visual Basic 2010 Express の質問です。 ExcelVBAや、AccessVBAで作成したプログラムを、VBに移そうと思っています。 ネットや本のサンプルを、自分のやりたいことに修正しつつ、一応、動作としては希望通りなのですが、元々VBAで簡易に作ったものだけに、本来なら注意すべきインスタンスの管理などがおざなりになっています。 動作は一応正常ですが、果たしてこれで良いのか不安でもありますので質問させていただきます。 大抵の本やサンプルには、複数のSQLを連続で発行するようなものは載っていませんが、いくつものSQLを順次発行していく処理をする時は、どのように記述するのが正しいでしょうか? 例えば、Access2010データベース、C:\test.accdb には、別のテーブルからリンクしたテーブル genpon があるとします。これをコピーしたテーブル、tb01を作る場合、 ------------------------------------ Dim com As OleDb.OleDbCommand Dim cn As OleDb.OleDbConnection = New OleDb.OleDbConnection( _ "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=C:\test.accdb;") cn.Open() ''現在のデータを削除 com = New OleDb.OleDbCommand("DROP TABLE [tb01];", cn) com.ExecuteNonQuery() ''現在のデータを削除 com = New OleDb.OleDbCommand("SELECT * INTO [tb01] FROM [genpon];", cn) com.ExecuteNonQuery() ------------------------------------ SQLとしては、現テーブルをDROPして、SELECT * INTO を発行すれば希望通りで、上記もその通り動きますが、NEWでインスタンス作成を繰り返しているのは、やってはいけない事ではないでしょうか? さらに、例えばこのコードの続きとして、FOR~NEXTや、DO~LOOPで繰り返しを設け、その中でINSERT INTO を発行しながら、データを登録するような処理を加える場合、このままでは NEWをループの回数分、繰り返す事になります。 プロシージャの中で、ループなどで複数のSQLを発行する場合、記述として正しい作法がありましたら、教えてください。

  • ダブルクォーテーションを文字列として扱いたい

     初心者な質問で申し訳ありませんが、ダブルクォーテーション("")を  文字列として扱いたいのですが、どうもうまくいきません。  SQLなどだと、escapeって関数がありますよね?  VBにはそれに似たような関数はあるのでしょうか??

  • Excelに、ダブルクォーテーションで始まる文字列を貼り付けると、ダブルクォーテーションが消えること

    Excelで、ダブルクォーテーションで始まる文字列をセルに貼り付けたときに ダブルクォーテーションが消えるのですが、 Excelってもともと(標凖的な動作として)そういうものですか。 (F2キーを押すなりして)編集状態にして貼り付ければ、ダブルクォーテーションのついたまま貼り付くのですが、 私はセルを選択して貼り付けただけでも大丈夫だと思っていました。 「文字列を貼り付ける」というのは、例えばテキストエディタ上にあるものを手作業でコピーして貼り付ける、ということです。 「ダブルクォーテーションで始まる文字列」と言っても、 ダブルクォーテーションが3つ以上あったときに消えるのは、最初の1組(2つ)ですね。 しかし、 "AAAA"""BBBB のような場合には、なぜか AAAA"BBBB になるのです。 (ちなみに、この文字列を、質問直前の質問内容確認の画面(IE)でコピーしてExcelに貼り付けたときは、違います。) どのような規則に基づいてダブルクォーテーションが消えるのかも疑問です。 このような仕様になっている理由はなんでしょうか。 また、Excelに文字列を貼り付けるという操作を頻繁に行うため、 できれば、編集状態にしなくても、 セルを選択して貼り付けするだけで、そのままダブルクォーテーションも貼り付いてほしいのですが、 そのためにはどうすればよいのでしょうか。 「セルの書式設定」で、表示形式を文字列にすればよいと思ったのですが、だめでした。 セルには文字列を入れるだけで、数式を入れたりしません。 (数式としては扱ってほしくない、という意味です。) Excelは2000です。

  • VB6.0でダブルクォーテーション

    こんばんわ! VB6.0でダブルクォーテーション「”」←これをテキストファイルに書き込みたいのですが、うまく出来ません。 いくつかのサイトを見てダブルクォーテーションを重ねればOKとあったので、 Write #fileno, "文""字""列" とやると、テキストファイルに "文""字""列" とそのまま書き込まれてしまいます。 最終的には下記のようにテキストファイルに書き込みたいです。 文"字"列 アドバイスのほどよろしくお願いいたします。 もしくは、どこか参考になるサイトのご紹介をお願いいたします。

  • 文字列に含まれているダブルクォーテーション( ")を置換する

    文字列に含まれているダブルクォーテーションを除きたいのですが、これをSubstitute関数で置換しようとしてもうまくいきません。ダブルクォーテーションが文字列を指定するために使われるせいだと思うのですが、"を文字列として指定する方法はあるのでしょうか? よろしくお願いします。

  • VBAでの文字列のダブルクォーテーション

    Print #1, "<td class="""" first"""">1ヒート</td>" 結果 <td class="" first"">1ヒート</td> となってしまいます。 <td class=" first">1ヒート</td>にするにはどうしたら良いでしょうか?

  • ダブルコーテーション付き文字列をファイルから読み込むには

    お世話になります。 ホストから出力されたファイルをVBで読込みたいのですが、文字列の中に「":ダブルコーテーション」が含まれます。 VBでopenすると2番目の「":ダブルコーテーション」で切れてしまい、EOFでループすると1レコードで何回もループしてしまします。 対処法等ありましたらご教授ください。 よろしくお願いします。

  • テーブルの結合について質問です。

    テーブルの結合について質問です。 テーブル名:SHOSAI SELECT T1.TIMESTAMP AS 登録, T1.UPDATE AS 更新, T2.CONTENT AS コード, . . . FROM SHOSAI T1 LEFT OUTER JOIN X_CODE T2 ON T1.Y_CODE = T2.CODE テーブル名:SHOSAI SELECT T1.TIMESTAMP AS 登録, T1.UPDATE AS 更新, T2.CONTENT AS コード, T1.BANGO AS 番号, T3.CONTENT AS 曜日, . . . FROM JOHO T1 LEFT OUTER JOIN X_CODE T2 ON T1.Y_CODE = T2.CODE LEFT OUTER JOIN H_CODE T3 ON T1.J_CODE = T3.CODE . . . この2つのテーブルを結合したいのですが それぞれのデータ数が300あり SELECT*で呼びだしてもCSEはエラーとなってしまいます。 項目名を選定してプログラムを組んでもうまくできません。 良い方法があれば教えてください。

    • ベストアンサー
    • MySQL
  • またまた エクセルのユーザー定義で

    前回以下のようなコードを教えていただきましたが、この変換を複数列で使えるようにするにはどうしたらいいのでしょうか? D,G,N,Q,X,AA,の列に効かせたいのですが。 Private Sub worksheet_change(ByVal Target As Range) If Intersect(Target, Columns(1)) Is Nothing Or Selection.Count <> 1 Then Exit Sub Dim str As String str = Target Application.EnableEvents = False If Target <> "" Then If Len(str) = 7 Then Target = Left(str, 5) & "A" & Mid(str, 6, 1) & "-" & Right(str, 1) Else Target = Left(str, 5) & "A" & Mid(str, 6, 2) & "-" & Right(str, 1) End If End If Application.EnableEvents = True End Sub

専門家に質問してみよう