【问题标题】:Dumping an ADODB recordset to XML, then back to a recordset, then saving to the db将 ADODB 记录集转储到 XML,然后返回到记录集,然后保存到数据库
【发布时间】:2011-02-22 09:19:06
【问题描述】:

我使用 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 时,这会爆炸。

用于 ODBC 驱动程序的 Microsoft OLE DB 提供程序错误“80040e21”

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

谁能告诉我我做错了什么或建议一种更好的方法来将从 XML 加载的数据复制到不同的数据库?

更新,部分解决

事实证明,我的错误是由于我试图设置 Identity 字段的值造成的。如果我暂时将该字段更改为 not 是一个身份,所有数据都会完美插入。

现在是一个后续问题

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 虽然没有给出任何错误,但它也不会在新数据库的表中插入任何记录。
      • 自从我使用 ADO 以来已经有很长时间了,但我认为您应该设置一些属性来指示 ADO 处于“脏”状态。顺便说一句,当您将 ADO 保存为 XML 时,它是否有 元素?
      • 没有任何插入语句。它是一个 xml 文档,其中包含定义字段的 Schema,然后是一组定义实际数据的 z:row 节点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      • 2016-10-09
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多