C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: MDBファイルがロックされているっぽい


(過去ログ 92 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■54450 / inTopicNo.1)  MDBファイルがロックされているっぽい
  
□投稿者/ クロ (6回)-(2010/10/21(Thu) 10:44:21)

分類:[.NET 全般] 

お世話になっております。
C#でVS2008を使って、開発をしていますが行き詰ってしまったので
お知恵をお借りしたいと思い、質問しました。

現在、ある登録システムを旧システムから新システムの開発・移行をするために
テストをしていて、
テスト用サーバー(以後サーバー)が1台と開発用クライアント(以後、新システム)、
旧システムが入っているテスト用クライアント(以後、旧システム)があります。

開発中の新システムが旧システムとリンクしているか確認するために
新システムで登録して、旧システムでおかしな点がないかチェックしようとした
所、新システムでDispose()をしてないかったせいか
ロックをしてしまったようで旧システムでデータの追加・更新で
エラーになっているようです。新システムでは問題なく動いています。


string path = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source="Z:〜.mdb; Jet OLEDB:Engine Type=5";
// DBコネクション作成
OleDbConnection dbc = new OleDbConnection(path);
// DBコネクションを開く
dbc.Open();

string sql = "INSERT INTO 〜";

OleDbCommand dc = new OleDbCommand(sql, _dbc);
ddr = dc.ExecuteReader();

dbc.Close();
 dbc.Dispose();// ←最初はしていませんでした。

どうすれば解除できるか試していたら、何もしてないのに
エラーが解決(エラー発生から24時間後ぐらい?)して
なんともなかったのですがまた再発してしまいました。
dbc.Dispose()は2回目のエラーになってから追加しました。
今回も24時間ぐらいで解決するかもと思っていましたが
30時間以上経ってもダメでした。

ldbファイルも念のため、全PCで検索したのですが見つかりませんでした。
旧システムのソースはないので憶測でしか出来ませんが
Selectは出来てもINSERT・UPDATEが出来ないようなのでロックを予想をしています。
新システムで正常処理を行って、旧システムで動かしてもエラーになりました。
また、全PCを再起動をしてもダメでした。

要点をまとめると
○エラーが突然解消され、時間が関係していると思ったが本当に時間か関係しているのかは不明
○PCは全部でサーバーと旧システムと新システムの3台
○新システムは問題なく動く
○旧システムではSELECTは出来るがINSERT・UPDATEが出来ない
○ldbファイルは残ってない。
○新システムで正常処理をしても旧システムでは動かない
○再起動してもエラーになる。

ここが原因ではないのか。こうしたらこのエラーは解決するのではないか等の
アドバイスがありましたらお教え下さい。
引用返信 編集キー/
■54452 / inTopicNo.2)  Re[1]: MDBファイルがロックされているっぽい
□投稿者/ おのでら (18回)-(2010/10/21(Thu) 12:20:48)
おのでら さんの Web サイト
クロさんこんにちは、おのでらです。

OleDbCommand は Dispose 対象、
また、
OleDbCommand.ExecuteReader で取得した OleDbDataReader は Close 対象ですが、こちらを実行した場合はどうでしょうか。
引用返信 編集キー/
■54478 / inTopicNo.3)  Re[1]: MDBファイルがロックされているっぽい
□投稿者/ 魔界の仮面弁士 (1885回)-(2010/10/22(Fri) 00:02:56)
No54450 (クロ さん) に返信
> エラーになっているようです。
具体的には、何というエラーが発生しているのでしょうか?

処理手順では無く、データ内容に依存したエラーという可能性はありませんか?

新システムと旧システムで、実行アカウントが異なっていて、
フォルダ/mdb/ldb のアクセス権に差が生じていたりはしませんか?

> ○ldbファイルは残ってない。
mdb を開いた時点で、ldb が生成されると思いますが、それすら無いのでしょうか?


> Selectは出来てもINSERT・UPDATEが出来ないようなのでロックを予想をしています。
そのような気もしますが、仮にページロックでないとすれば、
 ・NTFS の権限不足で、mdb/ldb を編集できない状態になっていないか。
 ・ReadOnly モードで mdb を開いていないか。
 ・編集不可能なテーブルやクエリーに対して編集操作を行っていないか。
なども考えられます。

> ここが原因ではないのか。こうしたらこのエラーは解決するのではないか等の
> アドバイスがありましたらお教え下さい。
BeginTransaction/Commit/Rollbackの処理が抜けているのが気になります。

Jet の場合、暗黙のトランザクションではキャッシュの遅延が問題となりえますので、
特に複数同時接続がありえる場合、問題が起きる可能性があります。
今回の件と関係するかどうかは別として。
http://goo.gl/DRLc

あとは、System.mdw が破損していないか、とか、該当テーブルに
別の手法(DAO、ADODB 等)で開いた場合も、INSERT / DELETE が失敗するのか、とか。
----

# 掲示板投稿時に、「(某NGワード)は利用できません」エラーで弾かれたので、
# http://www.canalian.com/work何某/access/JetCache.html の部分を
# URL 短縮サービスで変換して再投稿。
引用返信 編集キー/
■54501 / inTopicNo.4)  Re[2]: MDBファイルがロックされているっぽい
□投稿者/ クロ (7回)-(2010/10/22(Fri) 12:49:33)
お二方とも回答ありがとうございます。

>新システムと旧システムで、実行アカウントが異なっていて、
>フォルダ/mdb/ldb のアクセス権に差が生じていたりはしませんか?

mdbファイルのセキュリティが一般ユーザーは、いつの間にか
書込不可になっており、新システムが管理者・旧システムが一般ユーザーのため、
まさにアクセス権の差が原因でした。
もちろん、セキュリティの設定を変更していませんが念のために
新システムでも一般ユーザーの権限でアクセスしたいのですがどうしいたらいいでしょうか?

最初は、アカウントに依存していると思い、一般ユーザーの書込不可の宣言をかけた状態で
一般ユーザーでログオンして書込をしたら、エラーにならずに書き込んでしまいました。

string path = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source="Z:〜.mdb;
User Id=admin; Jet OLEDB:Engine Type=5";

上記部分のId=adminを書き換えればいいと思い、
一般ユーザーに全権限を与えた状態で
Environment.UserDomainNameでコンピュータ名を取得したり
Environment.UserNameでユーザー名を取得して、設定したりしてみましたが
エラーになってしまいました。

追加の質問で申し訳ないのですが
一般ユーザーとしてアクセスするにはどうしたらいいのか
わかりましたらお願いいたします。

引用返信 編集キー/
■54512 / inTopicNo.5)  Re[3]: MDBファイルがロックされているっぽい
□投稿者/ ミラ (11回)-(2010/10/22(Fri) 18:09:35)
> 追加の質問で申し訳ないのですが
> 一般ユーザーとしてアクセスするにはどうしたらいいのか
> わかりましたらお願いいたします。

私だったら偽装しますね
コードの中に管理者のユーザー名とパスワード埋めることになりますが・・・

http://support.microsoft.com/kb/306158/ja
ASP.NetのサンプルですがWindowsアプリでも動作すると思います
引用返信 編集キー/
■54756 / inTopicNo.6)  Re[4]: MDBファイルがロックされているっぽい
□投稿者/ クロ (8回)-(2010/11/01(Mon) 14:41:29)
遅くなってしまってすいません。

ミラさん、回答ありがとうございます。

この件は、解決はしてないのですが
保留の形で余裕が出来た時に解決方法を探してみます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -