在Access/SQL中编辑记录问题(写入冲突)
在将我使用的SQL DB迁移到新服务器后,出现了一个问题。现在,当试图在Access(窗体或表)中编辑记录时,它会显示:在Access/SQL中编辑记录问题(写入冲突),sql,sql-server,sql-server-2008,ms-access,Sql,Sql Server,Sql Server 2008,Ms Access,在将我使用的SQL DB迁移到新服务器后,出现了一个问题。现在,当试图在Access(窗体或表)中编辑记录时,它会显示:写入冲突:此记录在您开始编辑后已被其他用户更改… 有什么不明显的原因吗。没有其他人在使用服务器,我已经禁用了表上的任何触发器。我刚刚发现这与空值有关,因为没有空值的记录是可以的,但有些行有空值则不行。这可能与索引有关吗?如果相关的话,我最近开始每天批量上传,而不是使用INSERT-In-from Access一次上传一个文件。这是Microsoft的一个错误 要解决此问题,请使
写入冲突:此记录在您开始编辑后已被其他用户更改…
有什么不明显的原因吗。没有其他人在使用服务器,我已经禁用了表上的任何触发器。我刚刚发现这与空值有关,因为没有空值的记录是可以的,但有些行有空值则不行。这可能与索引有关吗?如果相关的话,我最近开始每天批量上传,而不是使用INSERT-In-from Access一次上传一个文件。这是Microsoft的一个错误 要解决此问题,请使用以下方法之一:
- 更新基于多表视图的表单
第一次出现“症状”部分中提到的错误消息时,必须单击“复制到剪贴板”或“复制到剪贴板”
在“写入冲突”对话框中删除更改。避免重复
出现“症状”中提到的错误消息
节中,您必须在编辑前更新表单中的记录集
还是同一张唱片。 笔记 要在Access 2003或Access 2002中更新表单,请单击“记录”菜单上的“刷新”。 要在Access 2007中更新表单,请单击“开始”选项卡上“记录”组中的“全部刷新” - 将主窗体与链接的子窗体一起使用
为了避免“症状”部分中提到的错误消息重复出现,您可以使用带有
链接子窗体以在相关表中输入数据。您可以输入
从一个位置在两个表中记录,而不使用 基于多表视图。 要创建带有链接子窗体的主窗体,请执行以下步骤: 基于多表视图中使用的相关(子)表创建新表单。包括必填字段 在表格上。 保存表单,然后关闭表单。 基于多表视图中使用的主表创建新表单。将必填字段包括在
形式。 在数据库窗口中,将步骤2中保存的表单添加到主表单中 这将创建一个子表单。 将子窗体的“链接子字段”属性和“链接主字段”属性设置为字段的名称,这些字段是
用于链接表
形式如下:
'这将保存表单的当前记录
我,肮脏=虚假
'现在,以编程方式更改记录
2缺少主键或时间戳 确保SQL Server表具有主键和时间戳列 时间戳列有助于Access确定自上次选择记录以来是否对其进行了编辑。Access通过检查所有字段(如果没有可用的时间戳)来实现这一点。如果没有时间戳列,这可能不适用于空条目(请参阅3个空位问题) 时间戳实际上存储的是行版本号,而不是时间 在添加时间戳列后,不要忘记刷新access中的表链接,否则access将看不到它。(注意:Microsoft的升迁向导在将Access表转换为SQL Server表时会创建时间戳列。)
3个空位问题 根据@AlbertD.Kallal,这可能是此处描述的空位问题:。如果您使用的是位字段,请将其默认值设置为
0
,并用0
替换之前输入的任何空值。对于布尔字段,我通常使用位默认值0 NOT NULL
,因为它最接近布尔值的概念
KB文章说使用*.adp而不是*.mdb;但是,.与原始海报一样,也存在此问题。即使在不使用表单的情况下也可以直接编辑。问题出在位字段上,如果您的字段为Null,那么当您访问记录时,它会将Null转换为0,然后您会进行更改,这一次是第二次更改。所以这两个变化是相互冲突的。我听从了奥利弗的建议: “确保表具有主键和时间戳列”
它解决了这个问题。为了克服这个问题。我创建VBA是为了更改同一行中的另一个字段。因此,我创建了一个单独的字段,当我试图关闭表单时,它会向内容中添加1。这就解决了问题。当链接到MS SQL Sever 2000(及之前版本)时,我在MS Access 2003(及之前版本)中看到了类似的情况。在我的例子中,我发现问题在于MS SQL Server数据库表中的位字段——位字段不允许空值。当我将记录添加到通过MS Access 2003链接的表中时,数据库窗口将返回错误,除非我专门将位字段设置为True或False。为了补救,我更改了任何MS SQL Server数据表,使任何位字段都默认为0值或1。一旦我这样做了,我就能够通过MS Access向链接表添加/编辑数据。我已经多次使用链接到MS SQL表的MS Access表解决了这个问题。原始海报的回复非常有帮助,确实是我很多问题的根源 当我不小心在fieldname中添加了一个带有空格的位字段时,我也遇到了这个问题。。。是的 我已经运行了alter table tablename add[fieldname]位默认值0。
SELECT
'UPDATE [' + o.name + '] SET [' + c.name + '] = ISNULL([' + c.name + '], 0);' +
'ALTER TABLE [' + o.name + '] ALTER COLUMN [' + c.name + '] BIT NOT NULL;' +
'ALTER TABLE [' + o.name + '] ADD CONSTRAINT [DF_' + o.name + '_' + c.name + '] DEFAULT ((0)) FOR [' + c.name + ']'
FROM
sys.columns c
INNER JOIN sys.objects o
ON o.object_id = c.object_id
WHERE
c.system_type_id = 104
AND o.is_ms_shipped = 0;
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