在ADO RecordSet AddNew和Update

时间:2015-06-25 22:03:42

标签: vbscript asp-classic ado recordset

当我在.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也有效)。任何人都知道造成这种情况的幕后发生了什么?

1 个答案:

答案 0 :(得分:1)

我提出的解决方案是在RecordSet上调用第一个Update后立即添加以下代码行:

rsTaskLog.AbsolutePosition = rsTaskLog.AbsolutePosition

由于某些原因,移动光标位置会使RecordSet返回到可以再次调用Update而不会产生错误的状态(MoveFirst和MoveLast也可以工作,但是通过将AbsolutePosition设置为自身,我们可以保持当前位置)。我不完全确定幕后会发生什么,如果您在评论中知道,请随时详细说明。