当我在.vbs文件中调用AddNew和Update之后尝试编辑ADO RecordSet记录的字段时,我收到错误消息“无法确定新插入行的标识”。但是,我能够访问从数据库返回的主键。
我不是在寻找一种解决方法(例如关闭记录集并通过其ID检索记录),我真的很想知道为什么会出现这种错误。我在测试文件中简化了我的代码以排除任何其他问题。你在下面看到的是我正在执行的确切代码,没有包含任何文件(我已从连接字符串中删除了凭据)。
Dim connString : connString = "Provider=SQLOLEDB.1;Persist Security Info=True;Data Source=localhost;Initial Catalog=;User Id=;Password="
Dim conn, rsTaskLog, sSQL
Set conn = CreateObject("ADODB.Connection")
conn.Open connString
' Create a new task log entry.
Set rsTaskLog = CreateObject("ADODB.Recordset")
sSQL = "SELECT * FROM Test"
rsTaskLog.Open sSQL, conn, 1, 3, 1 'adOpenKeyset, adLockOptimistic, adCmdText
rsTaskLog.AddNew
rsTaskLog.Update
' Set the task log result.
rsTaskLog.Fields("test_int").Value = 1 ' Error occurs on this line.
rsTaskLog.Update
rsTaskLog.Close
Set rsTaskLog = Nothing
更新
我能够通过在第一次更新后添加以下行来使这段代码工作:
rsTaskLog.AbsolutePosition = rsTaskLog.AbsolutePosition
关于移动当前记录的一些事情是将RecordSet重新置于可以编辑它的状态(MoveLast和MoveFirst也有效)。任何人都知道造成这种情况的幕后发生了什么?
答案 0 :(得分:1)
我提出的解决方案是在RecordSet上调用第一个Update后立即添加以下代码行:
rsTaskLog.AbsolutePosition = rsTaskLog.AbsolutePosition
由于某些原因,移动光标位置会使RecordSet返回到可以再次调用Update而不会产生错误的状态(MoveFirst和MoveLast也可以工作,但是通过将AbsolutePosition设置为自身,我们可以保持当前位置)。我不完全确定幕后会发生什么,如果您在评论中知道,请随时详细说明。