40

使用していた SQL DB を新しいサーバーに移行した後、問題が発生しました。Access (フォームまたはテーブル) でレコードを編集しようとすると、次のように表示されます。WRITE CONFLICT: This record has been changed by another user since you started editing it...

これには明らかではない理由がありますか。サーバーを使用している人は他にいません。テーブルのトリガーを無効にしました。NULL を持たないレコードは問題ありませんが、NULL を持つ一部の行はそうではないため、NULL と関係があることがわかりました。インデックスと関係があるのでしょうか?関連する場合は、最近、Access から INSERT INTO を使用して一度に 1 つずつアップロードするのではなく、毎日 BULK アップロードを開始しました。

4

14 に答える 14

62

考えられる問題:

1 同時編集

問題のレコードが、編集中のフォームで開かれている可能性があります。編集セッション中にプログラムでレコードを変更し、フォームを閉じようとすると (したがって、レコードを保存しようとすると)、Access はレコードが他のユーザーによって変更されたと表示します (もちろんそれはあなたですが、Access にはわかりません)。 )。

プログラムでレコードを変更する前に、フォームを保存します。
形式:

'This saves the form's current record
Me.Dirty = False

'Now, make changes to the record programmatically

2 主キーまたはタイムスタンプがありません

SQL-Server テーブルに主キーとタイムスタンプ列があることを確認してください。

タイムスタンプ列は、レコードが最後に選択されてから編集されたかどうかを Access が判断するのに役立ちます。タイムスタンプが利用できない場合、Access はすべてのフィールドを調べてこれを行います。タイムスタンプ列がない場合、null エントリではうまく機能しない可能性があります ( 3 Null ビットの問題を参照)。

タイムスタンプには、実際には時間ではなく、行のバージョン番号が格納されます。

タイムスタンプ列を追加した後、Access でテーブル リンクを更新することを忘れないでください。そうしないと、Access に表示されません。(注: Microsoft のアップサイジング ウィザードは、Access テーブルを SQL-Server テーブルに変換するときにタイムスタンプ列を作成します。)


3 ヌル ビットの問題

@AlbertD.Kallal によると、これはここで説明されているヌル ビットの問題である可能性があります: KB280730 (WayBackMachine の最後のスナップショット、元の記事は削除されました)。ビット フィールドを使用している場合は、デフォルト値を に設定し、0以前に入力された NULL を に置き換えます0。ブール値の考え方に最もよく一致するため、通常はBIT DEFAULT 0 NOT NULLブール値フィールドに を使用します。

KB 記事には、*.mdb の代わりに *.adp を使用するように記載されています。ただし、Microsoft は Access 2013 での Access Data Projects (ADP) のサポートを中止しました

于 2012-12-21T16:08:08.093 に答える
1

これはMicrosoftのバグです

この問題を回避するには、次のいずれかの方法を使用します。

  • マルチテーブルビューに基づくフォームを更新する[症状]セクションに記載されているエラーメッセージが最初に表示されたら、[クリップボードにコピー]または[競合の書き込み]ダイアログボックスで[変更をドロップ]をクリックする必要があります。「症状」セクションに記載されているエラーメッセージが繰り返し発生しないようにするに は、同じレコードを再度
    編集する前に、フォームのレコードセットを更新する必要があります。
    注Access2003またはAccess2002でフォームを更新するには、[レコード]メニューの[更新]をクリックします。Access 2007でフォームを更新するには、[ホーム]タブの[レコード]グループで[すべて更新]をクリックします。

  • リンクされたサブフォームを持つメインフォームを使用する「症状」セクションに記載されているエラーメッセージが繰り返し発生しないように、リンクされたサブフォームを持つメインフォームを使用して
    、関連するテーブルにデータを入力できます。
    マルチテーブルビューに基づくフォームを使用せずに、1つの場所から両方のテーブルにレコードを入力できます。リンクされたサブフォームを含むメインフォームを作成するには、次の手順に従います。

    マルチテーブルビューで使用される関連(子)テーブルに基づく新しいフォームを作成します。フォームに必須フィールドを含めます。フォームを保存してから、フォームを閉じます。マルチテーブルビューで使用されるプライマリテーブルに基づく新しいフォームを作成します。フォームに必須フィールドを含めます
    。[データベース]ウィンドウで、手順2で保存したフォームをメインフォームに追加します。

    これにより、サブフォームが作成されます。サブフォームのLinkChildFieldsプロパティとLinkMasterFieldsプロパティを
    、テーブルのリンクに使用される1つまたは複数のフィールドの名前に設定します。

マイクロソフトサポートから取得した回避策からのメソッド

于 2012-12-21T16:06:19.940 に答える
0

この問題が発生し、既存のテーブルに新しいビット フィールドを追加したことが原因であることに気付きました。新しいフィールドを削除すると、すべてが正常に機能するようになりました。

于 2014-12-11T19:13:15.683 に答える
0

MS SQL テーブルにリンクされた MS Access テーブルでこの問題に何度も対処しました。元の投稿者の反応は非常に役に立ち、実際に私の問題の多くの原因でした.

フィールド名にスペースを含むビットフィールドを誤って追加したときにも、この問題に遭遇しました...ええ....

alter table tablename add [fieldname ] bit default 0 を実行しました。私が見つけた解決策は、そのフィールドを削除し、名前にスペースを入れないことでした。

于 2014-05-01T14:58:11.777 に答える
0

私はこの回避策を使用していますが、うまくいきました: フロントエンド: Ms Access バックエンド: Mysql

特定のフィールドの更新前イベント:

Private Sub tbl_comuna_id_comuna_BeforeUpdate(Cancel As Integer)

If Me.tbl_comuna_id_comuna.OldValue = Me.tbl_comuna_id_comuna.Value Then
Cancel = True
Undo
End If
End Sub
于 2019-01-14T17:30:31.257 に答える
-2

同じエラー メッセージが表示されました。データベース テーブルの Id 列が BigInt に設定されていましたが、Int に変更すると問題が解決しました。

于 2016-06-15T04:20:07.843 に答える