• ベストアンサー

ACCESS2000のUPDATE

すみません、検索はしたのですが・・・ VB6.0でACCESS2000のデータをUPDATEしたいと思っています。 ですが ※P_CN_DATABASEは、ADODB.Connectionです。 ※VAL_1/VAL_2は変数です。 --------------------------------------------------------------------- P_CN_DATABASE.Execute "UPDATE SET TABLE1 COLUMN1 = '" & VAL_1 & "'" --------------------------------------------------------------------- とすると、全件のデータが更新されるのですが、 --------------------------------------------------------------------- P_CN_DATABASE.Execute "UPDATE SET TABLE1 COLUMN1 = '" & VAL_1 & "' WHERE COLUMN2 = '" & VAL_2 & "'" --------------------------------------------------------------------- このようにWhere句をつけるとエラーも発生せず、何も更新されません。 更新するデータとWhere句のデータの、それぞれのシングルクォーテーションが不要なのかな?と思い、はずして試しましたがダメでした。 何がいけないのでしょうか? よろしくお願いします!

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

  • ベストアンサー
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.2

こんにちは。maruru01です。 とりあえず、UPDATE構文が間違っている件は置いておくとします。 COLUMN2フィールドにはどんな値があって、変数VAL_2には実行時にどんな値が代入されているかを確認して下さい。 (Executeで実行する直前にMsgBoxを置くか、イミディエントウィンドウに出力しましょう。) データ型が違う場合は、エラーになるはずですが、一応それも確認して下さい。 また、データが文字列ということは、全角・半角やその他微妙に、実際のテーブルの内容と変数VAL_2の内容が違うかも知れないので確認して下さい。 なお、No.1の人のWHEREを「""」の外に出すという方法をしてもエラーになるだけで、指摘内容は間違っていると思います。 (そのそも、Executeメソッドでは表示だけ(つまりSELECTだけ)はもともと出来ないはずです。)

sky_blue
質問者

お礼

お返事ありがとうございます。 > とりあえず、UPDATE構文が間違っている件は置いておくとします。 すみません・・・間違えました(--; 実行時のSQL文はイミディエントウィンドウに出力していました。特に問題はなかったと思われたのですが・・・。 [VAL_2]には文字列としての数字がはいっています。 -------------------------------------- " WHERE COLUMN2 = '00001' " -------------------------------------- となります。 ACCESSにおけるカラムのデータ型はテキスト型です。 データベースにも存在しているデータです。 ※データ型が違っているエラーは通過してきましたので(--;)、大丈夫だと思っていますが・・・ #1の方の方法もまだ試していないのですが、WHERE句を外に出してもだめそうなのですね・・・ また宜しかったら、お話伺わせて下さい。 ありがとうございました。

sky_blue
質問者

補足

お返事ありがとうございました。 あれからも色々やってみたところ、 UPDATE文のテーブル名やカラム名も、全て変数にしたところ、Where句に一致するデータだけが更新されました。 理由は分かりませんが・・・ お二方からのお返事嬉しかったです、ありがとうございました。

その他の回答 (1)

回答No.1

こん**は。 「"」の位置をもう一度見てください。 P_CN_DATABASE.Execute "UPDATE SET TABLE1 COLUMN1 = '" & VAL_1 & "' WHERE COLUMN2 = '" & VAL_2 & "'" では、"UPDATE~COLUMN1 = '"と"'WHERE COLUMN2 = '"と"'"が、画面表示の対象になってしまっています。 つまり、WHERE句が命令じゃなく表示になっています。 だから、 P_CN_DATABASE.Execute "UPDATE SET TABLE1 COLUMN1 = '" & VAL_1 & "'" WHERE "COLUMN2 = '" & VAL_2 & "'" のように、WHEREが命令になるようにしてみてください。 参考になれば幸いです。

sky_blue
質問者

お礼

shiro-haseさん、お返事ありがとうございます。 今、自宅ではないため試せないのですが、 帰宅後、さっそく試してみます! ただ少し分からないのですが、Where句を指定しないUpdate文は、単なる文字列ですよね? ------------------------------------------------ "UPDATE SET TABLE1 COLUMN1 = '" & VAL_1 & "'" ------------------------------------------------ この部分だけだと画面表示の対象にはならずに命令として認識されるのでしょうか? (実際データが更新されているので認識されているのでしょうが・・・) なぜ「WHERE」だけが、文字列生成の「"」「"」からはずれるのか理解できなくて・・・。 もし宜しかったら、教えていただければと思います。 お返事ありがとうございました。 ※しかも質問に載せたUpdate文も間違っていますね・・・すみません!

関連するQ&A

  • SQLの同時実行

    SQL文について質問なんですが、下記のようなテーブルがあった場合に『2を3に、3を2にする』というクエリを作ってみましたが、どうもうまくいきません。 ┌─┬──┐ │No│項目│ ├-┼──┤ │1│ああ│ ├─┼──┤ │2│いい│ ├─┼──┤ │3│うう│ └─┴──┘ strSQL1=UPDATE テーブル名 SET No = '2' WHERE No = '3' strSQL2=UPDATE テーブル名 SET No = '3' WHERE No = '2' これをASPから実行する場合は cn.Execute(strSQL1) cn.Execute(strSQL2) とすると、先にstrSQL1が実行されテーブルが更新された後にstrSQL2が実行される ため、 ┌─┬──┐ │No│項目│ ├─┼──┤ │1│ああ│ ├─┼──┤ │3│いい│ ├─┼──┤ │3│うう│ └─┴──┘ となってしまいます。『2つの更新を同時に実行させる』もしくは『2つの更新クエリ1つにする』というようなことはできないものでしょうか?

  • 【ADO】「Execute」を使うときは「Update」は不要?

    Sub test() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Desktop\test1.mdb" Set rs = New ADODB.Recordset rs.Open "テーブル1", cn, adOpenStatic, adLockPessimistic cn.Execute "DELETE FROM テーブル1" rs.Update '保存 Set rs = Nothing Set cn = Nothing End Sub を実行したとき テーブル1にデータがあるときはエラーにはならないのですが 何もデータがないときは「rs.Update」でエラーになります。 なので「Update」は消して実行していますが 「Update」がなくても「Execute」を実行した後は自動的に保存されるのでしょうか? よろしくお願いします。

  • 1テーブル&複数レコードの更新に対して1度のupdate文での処理方法

    1テーブル&複数レコードの更新に対して1度のupdate文での処理方法 Delphi2010+SQL SERVER 2005で開発しています。 update文で、 現在下のようにwhileで複数レコードに対して、 1回、1回、sqlを発行して、更新しています。 これを、一度のSQLの発行で処理できないものでしょうか? 更新テーブルは1つで、更新する項目も同じです。 更新するデータと、where句の条件が異なります。 もし可能なようでしたら、どうかご教授お願いします。 update table set A=1,B=2 where id=1 update table set A=2,B=3 where id=5 update table set A=9,B=99 where id=7 update table set A=5,B=10 where id=15 update table set A=1,B=10 where id=75

  • UPDATE文の副問い合わせ

    こんばんわ。 今少し書き方がわからないSQL文があって困っています。 テーブルA(データが入ってるテーブル)に 新規でカラムを追加したので、 今UPDATE文を使いたいと思っています。 膨大なので、1つ1つする訳にはいかないので、 条件指定して、あるカラムにあるとある条件に合致するものは 新規カラムの値が4とか ある条件なら、新規カラムの値が6などと入れたい感じです。 自分なりに調べて UPDATE テーブル名 SET 新規カラム = 値 WHERE (SELECT * FROM 同じテーブル名 WHERE 条件) だと思って色々書いたり試行錯誤したのですが、 全然できませn。 どのように書けばよろしいのでしょうか? またUPDATEをかける際の条件指定に2つの違った 条件(同じカラムの違う条件、または別カラムの条件) を入れることは可能でしょうか? 回答いただけるとありがたいです。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • エクセルからアクセスの更新クエリをVBAで実行したい

    こんばんは。たびたび失礼します。 http://oshiete1.goo.ne.jp/qa4909202.html の続きです。 アクセスの「テーブル1」の「フィールド」(Yes/No型)がFalseなら Trueにする更新クエリをエクセルから実行したいのですがうまく行きません。 Sub test1() Dim cn As New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & "\\Users\ユーザーアカウント名です\Documents" & "\アクセス.mdb" cn.Execute "UPDATE テーブル1 SET フィールド = False WHERE フィールド='" & True & "'" Set cn = Nothing End Sub これを実行すると 実行時エラー2147217913 抽出条件でデータ型が一致しません。 となります。 どうすればいいでしょうか? ご教授よろしくお願いします。

  • プライマリーキーで同じ値をUPDATEするとまずいですか?

    update test_table set プライマリーキー=1,項目2="test" where プライマリーキー=1 のように面倒くさいので、プライマリーキーもset句に書くと、 パフォーマンスが遅くなったりするでしょうか? と言いますか、MySQLでWHERE句と同一値のプライマリーキーは 内部的に更新が行われるのでしょうか?

    • ベストアンサー
    • MySQL
  • Oracleのupdate文について

    OracleでテーブルB、Cを結合し取得できた項目で、テーブルAを更新したいのですがSQLがわかりません。結合結果とテーブルAは1:1にはなりません。 件数が結合結果>テーブルAの時もあれば、その逆の場合もあります。また、複数項目を更新したいです。実行して考えてみたいのですが、明朝客先ですぐに実行しなければならず(テスト環境はあるので明日そこで一旦確認後、すぐに本番環境で実行)、現在移動中→ホテル泊のため余裕がありません。 ネットで下記を見つけたのですが、更新する項目に更新日時を追加したいのと、テーブルAとの紐付けやEXISTSのWHEREはテーブルBとC両方の項目に紐づけたいです。 また、テーブルAの更新条件に、テーブルB、Cにはないcolumn③に対する条件も追加したいです。 UPDATE [TABLE①] A SET (COLUMN①, COLUMN②) = ( SELECT B.COLUMN, C.COLUMN FROM [TABLE②] B, [TABLE③] C WHERE B.COLUMN = C.COLUMN AND B.COLUMN = A.COLUMN ) WHERE EXISTS ( SELECT 1 FROM [TABLE②] B2 WHERE B2.COLUMN = A.COLUMN) もろもろとわかりづらい説明&他力本願で心苦しいのですが、どなたか教えていただけないでしょうか?

  • access adoのトランザクション

    access2003でSQLServer2008へのリンクテーブルを作成し、 vbaでadoを使ってデータ更新処理をしようとしています。 以下のように記述していますが、 実行後、BやCのテーブルが開かなくなります。 (正確にはインサートしたデータが表示されるであろうページがロックされているような動きです。) また、その状態からAccessを一旦終了し、再度起動すると、データがインサートされていない状態です。 コミットが効いてないように感じます。 こちら原因としてどんなことが考えられるでしょうか? ちなみにDAOで動かしても同様でした。 宜しくお願い致します。 以下 コード============================ Set cn = CurrentProject.Connection Set rst = New ADODB.Recordset cn.BeginTrans rst.Open "select key from A", cn, adOpenForwardOnly, adLockReadOnly Do Until rst.EOF cne.Execute "insert into B ( aa, bb) select aa, bb from A where key = " & rst!key & " " cne.Execute "insert into C ( aa, bb) select aa, bb from A where key = " & rst!key & " " rst.MoveNext Loop rst.Close cn.CommitTrans cn.Close set rst = Nothing set cn = Nothing

  • 複数テーブルからデータを取り、updateする

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=1211685 にも同じような質問があったのですが、同様の処理でうまくupdateされません。分かる方がいらっしゃいましたら教えてください。 今、テーブルが2つ(table1、table2)があり、それぞれ2つのカラム(column1、column2)を持っています。ここで、それぞれのカラム2が等しく、カラム1が指定した値のレコードのみ値をupdateしたいです。 update table1 set column1 = 'AAA' from table1,table2 where table1.column2 = table2.column2 and table1.column1 = 'BBB' and table2.column1 = 'CCC' としたところ、「from table1,table2 where 」の辺りに間違いがあると表示されます。 上の例とどう違うのか分かりません。 よろしくお願いします。m(__)m

  • AccessのUpdateについて

    質問をさせていただきたいのですが、 Accessで別のテーブルに有るカラムを合計した金額をもとに、 テーブルを更新するにはなにかよい案などございませんでしょうか。 具体的にもうしますと、 AテーブルとBテーブルがありまして、AテーブルのA1というカラムの値をsumし た値を BテーブルのB1というカラムに入れるアップデート文を作成したいのです。 AテーブルのA2とBテーブルB2というカラムは同じ値が一意で入っています。 インターネットで検索した、今回行おうとしている事に近い方法を 試しても上手くいきませんでした。 大変申し訳ございませんが、お知恵をお貸しいただけませんでしょうか。 以上です。 よろしくお願いいたします。

専門家に質問してみよう