SCOPE_IDENTITY返回null,直到在MS Access中引发错误为止



MS Access前端和SQL Server后端,在Access over OBDC连接中使用传递查询。没有ADO,只有简单的DAO查询对象。

在执行INSERT查询之后;SELECT SCOPE_IDENITY((";运行查询以检索新插入的记录的ID。

SCOPE_IDENTITY查询返回null——除非在Access中引发错误。无论是哪种类型的错误,如果抛出错误并结束它,那么每次之后运行此代码时——直到关闭窗体或关闭应用程序(取决于代码是在窗体中还是在模块中(——它都会在每次插入后返回正确的值。

如果我添加错误处理或更改代码以防止错误,那么每次执行代码时它都会继续返回null。

我验证了每次INSERT都是成功的,即使SCOPE_IDENTITY返回null也是如此。

试图弄清楚Access应用程序错误是什么导致SCOPE_IDENTITY在所有后续执行中都能正常工作?

代码:

Sub test()
Dim strConnect As String
Dim qdf As QueryDef
Dim newID As Long
strConnect = "ODBC;Description=myServer;DRIVER=SQL Server;SERVER=serverpath;Trusted_Connection=Yes;DATABASE=Apps"
'Insert
Set qdf = CurrentDb.CreateQueryDef("")
qdf.Connect = strConnect
qdf.SQL = "INSERT INTO myTable ([Field1],[Field2]) VALUES ('Value1','Value2')"
qdf.ReturnsRecords = False
qdf.Execute
'Get new record ID
Set qdf = CurrentDb.CreateQueryDef("")
qdf.Connect = strConnect
qdf.SQL = "SELECT SCOPE_IDENTITY()"
qdf.ReturnsRecords = True
newID = qdf.OpenRecordset(dbOpenSnapshot)(0)
Debug.Print "New ID:" & newID
End Sub

第一次运行时,SCOPE_IDENTITY返回null,因此Access抛出一个错误,因为;newID";变暗为"长",因此不接受空值。但在所有后续执行中,SCOPE_IDENTITY都会返回正确的值。

如果我变暗";newID";作为Variant类型,因此它将接受null,不会引发任何错误,每次执行此操作时,SCOPE_IDENTITY都将返回null。

我在使用@@IDENTITY时也有同样的行为。

您所拥有的应该是有效的。即使您重新创建了连接,那么您的代码也应该可以工作。我不得不猜测/思考/推测,关于额外执行的第一个查询出现了一些错误——接下来你可以说是一个错误恢复。

如果你在发布代码之前有一份错误简历,那么这可能就是问题所在。当不允许使用null时,您可能会尝试插入一个null值。

我的意思是,如果这是在同一张表上,同一个代码剪辑?哼,我不知道为什么这样不起作用。

我会仔细检查一些错误简历是否未激活。也许将一个打开的错误转到0以关闭错误继续。

很抱歉,上面的代码确实很好用。我把它拉进了一个新的数据库,没有其他任何东西,第一次和之后的每一次都运行得很好。(我知道——应该在发布之前这么做…(facepalm(

因此,我需要追踪原始应用程序中存在其他干扰。启动时,该应用程序会从服务器打开其他几个记录集,因此看起来有什么东西在干扰,因为应用程序错误会破坏所有记录集变量,并关闭任何可能仍然打开的连接,从而消除干扰,并允许后续执行正常进行。

相关内容

  • 没有找到相关文章

最新更新