将ADODB记录集转储到XML,然后返回到记录集,然后保存到数据库
问题描述:
我使用以下方式的ADODB记录集的.Save()
方法创建了一个XML文件。将ADODB记录集转储到XML,然后返回到记录集,然后保存到数据库
dim res
dim objXML: Set objXML = Server.CreateObject("MSXML2.DOMDocument")
'This returns an ADODB recordset
set res = ExecuteReader("SELECT * from some_table)
With res
Call .Save(objXML, 1)
Call .Close()
End With
Set res = nothing
让我们假设上面生成的XML然后被保存到文件。
我能够读取XML回到这样一个记录:
dim res : set res = Server.CreateObject("ADODB.recordset")
res.open server.mappath("/admin/tbl_some_table.xml")
,我可以遍历没有任何问题的记录。
但是我真正想做的是将res
中的所有数据保存到完全不同的数据库中的表中。我们可以假设some_table
已经存在于这个其他数据库中,并且具有与我最初查询制作XML的表完全相同的结构。
我开始通过创建一个新的记录,并使用AddNew
从res
添加的所有行的新记录
dim outRes : set outRes = Server.CreateObject("ADODB.recordset")
dim outConn : set outConn = Server.CreateObject("ADODB.Connection")
dim testConnStr : testConnStr = "DRIVER={SQL Server};SERVER=dev-windows\sql2000;UID=myuser;PWD=mypass;DATABASE=Testing"
outConn.open testConnStr
outRes.activeconnection = outConn
outRes.cursortype = adOpenDynamic
outRes.locktype = adLockOptimistic
outRes.source = "product_accessories"
outRes.open
while not res.eof
outRes.addnew
for i=0 to res.fields.count-1
outRes(res.fields(i).name) = res(res.fields(i).name)
next
outRes.movefirst
res.movenext
wend
outRes.updatebatch
但这种炸弹我第一次尝试将值分配从res
到outRes
。
Microsoft OLE DB提供程序的ODBC驱动程序错误 '80040e21'
多步OLE DB操作产生错误。检查每个OLE DB状态值(如果可用)。没有工作完成。
有人可以告诉我我做错了什么或建议一个更好的方法来将从XML加载的数据复制到不同的数据库?
更新,部分解决
所以,事实证明,我的错误是由我试图设置一个身份字段的值造成的。如果我暂时将该字段更改为而不是是一个身份,则所有数据都会完美插入。
现在的后续问题
我怎样才能暂时关闭该字段的标识属性,然后重新打开它时,我与我的更新做了什么?
答
因为上述问题,我从来没有能够得到Recordset.AddNew工作。
作为解决方法,我正在执行SET IDENTITY_INSERT table ON
,执行INSERT sql和SET IDENTITY_INSERT table OFF
。
答
读取XML返回后,将记录集的连接属性设置为新的数据库连接,然后调用UpdateBatch。
虽然这不会给出任何错误,但它也不会将任何记录插入到新数据库的表中。 – 2010-05-21 14:28:14
自从我与ADO合作以来,这已经很年轻了,但我认为您应该设置一些属性以表明ADO处于“脏”状态。顺便说一下,当您将ADO保存为XML时,它是否有元素? –
Raj
2010-05-21 14:47:31
没有任何插入语句。这是一个xml文档,Schema定义了字段,然后是一堆定义实际数据的z:row节点。 – 2010-05-21 14:48:51