【问题标题】:XML output parameters with ADODB in ASP ClassicASP Classic 中使用 ADODB 的 XML 输出参数
【发布时间】:2014-05-26 09:54:56
【问题描述】:

我在寻找解决 ASP 经典中检索 XML 问题的解决方案时发现了此错误: Declaring XML output parameters with ADODB in ASP Classic

我在使用 Classic ASP 和 SQL Server 2003 时遇到了同样的错误。我曾经在 VB6 中使用 .dll,我可以在其中获取 XML 代码。但现在我需要从 SQL 直接到 ASP。 你解决了吗?

到目前为止,我在经典 ASP 中的代码是:

set objCommandoOP = Server.CreateObject("ADODB.Command")
Set objCommandoOP.ActiveConnection = objConexion
objCommandoOP.CommandType = adcmdStoredProc
objCommandoOP.CommandText="spProducesXML"
set ParamEnt = objCommandoOP.CreateParameter("@CodOne", adInteger, adParamInput, 4, Entidad())
objCommandoOP.Parameters.Append ParamEnt
set ParamUser = objCommandoOP.CreateParameter("@CodTwo", adInteger, adParamInput, 4, Usuario())
objCommandoOP.Parameters.Append ParamUser
set ParamFrac = objCommandoOP.CreateParameter("@GroupType", adInteger, adParamInput, 4, Request("GrupoFrac"))
objCommandoOP.Parameters.Append ParamFrac
set ParamReturn = objCommandoOP.CreateParameter("@paramReturn", adXML, adParamInputOutput, 4, 0)

objCommandoOP.Parameters.Append ParamReturn

set objResultseto = Server.CreateObject("ADODB.RecordSet")
'Internal procedure that execute the ddbb sp
ExecProcedure objResultseto, adOpenStatic, objCommandoOP

sResult = "<dmo:OperationImport xmlns:dmo='http://www.example.es/XML' xmlns:xs='http://www.w3.org/2001/XMLSchema' />"
sResult = sResult & ParamReturn
sResultXML= sResultXML & "</dmo:OperationImport>"

错误发生在“adXML”行,因为作为 David,我找不到 XML 变量来从 ddbb 中获取参数。我尝试将其作为 SQL 过程的 paramReturn(使用 FOR XML EXPLICIT),还有其他想法吗?

【问题讨论】:

  • +1 至少发布一些代码,不像 David
  • 你的存储过程是什么样的?
  • 代码格式不能使用 bold 降价,所以你最终会在你的adXML 周围加上**bold**,这就是为什么我在下面的added the comment line 指向你的adXML 变量。但是你已经删除了它,所以我猜每个人都有自己的。
  • 你告诉我的,我才把它删掉了,之前没有注意到,对不起!
  • @JavierSalazar 您不能返回 XML,您必须使用 ADODB.Stream 对象对其进行流式传输。

标签: sql xml asp-classic adodb


【解决方案1】:

您在adXML 行收到错误的原因是没有DataTypeEnum 用于此数据类型。

ADO 2.6 中,ADODB.Command 对象已扩展为支持使用ADODB.Stream 对象传递和接收 XML 数据。

要在 ADODB.Command 中传递 XML 数据类型,请使用 CommandStream 属性

Set stream = Server.CreateObject("ADODB.Stream")
Call stream.Open()
Call stream.WriteText(xml, adWriteChar)

'Set ADODB.Stream to CommandStream before executing ADODB.Command
command.CommandStream = stream
command.Execute(, , adExecuteStream)

要检索 XML 数据类型,请使用动态属性 Output Stream

Set stream = Server.CreateObject("ADODB.Stream")
Call stream.Open()

'Set ADODB.Stream to dynamic property "Output Stream"
command.Properties("Output Stream") = stream
command.Execute(, , adExecuteStream)
'Reset stream position before reading
stream.Position = 0
xml = stream.ReadText

有用的链接

【讨论】:

  • 这个解决方案不起作用,我应该做类似command.Properties("Output Stream") = Response的事情吗?它在编译代码时直接失败:/
  • @JavierSalazar 这些只是示例,我不会为您重新编写代码。 command 是示例中 my ADODB.Command 对象的通用名称,只是在您的代码中输入该对象不起作用,因为您的 ADODB.Command 对于初学者来说被称为 objCommandoOP
  • 我之前尝试过流式风格,但在调用时总是报错:command.Properties("Output Stream") = stream。它来自 ADODB.Command 的 800a0cc1:在与请求的名称或序号相对应的集合中找不到项目
  • @JavierSalazar objCommandoOP.Properties("Output Stream") 属性将允许您访问您的 FOR XML 输出,但您需要将其分配给 open ADODB.Stream。获得流后,您可以读取/写入它或使用Response.BinaryWrite() 直接输出到响应缓冲区。
  • @JavierSalazar 如果您收到该错误,则几乎没有可能1. 您没有使用FOR XML 在存储过程中正确输出您的XML。 2. 您没有使用 ADO 2.6,因为直到该版本才支持 ADODB.Command 对象的流式传输。
【解决方案2】:

我终于可以找到解决方法了。基本上将参数从 SQL 发送为varchar(max) 而不是 XML,然后在 ASP 中将其视为对象结果集,我将 varchar 转换为 XML。尝试了超过 30k 个字符的文件并且仍然有效。 迄今为止的经典 ASP 代码:

`

dim objResultseto
set objResultseto = Server.CreateObject("ADODB.RecordSet")
AbrirProcAlmacenado objResultseto, adOpenStatic, objCommand             

if objResultseto.EOF= false then        
 while (objResultseto.EOF = false)

        Set xmlOperaciones = Server.CreateObject("Msxml2.DOMDocument.4.0")
            xmlOperaciones.Async = False
            xmlOperaciones.loadXML(objResultseto("XML_VAR"))
            xmlOperaciones.setProperty "SelectionNamespaces","xmlns:dmo='http://www.webpage.com/'"
            if xmlOperaciones.parseError = 0 then 
                xmlOperaciones.Save("C:\Example.xml")
                sResultado= "OK"
            end if
            objResultseto.movenext
 wend
else
 response.Write("There are no these kind of operations")
 response.end
end if

'

请记住,这只是一种解决方法。

干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多