- - PR -
MDBファイルはADO.NETでのアクセスでも壊れやすい?
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-10-13 10:24
さかもとさん、R・田中一郎さん、こんにちは。
Accessの解説本でも、MSDEに触れているのは結構あるんですよね。 もちろん「壊れるから」ではなくて「データ量が増えてきたら」や「将来SQL Serverに移行するなら」といった趣旨なのかも知れませんが。 SQL Server 2005 Express Editionもファイルのコピペでイケるので楽ですね。
オートナンバー型で値が重複するんですか!? かなりの不運が重なって…とかなら解らないでもないですけど、にわかには信じがたいですね プロの方々ならではの「事実」なのかもしれませんね。 [ メッセージ編集済み 編集者: LoveDevice1973 編集日時 2006-10-13 11:01 ] | ||||||||
|
投稿日時: 2006-10-13 12:48
JET エンジンの対抗馬としては、MSDE や SQL Server 2005 Express Edition よりも SQL Server Everywhere Edition が有力かもしれません。
従来の SQL Server がインストールをおこなってサービスとして稼動させなければいけなかったのに対して、Everywhere Edition では、エンジンが単なる DLL に収まっているということらしいです。SQL Server が JET(MDB) や SQLite のように使えるというのはうれしいですね。 | ||||||||
|
投稿日時: 2006-10-13 12:59
ちょっと誤解を招く表現だったかもしれません。 実際には、1234 まで振ったものに追加する際に 1235 とならずに、この前の数値を振ろうとしてキーの重複エラーになると言う現象ですね。 | ||||||||
|
投稿日時: 2006-10-13 17:31
MDB ファイルの共有も Oracle も SQL Server も、例えばサーバ(1)に対してクライアント(N)が接続するような構成を考えた場合、クライアントが 要求を投げて、サーバ上のデータに対して抽出したり並べ替えたり書き込んだりするという構造自体には、変りは無いように見えます。
しかし、SQL を受け取って実際にデータをあれこれするプログラムがどこにあるのかを考えてみると、違いがハッキリするんじゃないでしょうか。 Oracle などの場合、SQL を受け取って処理するプログラム(いわゆる DBMS)はサーバ上で動いていますので、例えば 10 万件のレコードから 1 件だけを抽出するような問い合わせの場合、クライアントに対しては 1 件分のデータだけを返してあげれば良いので効率が良いですよね。また、複数のクライアントからの要求についても、DBMS が整合性を考えながらよろしく取り計らってくれます。競合する要求については、待たせておいたり拒否したりする事もありますが、それによってデータがおかしくなる事を防いでくれているわけです。 しかし Jet データベースエンジンは、各クライアント上でアプリケーションの一部として動作していますから、抽出や並べ替えを行うためには少なくともインデックス、もしかすると全ての表データを一旦クライアント側に持ってこないといけませんし、各クライアント上のエンジン同士はそれぞれが無関係ですから、そこそこのロックメカニズムはあるにしても、同時更新等で壊れないのが逆に不思議です。 オートナンバーにしても、単一のプロセスが発番しているわけではないので、読み書きのタイミングによっては重複する可能性もあるかも知れませんね。 | ||||||||
|
投稿日時: 2006-10-15 12:00
複数のパソコン(クライアント)がMDBファイルを開くと、コピーがクライアント側に生成されるようなイメージですかね(ファイルの中身を全部持ってくるので開くときに時間がかかる)。 で、別々のパソコンで同時に書き込みをしようとして、タイミング的に後になった方が結果として同じオートナンバーを書こうとしてしまう…。それなら納得です。 最終的にMDBファイルに残るデータとしてはオートナンバーが重複しなさそうなのには少し安心しました。 | ||||||||
|
投稿日時: 2006-10-16 00:47
ちょっと違いますね。 以前にも言いましたが、データストア・エンジン・データアクセス関連のオブジェクトと分けて考えてみて下さい。 データストアに相応する mdb ファイルは一箇所にあります。 一方で、データベースエンジンである jet は各クライアントにあります。 当然、jet がデータを検索したり更新するためには、データストアに対して何らかの処理をすることになるということです。 全てをコピーするわけではありません。
番号が狂う理由はわかりませんが、システムが持つ隠しテーブルに、テーブル名とオートナンバーフィールド名と、どこまでの番号が振られたのかを記録していたと思います。 で、この値が狂ってしまうために、上記のようなことになるのだと思います。 _________________ R・田中一郎 - R.Tanaka.Ichiro’s Blog | ||||||||
|
投稿日時: 2006-10-16 09:11
LoveDevice1973さん、お早うございます。
例えば、order by field1 として並べ替えを行う場合、field1 列がインデックス化されていなければ、field1 列に格納されているデータを全レコード舐めて、比較する処理が必要になります。それが、ネットワーク越しに行われるわけです。 | ||||||||
|
投稿日時: 2006-10-19 20:25
こんばんわ。お返事が遅くなりました。
全てをコピーしてから使っているワケではないんですね。 どの本に書いてあったか探してみましたが見つからないので、別の意図の解説を誤解してしまったのかも知れません。
なんか凄く納得した気がします。集計とかのマクロを走らせるとタスクマネージャのネットワークタブのグラフがグワッと上がりました。 Accessにしてもまだまだ勉強不足のようです (T-T) これからもトンチンカンな質問をさせていただくかも知れませんが、今後ともよろしくお願いいたします。 |