欢迎光临
我们一直在努力

ADO数据与XML数据间的转换的类(ASP实现)

建站超值云服务器,限时71元/月

当对现有数据库的数据进行分析时,经常需要对某一部分的数据进行分析.此时,使用

1.sql查询分析器?

但其往往不直观,查找某个关键字又需要重新执行新的sql.

2.sqlxml模板?

但又不一定有权限建立新的虚拟目录,且某些sql语句sqlxml模板不支持

数据拆离时也有相似问题。

尤其当不同网络,不同环境,需要重新导入数据,进行分析或拆离,困难尤为明显。

能不能有一种方法,可以将数据脱离于数据库进行分析,需要时再导入到数据库中?

xml是个很好的选择!

ado本身支持数据到xml的转换,只需要对其格式进行解析,成为自己的xml文件通用格式,就可以进行本地分析

而对通用xml格式进行数据库映射,就可完成数据重新导入数据库的工作.

下面是一个ado数据(表的基本数据)与xml数据间的相互转换的类(asp实现),初步完成表数据的导入、导出。

通用表间关系映射(通过xsd描述),考虑之中,希望各位赐教指点,不胜感激.

一个调用类的例子:

example.asp

<!–#include file="transformdata.asp"–>

<%

dim asql(1,1)

dim oxmldata

====== 连接数据库过程 ======

获得数据库连接对象 odbconn

====== 连接数据库过程 ======

asql(0,0) = "publable"

asql(0,1) = "select * from publabel where clabelname like %abc% order by nlabelid"

asql(1,0) = "pubuser"

asql(1,1) = "select * from pubuser where cusername like %abc% order by nuserid"

set oxmldata = new transformdata

call export()

call import()

set oxmldata = nothing

// 当对象属性有默认值(default())时,可以不用在赋值

sub export() // 导出数据

oxmldata.asqldata = asql

必须 2维sql语句数组

oxmldata.bissave = 1

default(1) 是否保存为xml文件

oxmldata.bisoutput = 1

default(0) 是否显示xml数据

oxmldata.ssavefilename = "data.xml"

default(当前时间加随机数) 如果保存xml数据,xml文件名称

oxmldata.ssavefilepath = ""

default("") 如果保存xml数据,xml文件路径(相对路径)

oxmldata.sencoding = "gb2312"

default("gb2312") xml文件编码类型

oxmldata.export (odbconn)

// 导出数据过程

if (oxmldata.nerrcode<>0) then nerrcode(错误代码)为0,运行成功

response.write oxmldata.geterrexegesis(oxmldata.nerrcode)

nerrcode(错误代码),通过方法geterrexegesis() 获得注释

end if

end sub

sub import() // 导入数据

oxmldata.sxmlfile = "data.xml" 必须 数据源xml文件(包含相对路径)

oxmldata.svacancycols = "nlabelid" 必须 指定某些字段的值可以不导入(屏蔽字段)

格式 "nid,ddate" (以‘,’分隔字段)

oxmldata.import (odbconn)

if (oxmldata.nerrcode=0) then

response.write "数据导入成功!"

else

response.write oxmldata.geterrexegesis(oxmldata.nerrcode)

end if

end sub

%>

类的代码:

transformdata.asp

<%

class transformdata

*****************************************************

copyright (c) 2003

创 建 人 : moonpiazza

日 期 : 2003.5.21

描 述 : ado数据与xml数据间的转换(asp实现)

版 本 : 1.0

功 能 : ado数据(表的基本数据)与xml数据间的相互转换

待 改 进 : 表间数据的关联性(通用),数据量大时速度问题

版 权 : 欢迎改进,翻版不究 :_)

*****************************************************

*****************************************************

公共方法: export, import, geterrexegesis

*****************************************************

============================= 公共变量 end =============================

private m_oxmldom

private m_oxsldom

============================= 公共变量 begin =============================

============================= 错误代码定义 begin =============================

private m_nerrcode_notarray

private m_nerrcode_xmldom

private m_nerrcode_readdata

private m_nerrcode_writedata

private m_nerrcode_save

private m_nerrcode_ensfile

private m_nerrcode_errfile

============================= 错误代码定义 end =============================

============================= 属性定义 begin =============================

private m_asqldata

private m_bissave

private m_bisoutput

private m_ssavefilename

private m_ssavefilepath

private m_sxmlfile

private m_svacancycols

private m_nerrcode

private m_sencoding

private m_simportsql

*****************************************************

属性: asqldata

状态: 可写

类型: 2维数组

描述: sql语句数组,1维是表名称,2维是相应sql语句

*****************************************************

public property let asqldata(byref p_asqldata)

m_asqldata = p_asqldata

end property

*****************************************************

属性: bissave

状态: 可写

类型: 数字(0,1) default(1)

描述: 导出数据时,是否保存为xml文件

*****************************************************

public property let bissave(byref p_bissave)

m_bissave = cint(p_bissave)

end property

*****************************************************

属性: bisoutput

状态: 可写

类型: 数字(0,1) default(0)

描述: 导出数据时,是否显示xml数据

*****************************************************

public property let bisoutput(byref p_bisoutput)

m_bisoutput = cint(p_bisoutput)

end property

*****************************************************

属性: ssavefilename

状态: 可写,可读

类型: 字符串 default(getrndfilename())

描述: 导出数据时,如果保存xml数据,xml文件名称

*****************************************************

public property let ssavefilename(byref p_ssavefilename)

m_ssavefilename = p_ssavefilename

end property

public property get ssavefilename()

ssavefilename = m_ssavefilename

end property

*****************************************************

属性: ssavefilepath

状态: 可写,可读

类型: 字符串 default("")

描述: 导出数据时,如果保存xml数据,xml文件路径(相对路径)

*****************************************************

public property let ssavefilepath(byref p_ssavefilepath)

m_ssavefilepath = p_ssavefilepath

end property

public property get ssavefilepath()

ssavefilepath = m_ssavefilepath

end property

*****************************************************

属性: sxmlfile

状态: 可写

类型: 字符串

描述: 导入数据时,数据源xml文件(包含相对路径)

*****************************************************

public property let sxmlfile(byref p_sxmlfile)

m_sxmlfile = p_sxmlfile

end property

*****************************************************

属性: svacancycols

状态: 可写

类型: 字符串 default("")

格式 "nid,ddate" (以‘,’分隔字段)

描述: 导入数据时,指定某些字段的值可以不导入(屏蔽字段)

*****************************************************

public property let svacancycols(byref p_svacancycols)

m_svacancycols = "," & p_svacancycols & ","

end property

*****************************************************

属性: nerrcode

状态: 可读

类型: 数字 default(0)

描述: 错误代码,可通过方法geterrexegesis(byref p_nerrcode) 获得注释

*****************************************************

public property get nerrcode()

nerrcode = m_nerrcode

end property

*****************************************************

属性: sencoding

状态: 可写

类型: 字符串 default("gb2312")

描述: xml文件编码类型

*****************************************************

public property let sencoding(byref p_sencoding)

m_sencoding = p_sencoding

end property

*****************************************************

属性: simportsql

状态: 可读

类型: 字符串 default("gb2312")

描述: 导入数据时,生成的sql语句

*****************************************************

public property get simportsql()

simportsql = m_simportsql

end property

============================= 属性定义 end =============================

*****************************************************

初始化类

*****************************************************

private sub class_initialize()

server.scripttimeout = 1000

m_nerrcode_noterr = 0

m_nerrcode_notarray = 1

m_nerrcode_xmldom = 2

m_nerrcode_readdata = 3

m_nerrcode_writedata= 4

m_nerrcode_save = 5

m_nerrcode_ensfile = 6

m_nerrcode_errfile = 7

m_bissave = 1

m_bisoutput = 0

m_ssavefilepath = ""

m_ssavefilename = ""

m_sxmlfile = ""

m_svacancycols = ""

m_nerrcode = m_nerrcode_noterr

m_sencoding = "gb2312"

end sub

*****************************************************

注销类

*****************************************************

private sub class_terminate()

set m_oxmldom = nothing

set m_oxsldom = nothing

end sub

============================= 数据导出 begin =============================

*****************************************************

过程: export(byref p_odbconn)

描述: 导出数据

参数:

p_odbconn: 数据库连接对象

*****************************************************

public sub export(byref p_odbconn)

dim ni, nmaxi

dim stablename, ssql

dim sdataxml, sxslstr

dim sxmlstr

if (not isarray(m_asqldata)) then

m_nerrcode = m_nerrcode_notarray

exit sub

end if

on error resume next

set m_oxsldom = server.createobject("microsoft.xmldom")

set m_oxmldom = server.createobject("microsoft.xmldom")

if err.number <>0 then

m_nerrcode = m_nerrcode_xmldom

exit sub

end if

sxslstr = getxsl()

m_oxmldom.async = false

m_oxsldom.async = false

m_oxsldom.loadxml(sxslstr)

sdataxml = "<?xml version=1.0 encoding=" & m_sencoding & "?>"

sdataxml = sdataxml & "<database>"

nmaxi = ubound(m_asqldata, 1)

for ni=0 to nmaxi

stablename = m_asqldata(ni, 0)

if (len(stablename) > 0) then

ssql = m_asqldata(ni, 1)

sxmlstr = getdataxml(stablename, ssql, p_odbconn)

if (m_nerrcode > m_nerrcode_noterr) then

exit sub

end if

sdataxml = sdataxml & sxmlstr

end if

next

sdataxml = sdataxml & "</database>"

if (m_bisoutput) then

call responsexml(sdataxml)

end if

if (m_bissave) then

call savedataxml(sdataxml)

end if

end sub

*****************************************************

函数: getrndfilename()

描述: 获得随机名称,由当前时间和7位随机数字构成

*****************************************************

private function getrndfilename()

dim nmax, nmin

dim srnd, sdate

randomize

nmin = 1000000

nmax = 9999999

srnd = int( ( (nmax – nmin + 1) * rnd ) + nmin)

sdate = replace( replace( replace( now(), "-", "") , ":", ""), " ", "")

getrndfilename = "_" & sdate & srnd & ".xml"

end function

*****************************************************

函数: getxsl()

描述: 获得xsl文件字符串

*****************************************************

private function getxsl()

dim sxslstr

sxslstr = ""

sxslstr = sxslstr & "<?xml version=1.0 encoding=" & m_sencoding & "?>"

sxslstr = sxslstr & "<xsl:stylesheet version=1.0 xmlns:xsl=http://www.w3.org/1999/xsl/transform xmlns:s=uuid:bdc6e3f0-6da3-11d1-a2a3-00aa00c14882 xmlns:dt=uuid:c2f41010-65b3-11d1-a29f-00aa00c14882 xmlns:rs=urn:schemas-microsoft-com:rowset xmlns:z=#rowsetschema>"

sxslstr = sxslstr & "<xsl:output omit-xml-declaration=yes/>"

sxslstr = sxslstr & "<xsl:template match=/>"

sxslstr = sxslstr & "<xsl:for-each select=/xml/rs:data/z:row>"

sxslstr = sxslstr & "<xsl:element name=row>"

sxslstr = sxslstr & "<xsl:for-each select=@*>"

sxslstr = sxslstr & "<xsl:attribute name={name()}>"

sxslstr = sxslstr & "<xsl:value-of select=./>"

sxslstr = sxslstr & "</xsl:attribute>"

sxslstr = sxslstr & "</xsl:for-each>"

sxslstr = sxslstr & "</xsl:element>"

sxslstr = sxslstr & "</xsl:for-each>"

sxslstr = sxslstr & "</xsl:template>"

sxslstr = sxslstr & "</xsl:stylesheet>"

getxsl = sxslstr

end function

*****************************************************

函数: getdataxml(byref p_stablename, byref p_ssql, byref p_odbconn)

描述: 执行单条sql,获得数据转换后的xml

参数:

1.p_stablename : 表的名称

2.p_ssql : 读取数据的sql语句

3.p_odbconn : 数据库连接对象

*****************************************************

private function getdataxml(byref p_stablename, byref p_ssql, byref p_odbconn)

dim orecordset

dim sxmlstr, scleanxml

dim nensdata

on error resume next

nensdata = 0

set orecordset = p_odbconn.execute(p_ssql)

if err.number <>0 then

m_nerrcode = m_nerrcode_readdata

exit function

end if

if (not orecordset.eof) then

nensdata = 1

end if

if (nensdata = 1) then

orecordset.save m_oxmldom, 1

orecordset.close

set orecordset = nothing

scleanxml = m_oxmldom.transformnode(m_oxsldom)

sxmlstr = "<" & p_stablename & ">"

sxmlstr = sxmlstr & scleanxml

sxmlstr = sxmlstr & "</" & p_stablename & ">"

else

sxmlstr = "<" & p_stablename & "/>"

end if

getdataxml = sxmlstr

end function

*****************************************************

过程: savedataxml(byref p_sxmlstr)

描述: 保存xml格式的字符串到文件

参数:

p_sxmlstr : xml格式的字符串

*****************************************************

private sub savedataxml(byref p_sxmlstr)

dim sfileinfo

if (len(m_ssavefilename) = 0) then

m_ssavefilename = getrndfilename()

end if

if (len(m_ssavefilepath) = 0) then

sfileinfo = m_ssavefilename

else

if (right(m_ssavefilepath,1) = "/")then

sfileinfo = m_ssavefilepath & m_ssavefilename

else

sfileinfo = m_ssavefilepath & "/" & m_ssavefilename

end if

end if

m_oxmldom.loadxml(p_sxmlstr)

on error resume next

m_oxmldom.save ( server.mappath(sfileinfo) )

if err.number <>0 then

m_nerrcode = m_nerrcode_save

exit sub

end if

end sub

*****************************************************

过程: responsexml(byref p_sxmlstr)

描述: 输出xml格式的字符串到浏览器

参数:

p_sxmlstr : xml格式的字符串

*****************************************************

private sub responsexml(byref p_sxmlstr)

response.charset = m_sencoding

response.contenttype = "text/xml"

response.write p_sxmlstr

end sub

============================= 数据导出 end =============================

============================= 数据导入 begin =============================

*****************************************************

过程: import(byref p_odbconn)

描述: 导入数据

参数:

p_odbconn: 数据库连接对象

*****************************************************

public sub import(byref p_odbconn)

dim orootnode

if (len(m_sxmlfile) < 1) then

m_nerrcode = m_nerrcode_ensfile

exit sub

end if

on error resume next

set m_oxmldom = server.createobject("microsoft.xmldom")

if err.number <>0 then

m_nerrcode = m_nerrcode_xmldom

exit sub

end if

m_oxmldom.async = false

m_oxmldom.load( server.mappath(m_sxmlfile) )

if err.number <>0 then

m_nerrcode = m_nerrcode_ensfile

exit sub

end if

if (len(m_oxmldom.xml) < 1) then

m_nerrcode = m_nerrcode_errfile

exit sub

end if

set orootnode = m_oxmldom.documentelement

set m_oxmldom = nothing

m_simportsql = getimportsql(orootnode)

set orootnode = nothing

call p_odbconn.execute(m_simportsql)

if err.number <>0 then

m_nerrcode = m_nerrcode_writedata

exit sub

end if

end sub

*****************************************************

函数: getimportsql(byref p_odatabase)

描述: 获得将xml数据转换为sql后的字符串

参数:

p_odatabase : xml文件的根节点

*****************************************************

private function getimportsql(byref p_odatabase)

dim otable, orow, odatas, odata

dim scolnames, scolvalues

dim scolname

dim ssql, stransactionsql

ssql = ""

for each otable in p_odatabase.childnodes

for each orow in otable.childnodes

set odatas = orow.selectnodes("@*")

scolnames = ""

scolvalues = ""

for each odata in odatas

scolname = odata.nodename

if ( instr( lcase(cstr(m_svacancycols)), lcase(cstr("," & scolname & ",")) ) < 1) then

scolnames = scolnames & scolname & ", "

scolvalues = scolvalues & "" & odata.nodevalue & ", "

end if

next

scolnames = "(" & left(scolnames,len(scolnames)-2) & ") "

scolvalues = "(" & left(scolvalues,len(scolvalues)-2) & ") "

ssql = ssql & " insert into " & otable.nodename

ssql = ssql & " " & scolnames & " values " & scolvalues & " ; "

next

next

set odata = nothing

set odatas = nothing

set orow = nothing

set otable = nothing

stransactionsql = "set xact_abort on; "

stransactionsql = stransactionsql & " begin transaction; "

stransactionsql = stransactionsql & ssql

stransactionsql = stransactionsql & " commit transaction; "

stransactionsql = stransactionsql & " set xact_abort off; "

getimportsql = stransactionsql

end function

============================= 数据导入 end =============================

*****************************************************

函数: geterrexegesis(byref p_nerrcode)

描述: 获得错误代码的注释

参数:

p_odatabase : xml文件的根节点

*****************************************************

public function geterrexegesis(byref p_nerrcode)

dim sexegesis

dim nerrcode

nerrcode = cint(p_nerrcode)

select case (nerrcode)

case m_nerrcode_noterr

sxslstr = "运行成功!"

case m_nerrcode_notarray

sxslstr = "属性: sql语句数组 不正确!"

case m_nerrcode_xmldom

sxslstr = "不能创建xml文档,服务器必须支持msxml!"

case m_nerrcode_readdata

sxslstr = "读取数据库数据发生错误! " & "<br>"

sxslstr = sxslstr & " 请检查 " & " "

sxslstr = sxslstr & "1.数据库是否已连接 " & " "

sxslstr = sxslstr & "2.语句是否正确 "

case m_nerrcode_writedata

sxslstr = "写入数据库数据发生错误! " & "<br>"

sxslstr = sxslstr & " 请检查 " & " "

sxslstr = sxslstr & "1.数据库是否已连接 " & " "

sxslstr = sxslstr & "2.sql语句是否正确 " & "<br>"

sxslstr = sxslstr & "sql语句 " & "<br><br>"

sxslstr = sxslstr & "" & m_simportsql

case m_nerrcode_save

sxslstr = "不能保存xml文档,请检查是否对该目录或文件有 写入权限 !"

case m_nerrcode_ensfile

sxslstr = "不能读取xm数据,xml文件不存在 !"

sxslstr = sxslstr & "文件:" & m_sxmlfile

case m_nerrcode_errfile

sxslstr = "不能读取xm数据,xml文件格式错误 !"

sxslstr = sxslstr & "文件:" & m_sxmlfile

case else

sxslstr = "未知错误 !"

end select

geterrexegesis = "<br>" & sxslstr & "<br>"

end function

end class

%>

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » ADO数据与XML数据间的转换的类(ASP实现)
分享到: 更多 (0)

相关推荐

  • 暂无文章