当对现有数据库的数据进行分析时,经常需要对某一部分的数据进行分析.此时,使用
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
%>
