Sql 在MS Access中,新记录有时会创建两个记录

Sql 在MS Access中,新记录有时会创建两个记录,sql,ms-access,Sql,Ms Access,我在子窗体中有查询结果,该子窗体通过子窗体外部的按钮进行操作 表格的图像: “添加记录”按钮所做的几乎就是运行一条INSERT语句并刷新表单/查询。INSERT语句包含的信息与前几行中的信息基本相同;不会更改的信息,如DLA\U持有者ID、DLA\U类型ID等。它将大多数其他字段留空以供输入,并分别使用Date()和Time()用于DLA\U创建日期和记录日期 添加行时,临时状态为'N',保存后将变为'S',如果取消,将运行更新语句删除满足临时状态的查询结果的行。这一切都很完美 我的问题是,有

我在子窗体中有查询结果,该子窗体通过子窗体外部的按钮进行操作

表格的图像:

“添加记录”按钮所做的几乎就是运行一条INSERT语句并刷新表单/查询。INSERT语句包含的信息与前几行中的信息基本相同;不会更改的信息,如DLA\U持有者ID、DLA\U类型ID等。它将大多数其他字段留空以供输入,并分别使用
Date()
Time()
用于
DLA\U创建日期
记录日期

添加行时,临时状态为
'N'
,保存后将变为
'S'
,如果取消,将运行更新语句删除满足
临时状态的查询结果的行。这一切都很完美

我的问题是,有时按“添加记录”时,会插入两行。它可能只发生在5%-10%的时间里,而且是随机发生的。添加这两行时,它们完全相同,只是
RECORD\u TIME
相隔1秒。即第1排=下午2:06:24,第2排=下午2:06:25

有办法解决这个问题吗?我认为发生这种情况的唯一方法是处理INSERT查询所需的时间,即
time()
值可能会从2:06:24更改为2:06:25,而不是选择一个,它会同时插入两个。(是的,我知道它不应该那样工作,但这是我所能想到的。)

编辑 这是“添加记录”按钮的代码。该按钮不能按两次,因为需要按“保存记录”或“取消”按钮才能重新启用“添加记录”按钮

Private Sub cmdNewRec_Click()

insert_query = "INSERT INTO DLA_RELATIONSHIP (DLA_HOLDER_ID, DLA_TYPE_ID, DLA_LOCATION_ID, DLA_PARAMETER_ID, DLA_TITLE, DLA_CREATION_DATE, TEMP_STATUS) SELECT DLA_HOLDER_ID, DLA_TYPE_ID, DLA_LOCATION_ID, DLA_PARAMETER_ID, DLA_TITLE, DLA_CREATION_DATE, ('N') AS TEMP_STATUS FROM DLA_RELATIONSHIP WHERE (((DLA_HOLDER_ID)= txt1) And ((DLA_TYPE_ID)= txt2) And ((DLA_LOCATION_ID)=txt6) and ((DLA_PARAMETER_ID)= txt3) And ((DLA_TITLE)=txt4) And ((DLA_CREATION_DATE)=txt5))"

DoCmd.SetWarnings False
DoCmd.RunSQL insert_query
DoCmd.SetWarnings True

Me.Form.refresh

lblNotice1.Caption = "New record present with unsaved changes"

cmdNewRec.Enabled = False
cmdSave.Enabled = True
cmdCancel.Enabled = True

End Sub

同样,请记住它是完全随机发生的(再次导致我认为它是时间()函数以某种方式参与的)。

您可以尝试将
TOP 1
添加到select on insert语句中:

INSERT INTO DLA_RELATIONSHIP (DLA_HOLDER_ID, DLA_TYPE_ID, DLA_LOCATION_ID, DLA_PARAMETER_ID, DLA_TITLE, DLA_CREATION_DATE, TEMP_STATUS) 
SELECT TOP 1 DLA_HOLDER_ID, DLA_TYPE_ID, DLA_LOCATION_ID, DLA_PARAMETER_ID, DLA_TITLE, DLA_CREATION_DATE, ('N') AS TEMP_STATUS 
FROM DLA_RELATIONSHIP 
WHERE (((DLA_HOLDER_ID)= txt1) And ((DLA_TYPE_ID)= txt2) And ((DLA_LOCATION_ID)=txt6) and ((DLA_PARAMETER_ID)= txt3) And ((DLA_TITLE)=txt4) And ((DLA_CREATION_DATE)=txt5))
如果这解决了您的问题,那么where条件将为select返回多条记录,这将插入两行


但是,您可能应该直接从文本框中的值插入记录,而不是从表中选择它们;这将使选择变得不必要

一个人也可以用摇摇晃晃的鼠标键点击两次……是的,在这种情况下不是。要找到原因,你需要编辑你的帖子,并将“添加记录”代码添加到其中。但您可以在该过程开始时简单地检查是否已经存在“N”记录。是否可以在插入完成之前禁用按钮,以测试这是否可以解决问题?@Andre我已添加了代码。谢谢Kateract,非常简单!我感谢你的帮助。