『ボヘミアン・ラプソディ』はなぜ人々を魅了したのか >>

題名のとおりなのですが、データベースに更新するデータに
シングルクォーテーションを含む文字があって、更新時にエラーとなってしまいます。
更新する文字列内にシングルクォーテーションの数が奇数あれば、さらに文字列にシングルクォーテーションを追加して、更新しようとしたんですが、ダメでした。

何か参考になるサイト、解決策をご存知の方、宜しくお願いします。

環境:
OS:WinXPSP2
言語:VB6SP6
DB:SQLServer2000

このQ&Aに関連する最新のQ&A

A 回答 (3件)

シングルクオテーションはエスケープしないとダメですよ。


「'」は「''」と2つ続けます。
    • good
    • 1
この回答へのお礼

シングルクォーテーションを含む文字列を更新する時は、シングルクォーテーションを2つ続けた状態にして更新するとは、知りませんでした。無事に更新できました。勉強になりました。ありがとうございます。

お礼日時:2007/06/30 23:16

エラーがでるのはUPDATE命令ですか?それともINSERT命令ですか?



まず、テーブル「TBL」項目「VALUE」に「A'B」を入れると仮定して
UPDATE TBL
SET VALUE = 'A''B'
にしてもエラーになるということですよね?
逆にデータの「'」文字を外した場合でもエラーになりませんか?

エラーの内容からすると単純な文法ミスだと思われるのですが…
よくやるミスとしては、
1).一番最後の項目なのにもかかわらず「,」をつけてしまっている。
UPDATE TBL
SET ~ , VALUE = 'A''B', WHERE~
~~~
2).一番最後の項目がWHEREとくっついている。
UPDATE TBL
SET ~ , VALUE = 'A''B'WHERE~
~~~
3).全角空白が混入している。
UPDATE TBL
SET ~ , VALUE = 'A''B' WHERE~
~~~
当てはまりませんか?

Executeメソッドにブレークポイントし生成されたSQL文の変数を直接SQLServerのクエリーマネージャ(でしたっけ?)で発行してエラ-になるか確認されてみてはどうでしょうか?
    • good
    • 0
この回答へのお礼

すみません。シングルクォーテーションを2つ続けた状態にして更新する事を知りませんでした。無事、解決しました。いろいろ考えて頂き、ありがとうございました。

お礼日時:2007/06/30 23:18

文字数がオーバーフローしているだけでは?


代入しようとしている項目の最大桁数を確認されてはどうでしょうか?

この回答への補足

文字数オーバーによるエラーではないです。

すみません。エラー内容を記載しておいたほうが良かったですね。
例えば、「A'B」をデータベースに更新しようとしてみた時のエラーは、「'B'の近くに無効な構文があります。」と出ます。

更新方法としては、ADOでコネクションのExecuteメソッドにSQL文を設定して更新しています。

補足日時:2007/06/30 21:44
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QエクセルVBAでセル内のシングルクォーテーションを変数に入れる方法

例えば、エクセルでセル内に「007」という文字を入力したい場合、そのまま入力すると「3」のみが表示されることになるので、「'007」というふうに、シングルクォーテーションを先頭に入れると思います。

そういう先頭にシングルクォーテーションが入っているセルをVBAで変数に格納するとシングルクォーテーションがとれた状態の文字列が変数に入ってしまうのですが、シングルクォーテーション込みで変数化する方法を教えて下さい。もしくは、セルの属性?みたいなものがあり、それを変数として取り出せるなら、そういう方法でもOKです。
ちなみに、NumberFormatLocalではシングルクォーテーションは取り出せませんでした。

よろしくお願いしまうす。


---
エクセル2003
win7

Aベストアンサー

こんばんは。

こんな感じでどうでしょ。対象はCells(1,1)で。

Sub サンプル()
Dim Tmp As String
Dim i As Long
Tmp = sq付与(Cells(1, 1))
i = MsgBox(Tmp)
End Sub

Function sq付与(Arg As Variant) As Variant
If Arg.PrefixCharacter = "'" Then
sq付与 = "'" & Arg.Text
Else
sq付与 = Arg
End If
End Function

いやー久々に回答しましたー。

QVBAで「"」[']をエスケープする方法

PHPで作成したプログラムからCSV形式でデータを出力し
MSエクセル2000のVBAで取り込んでいます。

データに「,」があるとデータが分割されてしますため
「""」で囲んだところ上記の問題は解決しました。

しかし、今度は「"」部分でデータが分割される現象が起こっています
エスケープ方法、または他の解決方法はありますでしょうか?


 (1)「あいう,えお」→「あいう」「えお」に分割される
 (2)「"あいう,えお"」→「あいうえお」で問題ない
 (3)「"あい"う,えお"」→「あい」「う,えお」に分割される
 (4)「"あい'う,えお"」→「あい」「う,えお」に分割される
 (5)「あいう"えお」→「あいう"えお」で問題ない

「,」が解決すると「'」「"」問題が生じ、逆も又同じで困っています

以上、ご教授よろしくお願いします

Aベストアンサー

こんばんわ。

ExcelでCSVデータを取り込むと、ご質問の例のようにはなりませんが、「"」(ダブルクォーテーション)、「,」(カンマ)を組み合せたデータでは、意図しない区切りになる事は確かです。

「あいう,えお」→「あいう」「えお」
「"あいう,えお"」→「あいう,えお」
「"あい"う,えお"」→「あいう」「えお"」
「"あい'う,えお"」→「あい'う,えお」
「あいう"えお」→「あいう"えお」

上のようになります。

ご存知と思いますが、CSVデータは、データとデータの区切りに「,」を使っています。
また、Excelでは、データの先頭に「"」があると、「"」を取り込まずに、「"」と「"」の間を文字データとして取り込みます。
そのため、上の左のデータを取り込めば、上の右のようになると思います。
私のパソコン環境(WinXP Pro,Excel2000)では、そうなります。

それを前提に、対策を取るとすれば、データ内の「,」を別の文字に変えておいて、Excelに取り込んだ後に「,」に戻すのはどうでしょう。

例えば、下の右のように「,」を「゜」に変えて置き、Excelに取り込み後、「゜」を「,」に戻す、です。

「あいう,えお」→「あいう゜えお」
「"あいう,えお"」→「"あいう゜えお"」
「"あい"う,えお"」→「"あい"う゜えお"」
「"あい'う,えお"」→「"あい'う゜えお"」

Excelに取り込み後、「,」に戻すコードは、以下の通りです。

Cells.Replace What:="゜", Replacement:=","

もし、「'」が問題になるようでしたら、「'」を「^」に変えて、

「"あい'う,えお"」→「"あい^う゜えお"」

Excelに取り込み後、下のコードで、戻せばよいでしょう。

Cells.Replace What:="゜", Replacement:=","
Cells.Replace What:="^", Replacement:="'"

こんばんわ。

ExcelでCSVデータを取り込むと、ご質問の例のようにはなりませんが、「"」(ダブルクォーテーション)、「,」(カンマ)を組み合せたデータでは、意図しない区切りになる事は確かです。

「あいう,えお」→「あいう」「えお」
「"あいう,えお"」→「あいう,えお」
「"あい"う,えお"」→「あいう」「えお"」
「"あい'う,えお"」→「あい'う,えお」
「あいう"えお」→「あいう"えお」

上のようになります。

ご存知と思いますが、CSVデータは、データとデータの区切りに「,」を使っています。
ま...続きを読む

Qシングルクォーテーションとダブルクォーテーション

いつも楽しく拝見させて頂いています。
初心者ですが宜しくお願いします。
シングルクォーテーションとダブルクォーテーションの使用方法について質問させて頂きます。
select文でテーブル名を指定するときはそのまま(たとえば'名前'じゃなく名前)しないとエラーになります。そういう風なシングルクォーテーション(又はダブルクォーテーション)を使ってはいけないところ、またシングルクォーテーションにしないといけないところ、ダブルクォーテーションにしないといけないところを教えて頂けますでしょうか?もし両方OKならその違い等も教えていただけるとうれしいです。
以上宜しくお願いします。

Aベストアンサー

文字定数は、「'」で囲む必要があります。

例)SELECT 'ABC' →文字定数の'ABC'と解釈される
SELECT ABC →ABCは、表名や列名と解釈される

数値定数は、多くのRDBMSでは「'」で囲みませんが、MySQLでは独自仕様として囲むことが可能です。

例)SELECT 123 →数値定数の123
SELECT '123' →一般的なRDBMSでは文字として扱われる。MySQLでは数値としても扱える

殆どのRDBMSには予約語があり、RDBMSでは予約語を頼りに構文解析します。表名や列名に英単語やその組み合わせを使おうとすると、予約語とぶつかってしまうことがあります。

例)SELECT FROM FROM →予約語のSELECT FROMの間に「*」や列名が指定されておらず、RDBMSは構文誤りと認識する

それを回避するために、標準SQLでは「"」で表名や列名を囲みます。MySQLでは、文字コードにANSIを使う場合は、「"」で、それ以外には独自仕様で「`」(バッククォーテーション)を使います。

例)SELECT "FROM " FROM →多くのRDBMSでは「"」で囲むことで、RDBMSに最初の「FROM」は、列などの名前であることを知らせる
SELECT `FROM` FROM →ANSI以外のMySQLでは、「`」(バッククォーテション)で囲む

また、「-」(ハイフォン)を表名や列名に使う場合、「"」で囲まないと、SQLでは減算と解釈されます。このように、「"」で囲むことで、記号なども名前に使用することができます。

例)SELECT ABC-DEF →列ABCと列DEFの減算と解釈される
  SELECT "ABC-DEF" →列「ABC-DEF」と解釈される
  SELECT `ABC-DEF' →ANSI以外のMySQLでは、「"」でなく「`」(バッククォーテション)を使用

文字定数は、「'」で囲む必要があります。

例)SELECT 'ABC' →文字定数の'ABC'と解釈される
SELECT ABC →ABCは、表名や列名と解釈される

数値定数は、多くのRDBMSでは「'」で囲みませんが、MySQLでは独自仕様として囲むことが可能です。

例)SELECT 123 →数値定数の123
SELECT '123' →一般的なRDBMSでは文字として扱われる。MySQLでは数値としても扱える

殆どのRDBMSには予約語があり、RDBMSでは予約語を頼りに構文解析します。表名や列名に英単語やその組み合わせを使おうとすると、予...続きを読む

QVBとアクセスでSQL文に変数を使いたいのですが

したいことはレコードの挿入をSQL文で変数を使用して処理したいのですがうまく動作してくれません

StrSQL_1 = _
"insert into 行先情報テーブル (社員ID, 行先, 帰社予定時刻, 備考)" & _
"values (7,'(変数1)','(変数2)','(変数3)')"

変数の部分が置き換わりません、いろいろ調べてみたのですがどうもわかりませんvaluesでは変数を使えないのでしょうか?

もしそうだとするとどのようにすればレコードを挿入するSQL文で変数を利用できるのかをおしえていただけないでしょうか

Aベストアンサー

文字列なんで、&で連結すればOKです。

StrSQL_1 = _
"insert into 行先情報テーブル (社員ID, 行先, 帰社予定時刻, 備考)" & _
"values (7,'" & 変数1 & "','" & 変数2 & "','" &(変数3)& "')"

Q日付型のフィールドに空白を入れる方法を教えてください

ASP(VBScript)でSQLサーバにINSET INTO文を使ってデータを格納しているのですが、日付の部分がNULLの時、「1900/1/1」が入ってしまいます。
そのまま、空白を入れる方法はどうやったらよろしいのでしょうか?

TABLE1の内容は
番号|内容|日付です。

INSERT INTO TABLE1 VALUES ( 1, 'あいう', '')

結果
1|あいう|1900/1/1

Aベストアンサー

あとは、プログラムの書き方次第ですね、、、


If hensu=Null Or hensu="" Then
dt = "NULL"
Else
dt = "'" & hensu & "'"
End IF

E_SQL = "INSERT INTO TABLE1 VALUES & _
"( 1,'あいう', " & dt& ")"
の様に書きます。

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

QAccessのRefresh・Requery・Repaintの違い

Requeryはもう一度ソースレコード(テーブル)を読み込むようです。このとき、テーブルの先頭レコードに移動してしまいます。
Refreshは最新のレコード(テーブル)を再表示するような気がします。レコードの移動は起こらない気がします。
Repaintは、VBAでキャプションなどを変更したとき使っています。
でも、よくわかっていません。
どんなときにどんなメソッドを使えばいいのでしょうか?
詳しい方、よろしくお願いいたします。

Aベストアンサー

たびたびすみません。
調べてたらこんなのがでてきました。
http://www.nurs.or.jp/~ppoy/access/access/acF007.html

参考URL:http://www.nurs.or.jp/~ppoy/access/access/acF007.html

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

QVBSで"をエスケープする文字は?

VBSで"をエスケープする文字はなんでしょうか?

Aベストアンサー

エスケープといった考えが VBSではなかったように思います

"をあらわすには "で括る必要が生じます
たとえば "abc" といった内容なら """abc""" といったリテラルになります
一番外側の "のペアが 文字列としての"になります

"ab"cが欲しいなら """ab""c"
a"bc"が欲しいなら "a""bc"""
a"b"cがほしいなら "a""b""c"
といった具合になります


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング