19

私が作成したものではなく、MSSQL2000 データベースにリンクされたマルチユーザー Access 2000 DB を維持しています。

データベースの設計は非常に貧弱なので、我慢する必要があります。

「Customer」フォームには、デフォルトで次の利用可能な顧客 ID を取得する必要がある「Customer_ID」フィールドがありますが、ユーザーはこの選択を既存の顧客 ID で上書きするオプションがあります。

現在、Customer_ID フィールドは Customer テーブルの PK ではありません。また、ユニークではありません。

顧客がジョブを送信するために 2 回電話をかけた場合、テーブルは 2 つのレコードを取得しますが、それぞれが同じ顧客情報と同じ顧客 ID を持っています。

ユーザーが新しいチケットを作成すると、Access は次に利用可能な顧客 ID をすばやく検索して入力します。ただし、レコードは保存されません。明らかに問題です。編集している 2 人のユーザーは、顧客 ID をだまされないように、互いの作業を追跡する必要があります。

そのため、「新しいレコード」ボタンを変更して、新しいチケットを作成した直後にチケットを保存したいと考えています。

問題は、変更をテストすると、「このレコードは、編集を開始してから別のユーザーによって変更されました」というメッセージが表示されることです。

DB上に他のユーザーは絶対にいません。「他のユーザー」はおそらく私の強制保存でした。

何か案は?

4

10 に答える 10

52

SQL Server 2000 のリンク テーブルを見てください。ビット データ型を含むフィールドがありますか? 既定値を持たないビット フィールドがある場合、Access はリンク テーブル シナリオでこのエラー メッセージを表示します。

あなたの場合は問題ではないかもしれませんが、私は Access 2007 データベースで同じことを経験し、デフォルト値のないビット フィールドに問題を追跡しました。

于 2009-06-11T18:12:25.373 に答える
15

以前にこの動作を見たことがありますが、これで修正されました。

テーブルに TimeStamp フィールドを追加してみてください (このフィールドを追加して、リンクされたテーブルを更新するだけです。このフィールドに任意の種類のデータを入力する必要はありません)。

于 2009-06-10T13:44:22.730 に答える
7

通常、発生するエラーは次の場合に発生します。

  1. フォームのレコードを編集していて、フォームがダーティ(つまり、編集が保存されていない)である場合、

  1. DAOまたはADOを使用してSQLを実行し、同じレコードを更新するコードを実行します。

Jetにとっては、2つの異なる編集操作であるため、これは2つの「ユーザー」です。基になるテーブルはSQLの更新によって更新されましたが、フォームバッファのデータは古くなっています。

通常の解決策は、SQL更新を実行する前に強制的に保存することです。

  If Me.Dirty Then
     Me.Dirty = False
  End If
  [run your SQL update here]

ただし、フォームを使用してレコードを編集している場合は、SQLを使用して更新を行うのではなく、フォーム内のすべての更新を行う必要があります。

独自のシーケンスを生成することで説明する状況は、次のように実行する必要があります。

  1. ユーザーがNEWRECORDボタンを押します。

  2. 次のシーケンス値を計算し、それを変数に格納します。

  3. SQL INSERTを使用して、そのシーケンス値を含む新しいレコードを挿入します。

4a。フォームがテーブル内のすべてのレコードにバインドされている場合は、データ編集フォームを再クエリし(ユーザーがデータを編集するフォームに[新規レコード]ボタンがあると想定)、ブックマークナビゲーションを使用して、シーケンス値が次の新しいレコードに移動します。手順2で変数に保存しました。

4b。フォームがすべてのレコードにバインドされていない場合(適切に設計されたデータベースの場合はそうではないはずです)、フォームのレコードソースを変更して、新しいレコードのみをロードします。

もう1つの方法は、SQL INSERTと再クエリ(またはレコードソースのリセット)を回避し、既存のフォームに新しいレコードを追加し、シーケンスフィールドを新しい値に設定して、すぐにレコードを保存することです。

重要な点は、これがマルチユーザー環境で機能するためには、シーケンス値が割り当てられたらすぐにレコードを保存する必要があるということです。つまり、レコードを保存せずにそのままにしておくことはできません。同じシーケンス値を他のユーザーが利用できますが、これは単に災害を要求しているだけです。

于 2009-06-10T03:45:28.067 に答える
5

これは Google から出くわした古い質問なので、回答を送信します。

ODBC ドライバーで、行のバージョン管理がオンになっていることを確認します。テーブルが既に Access にある場合は、それを削除してソース テーブルに再リンクする必要があります。

Access は という名前のテーブルに列を追加する必要があるため、行のバージョン管理が有効になっているかどうかがわかりますxmin

于 2011-03-28T14:01:08.637 に答える
1

ユーザーが新しい customer_id を独自の値でオーバーライドしたかどうかを追跡します。そうでない場合、アプリは保存する直前に重複をチェックし、再度自己インクリメントすることができるはずであり、ユーザーはデフォルトを使用することを気にしませんでした。おそらく、別の値を自動的に選択する必要があることをユーザーに示すものでさえあります。

于 2009-06-10T00:08:24.767 に答える
0

私も同じ問題を抱えていました。Spring MVC と休止状態を使用してテーブルを更新しようとしていました。私の場合、テーブルのバージョン列には 1 より大きい値 (つまり 3) が含まれていますが、更新クエリの更新情報にはバージョン値 1 がありました。

于 2013-06-18T11:19:45.687 に答える
0

このエラーは、SQL Server テーブルに datetime2 列が含まれている場合にもスローされる可能性があります (私の場合はデフォルト値の sysdatetime())。データ型を日時のデフォルト current_timestamp に戻すと、エラーが停止します。

于 2015-10-14T17:29:04.400 に答える