• ベストアンサー

ACCESS ADOでupdateが効かない

いつもありがとうございます。 現在、ADOを使ってカレントプロジェクト以外のMDBファイルのテーブルにレコードを追加する処理を行っているのですが、何のエラーメッセージも出ないままレコードが追加されません。 この場合、updateコマンドが実行された後の状態(リターンコード)を調べる事はできないでしょうか?

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

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

前回の回答を訂正します。 <ある環境下ではエラーが起きないこともあります!> さて、本日、Execute での UPDATE 文が実行されないという不具合に遭遇しました。 エラーもなく表面上は「実行しました!」とのメッセージ。 「ウーン!」と考えて、UPDATE 文の発行による更新を断念。 SELECT文で読み込み1レコードづつ更新するようにコードを訂正しました。 結果、この不具合は解消されました。 多分、実行したPCが某社のCAD。 「Windows、Office の更新は誤動作の原因となるのでしていない」とのこと。 こういう場合、非手続き的なコードよりも手続き的なコードの方が信頼が高いと感じました。 質問者も、シコシコと更新手続きを書いてみると解決するかもしれません。 「エラーが出ると思う!」との下りは、このような事情で撤回します。

その他の回答 (3)

  • venzou
  • ベストアンサー率71% (311/435)
回答No.4

>レコードを追加する処理を行っている >この場合、updateコマンドが実行された後 質問の内容より、Recordset オブジェクトのaddnew & updateで手続き的なコードを書かれていると思いますが(^^;>#3さん Execute メソッドの場合は、第2引数に影響の有ったレコード数が返ってきますので、これをチェックすれば正常に追加されたか判断出来るかも。 Dim RecordsAffected As Long Connection.Execute SQL, RecordsAffected Debug.Print RecordsAffected

kunisada
質問者

お礼

お答え下さった皆さん、回答ありがとうございます。 他の方へもここでまとめてお礼します。 まだ解決していませんが、皆さんの意見を参考にやってみます。 SQL文に書き直す というのが正解かもしれません。

noname#140971
noname#140971
回答No.2

私も、No1 さんの回答通りにエラーが発生すると思います。 ただ、その場合、Access のエラーが発生するだけかもしれません。 いわゆる ADO エラー情報を取得するには仕掛けが必要です。 質問は、この後段の手法に関してでしょうか? であれば、次の関数を参考にされて下さい。 カレントプロジェクトであろうが外部アクセスであろうが同じことかと思います。 Public Sub ErrMessage(ByVal CnnErrors As ADODB.Error, ByVal strSQL As String)    MsgBox "ADOエラーが発生しましたので処理をキャンセルします。" & Chr$(13) & Chr$(13) & _       "・Err.Description=" & CnnErrors.Description & Chr$(13) & _       "・Err.Number=" & CnnErrors.Number & Chr$(13) & _       "・SQL State=" & CnnErrors.SQLState & Chr$(13) & _       "・SQL Text=" & strSQL, _       vbExclamation, " ADO関数エラーメッセージ" End Sub Public Function CnnExecute(ByVal strSQL As String) As Boolean On Error GoTo Err_CnnExecute    Dim isOK As Boolean    Dim cnn As ADODB.Connection       isOK = True    Set cnn = CurrentProject.Connection    With cnn      .Errors.Clear      .BeginTrans      .Execute strSQL      .CommitTrans    End With Exit_CnnExecute: On Error Resume Next    cnn.Close    Set cnn = Nothing    CnnExecute = isOK    Exit Function Err_CnnExecute:    isOK = False    If cnn.Errors.Count > 0 Then      ErrMessage cnn.Errors(0), strSQL      cnn.RollbackTrans    Else      MsgBox "プログラムエラーが発生しました。システム管理者に報告して下さい。(CnnExecute)", _         vbExclamation, " 関数エラーメッセージ"    End If    Resume Exit_CnnExecute End Function

  • venzou
  • ベストアンサー率71% (311/435)
回答No.1

具体的なソースがないと何とも言えませんが・・・ updateメソッドに戻り値はないと思います。 通常は失敗すればエラーになると思います。 ・ On Error Resume Next としてませんか? ・ addnew を忘れてませんか?

関連するQ&A

  • Access起動中にエクセルからADOでデータの更新ができない

    こんばんは。原因がわからないので質問させてください。 SQLサーバーのデータをAccessのmdbへリンクテーブルしています。 (SQLサーバー → Access) 全て一つのパソコンで行なっています。(LANには接続していません) Accessのmdbファイルを起動している時に ExcelからSQLサーバーのAccessにリンクしている上記のテーブルへ ADOを使ってデータを追加しています。 (Excel → Access)  しかし、「rs.Update」の部分で  「ODBC--リンク テーブル'テーブル1'での更新に失敗しました。」 となってしまいます。 なので、一度mdbファイルを落として、コードを再開すると通るので ADOでExcel → Accessにデータを追加し終わってから再度mdbファイルを立ち上げています。 また同じ状態(mdbファイルを起動)で Excel → SQLサーバー へ更新クエリをしようとすると「時間切れになりました」となります。 (こちらもmdbファイルを落とすと再開できます。) いちいちmdbファイルを落とすのめんどうなのですが 回避する方法はありますか? cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & "C:\Users\Documents.test.mdb" rs.Open "テーブル", cn, adOpenStatic, adLockPessimistic rs("フィールド") = True rs.Update '保存 rs.Close: Set rs = Nothing というコードを書いています。 Accessを落とせば正常に動きます。 ご教授よろしくお願い致します。

  • エクセルからアクセスへADO 「_be.mdb」に追加するべき?

    リンクテーブルでtest.mdbとtest_be.mdbに分割した場合 エクセルからアクセスへADOでテ゛ータを追加する場合、 「test.mdb」と「test_be.mdb」のどちらに追加すればいいのでしょうか? 「test_be.mdb」はリンクテーブルとして「test.mdb」のテーブルのみ保存されています。

  • ADOを覚えれば可能?

    accessで複数のパソコンから同時にMDBファイルを開いて テーブルの追加・更新などを行いたい場合は、ADOの知識があれば可能ですか? 複数のPCで一つのファイルを開いた場合、 読み取り専用になってしまいテーブルの更新ができません。 VBAのADOを覚えれば回避できるのでしょうか?

  • Accessにテーブルロックがかかっている?

    wshからADOを経由してmdbファイルへの読み書きをする処理をしています。このタスクをシングルで動かしている間は問題ありませんでしたが、並列で動かしているときに次のエラーが出てくるようになりました。 「ロックがかかっているので、更新できません」 処理内容としては、並列で動かしても同じレコードを同時に更新するような処理はないです。しかしこのメッセージが出てしまいます。 もしかしてテーブルロックがかかっているということでしょうか? もしそうだとすると、明示的にテーブルロックを外す(あるいはロックそのものを外す)コントロールの方法はあるのでしょうか?

  • 【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」を実行した後は自動的に保存されるのでしょうか? よろしくお願いします。

  • ACCESS VBAのDSUMを使ってUPDATE

    よろしくお願いします。 通貨型のACCESSデータベースのレコードにDSUMを使ったUPDATE文で更新をしたいのですが、 うまくいきません。 イミディエイトウィンドウで出力したSQLをACCESSのクエリーで実行したところ、 "1個のフィールドで型変換エラー"となります。 実行したSQLは下記のようなものです。 UPDATE テーブル名 SET フィールド名 = DSUM(フィールド名,"テーブル名",コードI = '0000' AND コードII BETWEEN '5110' AND '5410') WHERE コードI = '0000' AND コードII = '5980'; 因みに、更新元テーブルと更新先テーブルは同じテーブルです。 行いたいのは、コードII列の「5110」~「5410」の合計値を、「5980」の場所にUPDATEを させようとしてます。 よろしくお願いします。

  • 引数が無効です アクセス ADO AddNew

    アクセスのテーブルにアクセスVBAで値を追加しようとしてるのですが Set cn = CurrentProject.Connection rs.Open "SELECT * FROM TAccess", cn, adOpenStatic, adLockPessimistic rs.AddNew rs("主キー") = Me.txt_主キー.Value rs.Update を実行しようとすると、 rs.AddNewの部分で、「引数が無効です」と言うエラーが発生し、 一時的にVBAコードが止まります。 しかしそのままF5で処理を実行すると、問題なくコードが動き、データが追加されます。 でもかならずrs.AddNewでエラーが発生します。 エラーが発生するのにそのまま実行すると問題ないのはなぜでしょうか? 「引数が無効です」は、どういう意味のエラーなのでしょうか?

  • VB6からADOを介してACSESS2000MDBへのアクセスエラー

    VB6からADOを使用しACSESS2000MDBにデータを登録すると INSERT 文でエラーになってしまいます。 エラーコード:-2147217833です。 何が原因か分かる方教えて下さい。

  • VBSでADOを使ってaccessのテーブルに接続

    VBSでADOを使ってaccessのテーブルに接続する方法は? Sub ADO_test() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & "D:\【Access】サンプル.mdb" rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic MsgBox "test成功です" rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub をACCESSVBAで実行すると成功しますが 全く同じコードをメモ帳に貼り付けてtest.vbsで保存し、ダブルクリックすると、 行:3 文字:11 エラー:ステートメントの末尾が不正です。 コード:800A0401 のエラーになります。 VBAは少しわかるのですが、VBSに関しては初心者です。 どこを修正すればコードが通るのか教えてください。

  • アクセスADOで更新クエリがエラーになる

    アクセスからYES/NO型をを含むテーブルをSQLサーバーへ移行したのですが アクセスから更新クエリを使ってYES/NO型のフィールドを全てFalseにしたいのですがエラーになってしまいます。 cn.Execute "UPDATE テーブル SET 返事 = False" このコードを アクセスからADOを使ってアクセスのテーブルに対して行えば問題なくできるのですが そのままSQLサーバーのテーブルに対して実行すると 「列名'False'が無効です」 となります。 そもそも列名は「False」ではなく「返事」です。 SQLサーバーでのデータ型は「bit」になっています。 何かわかる方御回答よろしくお願いします。