0

Access 2013 と Sql Server 2012 を使用しています。リンク テーブルを使用して Access アプリケーションを Sql Server にアップサイズしました。約 4 つのテーブルからの結果を提供する Access クエリ (SQL サーバー上ではない) があります。次に、これをバインドされたレイアウト/テーブル ビューに表示し、各行が結果クエリの行に対応します。

レイアウト ビューでは、ユーザーは任意の行のデータを編集できます。ユーザーが編集を行うと、明らかに Access がトランザクションを開き、開いたままにします。ユーザーが編集可能なレイアウト ビューにいる限り、クエリの一部であったテーブルはロックされます。別のコンピューターの別のユーザーが Access を使用している場合、そのユーザーは (同じレイアウト ビューだけでなく、どの方法でも) テーブルを編集できません。2 番目のユーザーは、アプリケーションで 30 秒間一時停止し、最後にエラーが発生します...

ODBC-update on a linked table 'TableName' failed.
[Microsoft][ODBC Sql Server DRiver]Query timeout expired (#0)

最初のユーザーがレイアウト ビューを終了すると、他のユーザーが編集できるようにすべてが再び開かれます。

トランザクションを制御する方法はありますか? おそらく、1行を更新してからトランザクションを解放するだけです。

レイアウト ビューのデータ ソースを SQL Server Sproc またはビューに変更し、テーブルでの編集を許可しない場合があります。代わりに、ユーザーが連続して何かを変更したい場合は、クリックして編集フォームを表示します。他のオプションを探しています。

4

1 に答える 1

1

考えられる解決策がいくつかあります。

1 つの解決策は、WHERE 句を使用して問題のフォームを開いて、多くの行ではなく 1 つの行のみを開くことです。

上記は、問題のフォームが継続フォームでない場合の実用的な提案にすぎません。

だからあなたは行き​​ます:

strInvoice = inputbox("What invoice to work on")

docmd.Openform "frmInvoice",,,"[invoiceNum] = " & strInvoice

そのため、フォームを 1 行に制限すると、invoice 列にインデックスがあると仮定してこれが修正されます。また、このようなデザインは、よりユーザーフレンドリーになる傾向があります。ここで、この重要な検索の概念について説明します。

http://www.kallal.ca/Search/index.html

この問題を解決する別の方法は、フォームにすべてのレコードを強制的に入力することです (これは、パフォーマンスの観点からは本当に悪い考えです。SQL サーバーがなくても、上記のように where 句を使用せずにフォームを起動するのは悪いことです)。ユーザーの観点からのアイデア、およびパフォーマンスの観点からのアイデア)。

テーブル ロックが頻繁に発生する理由は、フォームが SQL サーバーからのデータのプルを開始した後、Access が「ちょっと待って、十分なデータがあります」と表示するためです。クライアントに送信します (したがって、クライアントがレコードの流れを停止することが、実際にロックの原因となります)。したがって、この問題を防ぐためにできることは、move last を実行してすべてのレコードをプルすることです。これにより、テーブル ロックが解消 (解放) されます。

したがって、フォームのオンロード イベントでは、次のように移動できます。

me.recordset.MoveLast
me.recordset.MoveFirst

指摘したように、ここでの問題は、すべてのレコードをフォームにプルすることは、そもそも非常に悪い設計であるということです。

最後に:

テーブル ロックを排除するもう 1 つの方法は、ビュー SQL サーバー側としてクエリを作成し、NOLOCK ヒントを含めることです。次に、ビューへのリンクを設定し、ローカル クエリではなくビューのフォームに基づいてフォームを作成します。ビューには NOLOCK ヒントがあるため、上記のように movelast/movefirst の提案は必要ありません。

したがって、ここにいくつかの解決策がありますが、1 つのレコードに対してフォームを開くことが実際に推奨される解決策です。つまり、現金自動預け払い機に近づくと、すべてのアカウントがダウンロードされず、どのアカウントで作業するかを尋ねられます。Google などの検索エンジンを使用すると、インターネット全体がダウンロードされず、何を検索するかを尋ねられます。ソフトウェアを書いている人は言うまでもなく、バス停にいるおばあさんでもこれを理解できます。

したがって、Access でフォームを設計および作成する場合、すべてのレコードをテーブルからフォームにダウンロードして、ユーザーに検索させることはほとんど意味がありません。そのため、フォームが読み込まれる前に何を処理するかをユーザーに確認する必要があり、フォームを開くときに where 句を使用する場合でも、フォームが SQL サーバーへの大きなリンク テーブルにバインドされている場合は、そのレコードのみが必要です。 where句に一致すると、そのフォームに引き下げられます。

where 句を使用しないと、前述のように、ロックの問題が頭をよぎります。

一時的な修正として、ロード時にフォームで movelast/movefirst を試してください。ロックの問題が修正されるはずです。ただし、長期的には、where 句を使用するか、ビューのアイデアを検討することをお勧めします。

4 つのテーブルのいずれかに基づくコンボ ボックスがある場合は、コンボ ボックスがデータを要求するため (SQL サーバーはその要求中にテーブル ロックを配置するため)、再びロックの問題が発生することに注意してください。また、再度 Access は SQL Server にコンボ ボックスのロードを停止するように指示します。これは、すべての行がまだ必要でないためです (ただし、テーブル ロックが発生したため、遅すぎます)。

そのため、使用されているテーブルのいずれかに基づいてそのフォームにコンボ ボックスがある場合、再びテーブル ロックが発生することがわかります。これらの場合、NO LOCK ヒントを使用したパススルー クワイア、または再び no-lock ヒントを使用したビューに基づいてコンボ ボックスを作成することをお勧めします。

そのため、これらのテーブルのいずれかに基づくコンボ ボックスのフォームを確認してください。テーブル ロックも発生します。

于 2015-09-13T23:08:03.427 に答える