プロが教える店舗&オフィスのセキュリティ対策術

こんにちは。
現在ASPでDB登録、削除、更新を実施するごくごく基本的なPageを
つくっているのですが、どうしてもDBの更新ができなくて困ってます。。

各パラメータはフォームから入力される(更新される)値です。

If ACTION3 = "edit1" Then
db.Execute "UPDATE kekkon SET [名前_姓] = '" & name_sei_kan3 & "',[名前_名] = '" & name_na_kan3 & "',[名前_姓_かな] = '" & name_sei_hira3 & "',[名前_名_かな] = '" & name_na_hira3 & "',[生年月日] = '" & seinen3 & "',[Email] = '" & email3 & "' WHERE [ID] = '" & IDID3 & "'"
End If

このUPDATEの文で下記のようなエラーがでます。

エラー タイプ
Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
[Microsoft][ODBC Microsoft Access Driver] 抽出条件でデータ型が一致しません。

DBはアクセス2002でデータの型は以下のとおりです。
ID:オートナンバー型
名前_姓:テキスト型
名前_名:テキスト型
名前_姓_かな:テキスト型
名前_名_かな:テキスト型
生年月日:日付/時刻型
Email:テキスト型

なぜうまく動かないのか3日間調べましたが、ダメでした。。
素人質問で申し訳ないですが、ヒントを頂ければと思いますので
宜しくお願い致します。

A 回答 (6件)

No5 を書いた者です。



>ちなみにもし差し支えなければ、15行目の最後の『& " "』は
>どういう意味なのか教えて頂いてもよろしいでしょうか。

もちろん無くても大丈夫です。
私がつける理由として2つ。
1つ目
「'(シングルコーテーション)」も何もついてないよね?の確認を明確にしている。
2つ目
条件追加のとき既存ソースを触らなくて済む。
たとえば、『[名前_名_かな] like 'タロウ*' 』を追加したい場合。
strSql = strSql & "AND [名前_名_かな] like 'タロウ*' "
の1行追加するだけ。
もちろん、
strSql = strSql & " AND [名前_名_かな] like 'タロウ*' "
AND の前にスペース にすればいいのですが、
これだと、後で見たときに、WHERE と AND の先頭が揃わないので、
ちょっと嫌かなぁ~と思ってるだけです。
まっ、個人差があると思うので、
参考程度で止めておいてくださいm(__)m
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
大変参考になりました。。

次回からはこの書き方でいきたいと思います。

お礼日時:2008/05/04 19:13

「"(ダブルコーテーション)」があって、


「'(シングルコーテーション)」があって、
「,(カンマ)」があって、
「変数」がここに入って。。。。
ってややこしくなってるだけだと思います。
まず、SQL文を整形しなおしてみるものいいかも知れません。
私も、よく躓きましたので。

VB開発者なので、私がVBでよく書く書き方ですが参考までに。
(私が見やすい状態なので、他の方みたら見にくいかもしれませんが...)

09行目は生年月日に値が入ってないと、「##」になってしまうのを回避するための分岐。
12行目の日付は他の方からのアドバイスを参考に、フォーマット変更が必要かも。
15行目のIDはデータベース上、ナンバー型なので、「'(シングルコーテーション)」は不要。
16行目はVBでは、イミディエイトウインドウにSQL文を出力(取得)し、
AccessのクエリやSQLPlus(Oracle)に貼り付けて、SQL文を確認しています。

01: Dim strSql As String
02: strSql = ""
03: strSql = strSql & "UPDATE kekkon "
04: strSql = strSql & "SET "
05: strSql = strSql & " [名前_姓] = '" & name_sei_kan3 & "' "
06: strSql = strSql & ",[名前_名] = '" & name_na_kan3 & "' "
07: strSql = strSql & ",[名前_姓_かな] = '" & name_sei_hira3 & "' "
08: strSql = strSql & ",[名前_名_かな] = '" & name_na_hira3 & "' "
09: If seinen3 = "" Then
10: strSql = strSql & ",[生年月日] = NULL "
11: Else
12: strSql = strSql & ",[生年月日] = #" & seinen3 & "# "
13: End If
14: strSql = strSql & ",[Email] = '" & email3 & "' "
15: strSql = strSql & "WHERE [ID] = " & IDID3 & " "
16: Debug.Print strSql
17: db.Execute strSql

こんな感じですが、エラー回避策の足がかりになりませんか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
非常に見やすいです。。。
このほうが絶対いいと思いました。
ありがとうございます!!

ちなみにもし差し支えなければ、15行目の最後の『& " "』は
どういう意味なのか教えて頂いてもよろしいでしょうか。
このような書き方をした場合は最後にスペースを入れる必要がある
のでしょうか?

お礼日時:2008/05/01 23:02

カラムを一つだけ更新するUPDATE文でまずやってみて、どこでエラーなのか切り分ける感じでやってみてはどうですか。

    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
最初の頃、ご指摘いただいているとおり、1個でもダメだったので質問させて頂きました。
結局、 WHEREの後の書き方がダメだったのと、値が空だったためダメだったようです。
なんとか解決できました。アドバイスありがとうございました。

お礼日時:2008/05/01 22:51

私はこう「WHERE [ID] = " &IDID3 "'"」書いていません。


「WHERE [ID] = " & IDID3」と書きました。
「WHERE [ID] = " &IDID3 "'"」はIDID3と"'"の間に結合子が無いので構文エラーです。
「WHERE [ID] = " &IDID3 '」アポストロフィ以降はコメント扱いなので、「WHERE [ID] = " &IDID3」と同じです。
結果的に私の書いたものと同等になったということです。
文字列だから"'"(アポストロフィ)で囲む、数値はそのまま(何も囲まない)という区別を理解しましょう。
次に"##"となったのは seinen3 の中身が空欄だったからではないですか?
もし、空欄だったり、日付として正しくない形式ならエラーになります。
それくらいはSQL実行前にチェックしてくださいね。
因みに、空欄を許可している場合にseinen3 の中身が空欄だったら、[生年月日] = Null となるようにしてください。
注:しつこいようだけど、[生年月日] = 'Null' じゃないからね。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
ご指摘頂いたとおり、seinen3の中身が空でした。
値をいれたらうまくいきました。
ありがとうございました。

お礼日時:2008/05/01 22:47

先ずIDは数値なので、WHERE句で ID='1' となる記述は誤りです。


正しくは ID=1 となるようにします。(下記参照)
"' WHERE [ID] = '" & IDID3 & "'" → "' WHERE [ID] = " & IDID3
次にAccessの日付型は'(アポストロフィ)ではなく、#(シャープ)で囲むのが正しい。
"',[生年月日] = '" & seinen3 & "',[Email]~ → "',[生年月日] = #" & seinen3 & "#,[Email]~
但し、日付はyy/mm/ddだと、場合によってmm/dd/yyに解釈される可能性があります。
例:08/04/07(2008年4月7日のつもりだが、2007/08/04となってしまうことがある)
もし、解釈が異なっていた場合は、また質問してください。

この回答への補足

ご回答ありがとうございます。
結果的にはダメでした><
試して見た結果を以下に列挙します。

(1)WHERE [ID] = " &IDID3& "'" → WHERE [ID] = " &IDID3 "'"

Microsoft VBScript コンパイル エラー (0x800A0401)
ステートメントの末尾が不正です。
/kekkon5/edit001.asp, line 24, column 242
db.Execute "UPDATE kekkon SET [名前_姓] = '" & name_sei_kan3 & "',[名前_名] = '" & name_na_kan3 & "',[名前_姓_かな] = '" & name_sei_hira3 & "',[名前_名_かな] = '" & name_na_hira3 & "',[生年月日] = " & seinen3 & ",[Email] = '" & email3 & "' WHERE [ID] = " &IDID3 "'"
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------^

(2)WHERE [ID] = " &IDID3& "'" → WHERE [ID] = " &IDID3
               → WHERE [ID] = " &IDID3'
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC Microsoft Access Driver] UPDATE ステートメントの構文エラーです。

またそれとは別に
"',[生年月日] = '" & seinen3 & "',[Email]~ → "',[生年月日] = #" & seinen3 & "#,[Email]
を実行したところ、下記エラーが発生してしまいました。
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC Microsoft Access Driver] クエリ式 '##' の 日付の構文エラーです。

ちなみに日付はyy/mm/ddです。

取り急ぎ、結果をご報告させて頂きます。

どこが悪いのかさっぱりです^^;・・・。

補足日時:2008/04/30 14:41
    • good
    • 0

こいつでしょう。



>"',[生年月日] = '" & seinen3 &

日付型の場合、#でくくらないと「日付シリアル」と認識しないかと。

この回答への補足

ご回答のほうありがとうございました。
ご教授頂いたところ試してみました。

,[生年月日] = '" & seinen3 & "'→,[生年月日] = #" & seinen3 & "#としてみましたが、

Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC Microsoft Access Driver] クエリ式 '##' の 日付の構文エラーです。

となってしまいました。。
取り急ぎご報告させて頂きます。

補足日時:2008/04/30 14:56
    • good
    • 0

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