- ベストアンサー
ASPからのデータベース更新
こんにちは。 現在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日間調べましたが、ダメでした。。 素人質問で申し訳ないですが、ヒントを頂ければと思いますので 宜しくお願い致します。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
先ず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となってしまうことがある) もし、解釈が異なっていた場合は、また質問してください。
その他の回答 (5)
No5 を書いた者です。 >ちなみにもし差し支えなければ、15行目の最後の『& " "』は >どういう意味なのか教えて頂いてもよろしいでしょうか。 もちろん無くても大丈夫です。 私がつける理由として2つ。 1つ目 「'(シングルコーテーション)」も何もついてないよね?の確認を明確にしている。 2つ目 条件追加のとき既存ソースを触らなくて済む。 たとえば、『[名前_名_かな] like 'タロウ*' 』を追加したい場合。 strSql = strSql & "AND [名前_名_かな] like 'タロウ*' " の1行追加するだけ。 もちろん、 strSql = strSql & " AND [名前_名_かな] like 'タロウ*' " AND の前にスペース にすればいいのですが、 これだと、後で見たときに、WHERE と AND の先頭が揃わないので、 ちょっと嫌かなぁ~と思ってるだけです。 まっ、個人差があると思うので、 参考程度で止めておいてくださいm(__)m
お礼
ご回答ありがとうございます。 大変参考になりました。。 次回からはこの書き方でいきたいと思います。
「"(ダブルコーテーション)」があって、 「'(シングルコーテーション)」があって、 「,(カンマ)」があって、 「変数」がここに入って。。。。 ってややこしくなってるだけだと思います。 まず、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 こんな感じですが、エラー回避策の足がかりになりませんか?
お礼
ご回答ありがとうございます。 非常に見やすいです。。。 このほうが絶対いいと思いました。 ありがとうございます!! ちなみにもし差し支えなければ、15行目の最後の『& " "』は どういう意味なのか教えて頂いてもよろしいでしょうか。 このような書き方をした場合は最後にスペースを入れる必要がある のでしょうか?
- ape5
- ベストアンサー率57% (85/148)
カラムを一つだけ更新するUPDATE文でまずやってみて、どこでエラーなのか切り分ける感じでやってみてはどうですか。
お礼
ご回答ありがとうございました。 最初の頃、ご指摘いただいているとおり、1個でもダメだったので質問させて頂きました。 結局、 WHEREの後の書き方がダメだったのと、値が空だったためダメだったようです。 なんとか解決できました。アドバイスありがとうございました。
- nda23
- ベストアンサー率54% (777/1415)
私はこう「WHERE [ID] = " &IDID3 "'"」書いていません。 「WHERE [ID] = " & IDID3」と書きました。 「WHERE [ID] = " &IDID3 "'"」はIDID3と"'"の間に結合子が無いので構文エラーです。 「WHERE [ID] = " &IDID3 '」アポストロフィ以降はコメント扱いなので、「WHERE [ID] = " &IDID3」と同じです。 結果的に私の書いたものと同等になったということです。 文字列だから"'"(アポストロフィ)で囲む、数値はそのまま(何も囲まない)という区別を理解しましょう。 次に"##"となったのは seinen3 の中身が空欄だったからではないですか? もし、空欄だったり、日付として正しくない形式ならエラーになります。 それくらいはSQL実行前にチェックしてくださいね。 因みに、空欄を許可している場合にseinen3 の中身が空欄だったら、[生年月日] = Null となるようにしてください。 注:しつこいようだけど、[生年月日] = 'Null' じゃないからね。
お礼
ご回答ありがとうございました。 ご指摘頂いたとおり、seinen3の中身が空でした。 値をいれたらうまくいきました。 ありがとうございました。
- FEX2053
- ベストアンサー率37% (7991/21371)
こいつでしょう。 >"',[生年月日] = '" & seinen3 & 日付型の場合、#でくくらないと「日付シリアル」と認識しないかと。
補足
ご回答のほうありがとうございました。 ご教授頂いたところ試してみました。 ,[生年月日] = '" & seinen3 & "'→,[生年月日] = #" & seinen3 & "#としてみましたが、 Microsoft OLE DB Provider for ODBC Drivers (0x80040E14) [Microsoft][ODBC Microsoft Access Driver] クエリ式 '##' の 日付の構文エラーです。 となってしまいました。。 取り急ぎご報告させて頂きます。
補足
ご回答ありがとうございます。 結果的にはダメでした>< 試して見た結果を以下に列挙します。 (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です。 取り急ぎ、結果をご報告させて頂きます。 どこが悪いのかさっぱりです^^;・・・。