Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql MS Access是否禁止插入时的主键冲突?_Sql_Ms Access_Primary Key - Fatal编程技术网

Sql MS Access是否禁止插入时的主键冲突?

Sql MS Access是否禁止插入时的主键冲突?,sql,ms-access,primary-key,Sql,Ms Access,Primary Key,我正在将MS Access数据库重新写入SQL server的过程中,在Access中发现了一个奇怪的问题,希望有人能提供帮助 我有一个表,我们称之为“Main”,在帐户上有一个主键,该主键被索引,不允许重复。看起来很简单,但我的问题发生在插入数据时 我的INSERT查询是(为简洁起见,字段数量已被限制) 问题是,如果我运行查询的SELECT部分,我会得到2365条记录,但当我运行INSERT时,我会得到2364条记录。所以我做了一些检查,我发现一个帐户是重复的记录之间的差异是发送日期和金额。但

我正在将MS Access数据库重新写入SQL server的过程中,在Access中发现了一个奇怪的问题,希望有人能提供帮助

我有一个表,我们称之为“Main”,在帐户上有一个主键,该主键被索引,不允许重复。看起来很简单,但我的问题发生在插入数据时

我的INSERT查询是(为简洁起见,字段数量已被限制)

问题是,如果我运行查询的
SELECT
部分,我会得到2365条记录,但当我运行
INSERT
时,我会得到2364条记录。所以我做了一些检查,我发现一个帐户是重复的记录之间的差异是发送日期和金额。但是Access只插入一条记录,不抛出任何类型的错误消息或任何东西。查询中没有显示“选择最近日期”等内容

样本数据:

Account    SentDate   Amount
12345678   8/1/2011   123.00
23456789   8/1/2011   45678.00
34567890   8/1/2011   7850.00
45678912   8/1/2011   635.00
45678912   5/1/2011   982.00
56789123   8/1/2011   2639.00
在这个示例中,我有一个帐户,当我运行INSERT时,它被复制了45678912,我没有收到任何错误,我从2011年8月1日获得了记录

为什么Access在违反表上的PK时不抛出错误?在访问中选择一条记录而跳过另一条记录是否存在一些怪癖


我完全被这个问题难住了,所以任何帮助都会很好

您是如何运行查询的?如果您使用的是
DoCmd.RunSQL
,请切换到使用DAO数据库对象的
。执行
方法,然后使用
dbFailOnError

Dim db As DAO.Database
Dim strInsert As String
strInsert = "your insert statement"
Set db = CurrentDb
db.Execute strInsert, dbFailOnError
Set db = Nothing
Edit:如果Main是指向SQL Server表的ODBC链接,我将检查after
db.Execute strInsert,dbFailOnError

在访问[更新]一条记录时是否存在一些怪癖,只需跳过 其他的

是的,您可以在引擎级别(如果使用OLE DB,也可以在记录集级别)控制此行为

对于OLE DB(例如ADO),设置为:

确定SQL DML批量运行时Jet数据库引擎的行为 操作失败。当设置为允许批量部分完成时 操作时,可能会发生不一致的更改,因为对某些 记录可能会成功,其他记录可能会失败。当设置为不允许时 批量操作部分完成,如果 只发生一个错误。喷气式OLEDB:全球部分批量操作 属性设置可以在每个记录集的基础上由 在中设置Jet OLEDB:Partial Bulk Ops的属性 属性记录集对象的集合


注意,默认情况下不允许部分完成批量操作。

在HansUp向我指出检查SetWarnings=false的方向后。我发现它隐藏在我的代码中,这就是为什么没有关于由于主键冲突而没有插入记录的警告消息的原因


需要注意的是,请确保您希望这些消息被抑制

我目前使用DoCmd.OpenQuery“queryname”、acViewNormal、,acEdit和get no errors,但它也是通过双击来运行查询的。我仍然没有收到任何错误,它运行成功。当要求您确认时,它会显示哪个数字?它不会显示任何奇怪的部分。如果您没有得到确认对话框,“您将要追加2365行。”这让我怀疑SetWarnings是否是假的。您的应用程序中是否有这样的内容,但它可能没有设置回True?SetWarnings再次出现!我们应该强调这一点,作为对其他人的警告。你可以提交决议作为答案,并接受该决议而不是我的决议。那太好了,因为我鄙视虚假的警告!在Access中执行SQL的唯一可靠方法是使用
。执行strSQL,dbFailOnError
。应该避免使用DoCmd.OpenQuery和DoCmd.RunSQL,因为当您关闭SetWarnings时,您不知道隐藏了哪些错误。我编写了一个函数SQLRun(),作为我多次发布的DoCmd.RunSQL的替代。它只是
.Execute、strSQL、dbFailOnError
的包装器,因此您不必每次都编写错误处理程序。在SO上搜索并试用。感谢您向我指出您的功能。我会看一看,以备将来使用。我当前的应用程序正在被重写,我不会对一个已经非常不稳定的应用程序进行任何代码更改。@David-W-Fenton:“在Access中执行SQL的唯一可靠方法…”当使用DAO时。但这是Jet的默认行为,当不特别告诉Access忽略错误时(这就是在关闭SetWarnings的情况下使用OpenQuery或RunSQL时所做的操作)。
Dim db As DAO.Database
Dim strInsert As String
strInsert = "your insert statement"
Set db = CurrentDb
db.Execute strInsert, dbFailOnError
Set db = Nothing