将ADODB记录集转储为XML,然后返回到记录集,然后保存到db

时间:2010-05-21 14:04:48

标签: asp-classic vbscript sql-server-2000 mxml adodb

我使用ADODB记录集的.Save()方法以下列方式创建了一个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的表完全相同的结构。

我首先创建了一个新记录集,并使用AddNewres中的所有行添加到新记录集

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 Provider for ODBC Drivers错误'80040e21'

     

多步OLE DB操作生成错误。检查每个OLE DB状态值(如果可用)。没有工作。

有人可以告诉我我做错了什么或建议我更好的方法将从XML加载的数据复制到不同的数据库吗?

更新,部分解决了

事实证明,我的错误是由于我尝试设置身份字段的值而引起的。如果我暂时将该字段更改为为标识,则所有数据都会完美插入。

现在是一个后续问题

我如何暂时关闭该字段的Identity属性,然后在完成更新后将其重新打开?

2 个答案:

答案 0 :(得分:0)

读回XML后,将记录集的连接属性设置为新的数据库连接,然后调用UpdateBatch。

答案 1 :(得分:0)

由于上述问题,我无法让Recordset.AddNew工作。

作为一种解决方法,我正在执行SET IDENTITY_INSERT table ON,执行INSERT sql和SET IDENTITY_INSERT table OFF