| 贵 州 学 习 网 |
|
当对现有数据库的数据进行分析时,经常需要对某一部分的数据进行分析.此时,使用 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 & " 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 & "" & 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 = "读取数据库数据发生错误! " & " " 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