学习网考试学习资料

Gzu521.com

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

ASP教程   点击:次   发布时间:2005-7-17   【字体: 】   来源:
贵 州 学 习 网
当对现有数据库的数据进行分析时,经常需要对某一部分的数据进行分析.此时,使用
1.sql查询分析器?
但其往往不直观,查找某个关键字又需要重新执行新的sql.
2.sqlxml模板?
但又不一定有权限建立新的虚拟目录,且某些sql语句sqlxml模板不支持

数据拆离时也有相似问题。
尤其当不同网络,不同环境,需要重新导入数据,进行分析或拆离,困难尤为明显。
能不能有一种方法,可以将数据脱离于数据库进行分析,需要时再导入到数据库中?
xml是个很好的选择!
ado本身支持数据到xml的转换,只需要对其格式进行解析,成为自己的xml文件通用格式,就可以进行本地分析
而对通用xml格式进行数据库映射,就可完成数据重新导入数据库的工作.

下面是一个ado数据(表的基本数据)与xml数据间的相互转换的类(asp实现),初步完成表数据的导入、导出。
通用表间关系映射(通过xsd描述),考虑之中,希望各位赐教指点,不胜感激.

一个调用类的例子:
example.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 = ""
sdataxml = sdataxml & ""

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 & "
"

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 & ""
sxslstr = sxslstr & "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 & ""
sxslstr = sxslstr & ""
sxslstr = sxslstr & ""
sxslstr = sxslstr & ""
sxslstr = sxslstr & ""
sxslstr = sxslstr & ""
sxslstr = sxslstr & ""
sxslstr = sxslstr & ""
sxslstr = sxslstr & ""
sxslstr = sxslstr & ""
sxslstr = sxslstr & ""
sxslstr = sxslstr & ""
sxslstr = sxslstr & ""

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 & ""
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 = "读取数据库数据发生错误! " & "
"
   sxslstr = sxslstr & " 请检查 " & " "
   sxslstr = sxslstr & "1.数据库是否已连接 " & " "
   sxslstr = sxslstr & "2.语句是否正确 " 

  case m_nerrcode_writedata
   sxslstr = "写入数据库数据发生错误! " & "
"
   sxslstr = sxslstr & " 请检查 " & " "
   sxslstr = sxslstr & "1.数据库是否已连接 " & " "
   sxslstr = sxslstr & "2.sql语句是否正确 " & "

   sxslstr = sxslstr & "sql语句 " & "

"
   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 = "
" & sxslstr & "
"

end function

end class
%>

责任编辑:gzu521

网络编程分类
ASP教程
.Net教程
Java教程
PHP教程
数据库基础
ACCESS教程
SQL Server教程
MySQL教程
Oracle教程
分类推荐信息
更多...
大类最新文章
更多...