• 締切済み

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

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

  • kumar
  • お礼率21% (19/87)

みんなの回答

noname#60992
noname#60992
回答No.1

どのようなコードを書かれているかによりますが、 レコードを開いている時間を最低限にすること。 optimistic を使うのは、更新時のみにすること。 レコードを読む際には readonly にすること。 などによって解決できる場合もあります。 同時に更新を行う場合は、エラートラップをして、 更新できなかった場合は、時間を置いてリトライする などの配慮が必要です。

参考URL:
http://www.microsoft.com/japan/technet/scriptcenter/resources/officetips/nov05/tips1103.mspx

関連するQ&A

  • LOCK TABLE

    登録処理、更新処理、削除処理を行う際に 他ユーザからのアクセスを制限するために 登録、更新、削除処理を行う前にロック処理を行おうと思っています。 その際にテーブルのロックがすでにしている場合や テーブルのロックに成功した、テーブルのロックに失敗 した場合に戻り値を返すのでしょうか? お分かりになる方よろしくお願い致します。 一応イメージとして LOCK TABLE テーブル名称 IN SHARE ROW EXCLUSIVEの処理の後 UPDATE文や、INSERT、削除などを行おうと思っています。 よろしくお願い致します。

  • ワークテーブル(ローカル)からDBサーバーへの更新について

    Access2003+PostgreSQLにて販売管理システムを構築しています。 レコードを見る・更新する時はサーバーのレコードを ワークテーブル(ローカルのmdbファイル内のテーブル)にコピーし 値を変更後、ローカルからサーバーにデータを戻す、といった処理をしたいと考えています。 サーバーからレコードをコピーする際は、ODBC接続&ADOにて サーバーのレコードを一旦レコードセットに格納し 「CurrentProject.Connection.Execute SQL文」で ワークテーブルにINSERTしています。 ここで質問なのが、ワークテーブルからサーバーにレコードを戻す際は ワークテーブル・サーバーへはそれぞれどの方法で接続すればいいでしょうか。 例えばサーバーへODBC&ADOで接続した場合、ワークテーブルの取扱方法(接続方法)が分かりません。 サーバー:ADO、ワーク:DAO、みたいな事するのでしょうか。 スマートな方法がお分かりの方は教えて下さい。 宜しくお願い申し上げます。

  • accessのロック

    以前も質問したことがあるのですが、再度質問させていただきます。 Accessのロックについてです。 Windows2003Sever + Microsoft SQL ServerのマシンにあるMDBファイルを置いてあります。 これに社内LANでつながっているwindowsXP+access2000マシン10数台が それぞれWindows2003サーバマシンのmdbファイルのテーブルにリンクしているmdbファイル持っていて日々データの閲覧と更新をしています。 その際時々Access2000が以下のような以下のようなWindowメッセージを出します。 「現在ロックされているので、更新できませんでした。」 この件で困っております。 いくつか、わかっていることがあります。 ◎Windows2003Serverのこのmdbにアクセスしている人が多い時にこのメッセージが出るわけではない。使用者が2人でも出るときがある。 ◎同じフィールドへの同時書き込みの場合は他のユーザによって変更されています。。。のようなメッセージが出るので同時書き込みの問題ではなさそうだ。 ◎ロックがかかった場合、接続ユーザーみんなが開いているmdbを閉じて再度開くとロックは解除されている。 ここで質問なのですが、 ・ロックはなぜかかるのでしょうか? ・ロックの回避方法はありますか? 以上、どうかよろしくお願いいたします。

  • Accessにてリンクテーブルの削除、最適化、リンクの張り直しを行いたいのです。

    こんにちは。 Access2000でプログラムを作成しています。その際、データ(テーブル)の入っているmdb(DT.mdbとします)と、テーブル以外のプログラムが入っているmdb(PG.mdbとします)に分けて、PG.mdbにテーブルをリンクしています。 データがどんどん大きくなるので、最適化をしようと思うのですが、プログラムのほうは、ツールのオプションで、「閉じるときに最適化を行う」にチェックを入れたので解決です。 DT.mdbの方はリンクしているため、プログラムのメニュー上にある「最適化」のボタンを押したら、いったんリンクを解除して、最適化を行い、もう一度リンクを張りなおす、という処理を行いたいのですが、書き方がわかりません。 今まではDAOを使用していて、DAOでの書き方はわかるのですが、このプログラムはADOで書かれており、しかもほかの人が作ったものなので解読に時間がかかってしまいます。一応、DT.mdbへの接続などはできているようです。 あと、PG.mdbの方では、ワークテーブル(データではない、一時的に利用したい)的なものは、使用できないのでしょうか?レコードセットをオープンしようとしたらエラーになってしまいましたので。 どなたかよい方法をご存知の方、回答よろしくお願いします。

  • ACCESS ADOでupdateが効かない

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

  • Access特定のテーブルを編集不可にしたい。

    Access2000で作ったMDBがあります。 特定のテーブル(レコード件数は1件)のデータを編集不可にしたいのですが、 可能でしょうか・・?  ・該当テーブルのみパスワードをかける。  ・該当テーブルにロックをかけ、編集不可にする。 など、何か方法はないでしょうか・・・? (隠しオブジェクトは試してみました) よろしくお願いします。

  • mdbのテーブルを別のmdbのテーブルに追加

    2種類のMDBがあり 一つは 毎日の入力にて使用、もう一つは 累積として使用している。 それぞれに 同一デザインのテーブルがあります。 毎日の入力用のMDB内ののテーブルのデータをすべて 二つ目のMDBのテーブルに 追加したいのですが 一件読み込んで 一件書き込むなどと プログラムしていましたが 毎日の入力用のMDBが たくさんになったため 処理が遅くてたいへんです。 なにか 簡単に かつ 高速にすることは可能でしょうか? 開発環境は VB6 SP6 WindowsXP ADOを使用しています。 よろしくお願いします。

  • 他ファイルのテーブルの情報を取得したい

    アクセス DCount関数で他のファイルのテーブルの件数を取得することは不可能でしょうか? ファイル1.mdbとファイル2mdbがあり、 ファイル2mdbには、 テーブル名 フィールド:a と言うデータがあります。 ファイル1.mdbにはテーブルはありません。 ファイル1.mdbのVBAで ファイル2.mdbのテーブル名のレコード件数を取りたいのですが 不可能でしょうか? ファイル1.mdbのVBEで Sub 関数で件数を取得() MsgBox DCount("[テーブル名]", "a") End Sub とやってもエラーになります。この関数にファイルを指定する部分もありません。 エラー内容は --------------------------------------------------------- 実行時エラー3078 入力テーブルまたはクエリーが見つかりませんでした。        そのテーブル・クエリーが存在するか確認して下さい。 --------------------------------------------------------- です。 ADOを使うしかないのでしょうか?できればADOは使いたくありません。 アドバイスよろしくお願いします。

  • CSVファイルをアクセスのテーブルに出力する

    こんにちは Access VBA初心者です。 やりたい処理なのですが CSVファイルをmdb内であらかじめ作成されているテーブルに出力したいのですが、 最初にTransferTextwでワークのテーブルにインポートして そのワークテーブルを1レコードずつ読み込みmdbのあらかじめ作成されているテーブルにINSERTしていくという方法しか今思いつきません。 インポートするとワークテーブルはすべてテキスト型になっていますが、 それを違う型の項目にINSERTするということなど可能なのでしょうか? それとももっとスマートな方法があるのでしょうか? ざっくりと書いてしまいましたが、よろしくお願いいたします。

  • Accessでリンクテーブルのパス変更

    Accessで処理mdbとデータmdbに分けて、データmdbをリンクテーブルとして読み込んでいるのですが、データmdbのパスが変わったとき、処理mdbでデータmdbのパスを変更しなければなりません。 それが、面倒なので、手軽に変更できるように作っているのですが、「MSysObjects」の「Database」を書き換えるようと、VBAでADODB処理をしているのですが、アップデートすると「更新可能なクエリであることが必要です。」となり、書き換えることが出来ません。 strSQL = "SELECT * FROM MSysObjects;" ~ data.open strSQL ~ data("Database") = NewDatabase data.Update といった感じの処理です。因みに環境はAccess2000です。 何か、リンクテーブルを自動で書き換える簡単な方法は無いものでしょうか。