1

「連続フォーム」サブフォームを持つMicrosoftAccessアプリケーションがあります。アプリケーションでそのフォームにアクセスすると、SQL Serverに「大量の」ロック(1000を超える)があることがわかりました。[マスターデータベースビューsys.dm_trans_locksから1000レコードを選択することで見つかりました]。

フォームのデータソースは、qryProspectsummaryと呼ばれるパススルークエリです。次に、SQL "EXEC qryProspectSummary"を使用して、必要なデータを返すストアドプロシージャを呼び出します。

ストアドプロシージャ"qryProspectSummary"は、単純な複雑なselectステートメントであり、ネストされたselectとunion、および複数のテーブルの結合が含まれています。SQL Server Management Studioから実行すると、正しい結果が生成され、データベースのどの部分もロックされません。

データソースのレコードセットタイプを「スナップショット」に設定しました。

Accessがこれらすべてのロックを解除するのを防ぐにはどうすればよいですか?それは、単なるデータスナップショットであるはずのマルチユーザーを効果的に破壊します。

4

2 に答える 2

1

昨日、問題の解決策を見つけましたが、何らかの理由でこのサイトにアクセスできませんでした。ストアド プロシージャにアクセスするパススルー クエリを作成する代わりに、次のコードをフォームの ON LOAD イベントに追加しました。

Dim cmd As ADODB.Command, rst As ADODB.Recordset
Set cmd = New ADODB.Command
cmd.ActiveConnection = getStrConn
cmd.CommandText = "qryProspectSummary"
cmd.CommandType = adCmdStoredProc
Set rst = cmd.Execute()
Set Me.Form.Recordset = rst
Set cmd = Nothing

getStrConn は、データベース接続文字列を再試行する関数です (起動時にデータベースを変更する管理機能があるため、ハードコードすることはできません)。これで問題が解決し、フォームを開いたときにロックされることはなくなりました。

Form.Requery を使用していましたが、クエリを再実行しません。代わりに上記のコードを再実行する必要があります。しかし、それは支払うべき小さな代償です

于 2012-11-09T06:27:23.097 に答える
1

リンクされたビューを使用して、このスナップショットの結果を返すことができます。場合によっては、SQL Server からの大規模なデータ セットを処理するときに、Access の方がはるかに優れたビューを使用することがわかりました。qryProspectSummaryをビューとして使用する方法はありますか? これは動作が保証されているわけではありませんが、試してみたいオプションの 1 つです。

于 2012-11-08T16:42:13.520 に答える