ADO数据与XML数据间的转换的类

当对现有数据库的数据进行分析时,经常需要对某一部分的数据进行分析.此时,使用
1.SQL查询分析器?
但其往往不直观,查找某个关键字又需要重新执行新的SQL.
2.SQLXML模板?
但又不一定有权限建立新的虚拟目录,且某些SQL语句SQLXML模板不支持

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

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

一个调用类的例子:
example.asp

 1   
 2Dim aSQL(1,1)   
 3Dim oXMLData 
 4
 5'====== 连接数据库过程 ======   
 6'获得数据库连接对象 oDbConn   
 7'====== 连接数据库过程 ====== 
 8
 9aSQL(0,0) = "PubLable"   
10aSQL(0,1) = "Select * from PubLabel where cLabelName like '%abc%' Order by nLabelID"   
11aSQL(1,0) = "PubUser"   
12aSQL(1,1) = "Select * from PubUser where cUserName like '%abc%' Order by nUserID" 
13
14set oXMLData = New TransformData 
15
16Call Export()   
17'Call Import()   
18set oXMLData = nothing 
19
20  
21' // 当对象属性有默认值(default())时,可以不用在赋值 
22
23Sub Export() ' // 导出数据 
24
25oXMLData.aSQlData = aSQL   
26' 必须 2维SQL语句数组   
27  
28oXMLData.bIsSave = 1   
29' default(1) 是否保存为XML文件   
30  
31oXMLData.bIsOutput = 1   
32' default(0) 是否显示XML数据   
33  
34oXMLData.sSaveFileName = "Data.xml"   
35' default(当前时间加随机数) 如果保存XML数据,XML文件名称   
36  
37oXMLData.sSaveFilePath = ""   
38' default("") 如果保存XML数据,XML文件路径(相对路径)   
39  
40oXMLData.sEncoding = "gb2312"   
41' default("gb2312") XML文件编码类型 
42
43oXMLData.Export (oDbConn)   
44' // 导出数据过程 
45
46IF (oXMLData.nErrCode<>0) Then ' nErrCode(错误代码)为0,运行成功   
47Response.Write oXMLData.GetErrExegesis(oXMLData.nErrCode)   
48'nErrCode(错误代码),通过方法GetErrExegesis() 获得注释   
49End IF 
50
51End Sub 
52
53Sub Import() ' // 导入数据 
54
55oXMLData.sXMLFile = "Data.xml" ' 必须 数据源XML文件(包含相对路径) 
56
57oXMLData.sVacancyCols = "nLabelID" ' 必须 指定某些字段的值可以不导入(屏蔽字段)   
58' 格式 "nID,dDate" (以‘,’分隔字段) 
59
60oXMLData.Import (oDbConn) 
61
62IF (oXMLData.nErrCode=0) Then   
63Response.Write "数据导入成功!"   
64Else   
65Response.Write oXMLData.GetErrExegesis(oXMLData.nErrCode)   
66End IF   
67  
68End Sub   

类的代码:
TransformData.asp

  1   
  2Class TransformData 
  3
  4'*****************************************************   
  5' Copyright (c) 2003   
  6' 创 建 人 : moonpiazza   
  7' 日 期 : 2003.5.21   
  8' 描 述 : ADO数据与XML数据间的转换(ASP实现)   
  9' 版 本 : 1.0   
 10' 功 能 : ADO数据(表的基本数据)与XML数据间的相互转换   
 11' 待 改 进 : 表间数据的关联性(通用),数据量大时速度问题   
 12'   
 13' 版 权 : 欢迎改进,翻版不究 :_)   
 14'   
 15'***************************************************** 
 16
 17  
 18'*****************************************************   
 19' 公共方法: Export, Import, GetErrExegesis   
 20'***************************************************** 
 21
 22'============================= 公共变量 End =============================   
 23Private m_oXMLDOM   
 24Private m_oXSLDOM   
 25'============================= 公共变量 Begin ============================= 
 26
 27'============================= 错误代码定义 Begin =============================   
 28Private m_nErrCode_NotArray   
 29Private m_nErrCode_XMLDOM   
 30Private m_nErrCode_ReadData   
 31Private m_nErrCode_WriteData   
 32Private m_nErrCode_Save   
 33Private m_nErrCode_EnsFile   
 34Private m_nErrCode_ErrFile   
 35'============================= 错误代码定义 End ============================= 
 36
 37'============================= 属性定义 Begin ============================= 
 38
 39Private m_aSQlData   
 40Private m_bIsSave   
 41Private m_bIsOutput   
 42Private m_sSaveFileName   
 43Private m_sSaveFilePath   
 44Private m_sXMLFile   
 45Private m_sVacancyCols   
 46Private m_nErrCode   
 47Private m_sEncoding   
 48Private m_sImportSQL 
 49
 50'*****************************************************   
 51' 属性: aSQlData   
 52' 状态: 可写   
 53' 类型: 2维数组   
 54' 描述: SQL语句数组,1维是表名称,2维是相应SQL语句   
 55'*****************************************************   
 56Public Property Let aSQlData(ByRef p_aSQlData)   
 57m_aSQlData = p_aSQlData   
 58End Property 
 59
 60  
 61'*****************************************************   
 62' 属性: bIsSave   
 63' 状态: 可写   
 64' 类型: 数字(0,1) default(1)   
 65' 描述: 导出数据时,是否保存为XML文件   
 66'*****************************************************   
 67Public Property Let bIsSave(ByRef p_bIsSave)   
 68m_bIsSave = Cint(p_bIsSave)   
 69End Property 
 70
 71  
 72'*****************************************************   
 73' 属性: bIsOutput   
 74' 状态: 可写   
 75' 类型: 数字(0,1) default(0)   
 76' 描述: 导出数据时,是否显示XML数据   
 77'*****************************************************   
 78Public Property Let bIsOutput(ByRef p_bIsOutput)   
 79m_bIsOutput = Cint(p_bIsOutput)   
 80End Property 
 81
 82  
 83'*****************************************************   
 84' 属性: sSaveFileName   
 85' 状态: 可写,可读   
 86' 类型: 字符串 default(GetRndFileName())   
 87' 描述: 导出数据时,如果保存XML数据,XML文件名称   
 88'*****************************************************   
 89Public Property Let sSaveFileName(ByRef p_sSaveFileName)   
 90m_sSaveFileName = p_sSaveFileName   
 91End Property 
 92
 93Public Property Get sSaveFileName()   
 94sSaveFileName = m_sSaveFileName   
 95End Property 
 96
 97  
 98'*****************************************************   
 99' 属性: sSaveFilePath   
100' 状态: 可写,可读   
101' 类型: 字符串 default("")   
102' 描述: 导出数据时,如果保存XML数据,XML文件路径(相对路径)   
103'*****************************************************   
104Public Property Let sSaveFilePath(ByRef p_sSaveFilePath)   
105m_sSaveFilePath = p_sSaveFilePath   
106End Property 
107
108Public Property Get sSaveFilePath()   
109sSaveFilePath = m_sSaveFilePath   
110End Property 
111
112  
113'*****************************************************   
114' 属性: sXMLFile   
115' 状态: 可写   
116' 类型: 字符串   
117' 描述: 导入数据时,数据源XML文件(包含相对路径)   
118'*****************************************************   
119Public Property Let sXMLFile(ByRef p_sXMLFile)   
120m_sXMLFile = p_sXMLFile   
121End Property 
122
123  
124'*****************************************************   
125' 属性: sVacancyCols   
126' 状态: 可写   
127' 类型: 字符串 default("")   
128' 格式 "nID,dDate" (以‘,’分隔字段)   
129' 描述: 导入数据时,指定某些字段的值可以不导入(屏蔽字段)   
130'*****************************************************   
131Public Property Let sVacancyCols(ByRef p_sVacancyCols)   
132m_sVacancyCols = "," & p_sVacancyCols & ","   
133End Property 
134
135  
136'*****************************************************   
137' 属性: nErrCode   
138' 状态: 可读   
139' 类型: 数字 default(0)   
140' 描述: 错误代码,可通过方法GetErrExegesis(ByRef p_nErrCode) 获得注释   
141'*****************************************************   
142Public Property Get nErrCode()   
143nErrCode = m_nErrCode   
144End Property 
145
146  
147'*****************************************************   
148' 属性: sEncoding   
149' 状态: 可写   
150' 类型: 字符串 default("gb2312")   
151' 描述: XML文件编码类型   
152'*****************************************************   
153Public Property Let sEncoding(ByRef p_sEncoding)   
154m_sEncoding = p_sEncoding   
155End Property 
156
157  
158'*****************************************************   
159' 属性: sImportSQL   
160' 状态: 可读   
161' 类型: 字符串 default("gb2312")   
162' 描述: 导入数据时,生成的SQL语句   
163'*****************************************************   
164Public Property Get sImportSQL()   
165sImportSQL = m_sImportSQL   
166End Property   
167'============================= 属性定义 End ============================= 
168
169'*****************************************************   
170' 初始化类   
171'*****************************************************   
172Private Sub Class_Initialize() 
173
174Server.ScriptTimeout = 1000 
175
176m_nErrCode_NotErr = 0   
177m_nErrCode_NotArray = 1   
178m_nErrCode_XMLDOM = 2   
179m_nErrCode_ReadData = 3   
180m_nErrCode_WriteData= 4   
181m_nErrCode_Save = 5   
182m_nErrCode_EnsFile = 6   
183m_nErrCode_ErrFile = 7 
184
185  
186m_bIsSave = 1   
187m_bIsOutput = 0   
188m_sSaveFilePath = ""   
189m_sSaveFileName = ""   
190m_sXMLFile = ""   
191m_sVacancyCols = ""   
192m_nErrCode = m_nErrCode_NotErr   
193m_sEncoding = "gb2312" 
194
195End Sub 
196
197  
198'*****************************************************   
199' 注销类   
200'*****************************************************   
201Private Sub Class_Terminate()   
202Set m_oXMLDOM = Nothing   
203Set m_oXSLDOM = Nothing   
204End Sub 
205
206  
207'============================= 数据导出 Begin ============================= 
208
209'*****************************************************   
210' 过程: Export(ByRef p_oDbConn)   
211' 描述: 导出数据   
212' 参数:   
213' p_oDbConn: 数据库连接对象   
214'   
215'*****************************************************   
216Public Sub Export(ByRef p_oDbConn)   
217Dim nI, nMaxI   
218Dim sTableName, sSQL   
219Dim sDataXML, sXSLStr   
220Dim sXMLStr   
221  
222If (Not IsArray(m_aSQlData)) Then   
223m_nErrCode = m_nErrCode_NotArray   
224Exit Sub   
225End If 
226
227ON ERROR RESUME NEXT 
228
229Set m_oXSLDOM = Server.CreateObject("Microsoft.XMLDOM")   
230Set m_oXMLDOM = Server.CreateObject("Microsoft.XMLDOM")   
231  
232If Err.Number <>0 Then   
233m_nErrCode = m_nErrCode_XMLDOM   
234Exit Sub   
235End If   
236  
237sXSLStr = GetXSL() 
238
239m_oXMLDOM.async = false   
240m_oXSLDOM.async = false   
241m_oXSLDOM.loadxml(sXSLStr) 
242
243sDataXML = "
244<?xml version='1.0' encoding='" & m_sEncoding & "'?>
245"   
246sDataXML = sDataXML & "

<database>"

nMaxI = Ubound(m_aSQlData, 1)

For nI=0 To nMaxI

sTableName = m_aSQlData(nI, 0)

If (Len(sTableName) &gt; 0) Then

sSQL = m_aSQlData(nI, 1)
sXMLStr = GetDataXML(sTableName, sSQL, p_oDbConn)

IF (m_nErrCode &gt; m_nErrCode_NotErr) Then
Exit Sub
End IF

sDataXML = sDataXML &amp; sXMLStr
End If

Next

sDataXML = sDataXML &amp; "</database>

 1"   
 2  
 3IF (m_bIsOutput) Then   
 4Call ResponseXML(sDataXML)   
 5End IF   
 6  
 7IF (m_bIsSave) Then   
 8Call SaveDataXML(sDataXML)   
 9End IF   
10  
11End Sub 
12
13  
14'*****************************************************   
15' 函数: GetRndFileName()   
16' 描述: 获得随机名称,由当前时间和7位随机数字构成   
17'*****************************************************   
18Private Function GetRndFileName()   
19Dim nMax, nMin   
20Dim sRnd, sDate 
21
22Randomize 
23
24nMin = 1000000   
25nMax = 9999999 
26
27sRnd = Int( ( (nMax - nMin + 1) * Rnd ) + nMin)   
28sDate = Replace( Replace( Replace( now(), "-", "") , ":", ""), " ", "") 
29
30GetRndFileName = "_" & sDate & sRnd & ".xml"   
31  
32End Function 
33
34  
35'*****************************************************   
36' 函数: GetXSL()   
37' 描述: 获得XSL文件字符串   
38'*****************************************************   
39Private Function GetXSL()   
40Dim sXSLStr 
41
42sXSLStr = ""   
43sXSLStr = sXSLStr & "
44<?xml version='1.0' encoding='" & m_sEncoding & "'?>
45"   
46sXSLStr = sXSLStr & "

<xsl:stylesheet version="1.0" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:z="#RowsetSchema">"
sXSLStr = sXSLStr &amp; "<xsl:output omit-xml-declaration="yes"></xsl:output>"
sXSLStr = sXSLStr &amp; "<xsl:template match="/">"
sXSLStr = sXSLStr &amp; "<xsl:for-each select="/xml/rs:data/z:row">"
sXSLStr = sXSLStr &amp; "<xsl:element name="Row">"
sXSLStr = sXSLStr &amp; "<xsl:for-each select="@*">"
sXSLStr = sXSLStr &amp; "<xsl:attribute name="{name()}">"
sXSLStr = sXSLStr &amp; "<xsl:value-of select="."></xsl:value-of>"
sXSLStr = sXSLStr &amp; "</xsl:attribute>"
sXSLStr = sXSLStr &amp; "</xsl:for-each>"
sXSLStr = sXSLStr &amp; "</xsl:element>"
sXSLStr = sXSLStr &amp; "</xsl:for-each>"
sXSLStr = sXSLStr &amp; "</xsl:template>"
sXSLStr = sXSLStr &amp; "</xsl:stylesheet>

  1" 
  2
  3GetXSL = sXSLStr   
  4  
  5End Function 
  6
  7  
  8'*****************************************************   
  9' 函数: GetDataXML(ByRef p_sTableName, ByRef p_sSQL, ByRef p_oDbConn)   
 10' 描述: 执行单条SQL,获得数据转换后的XML   
 11' 参数:   
 12' 1.p_sTableName : 表的名称   
 13' 2.p_sSQL : 读取数据的SQl语句   
 14' 3.p_oDbConn : 数据库连接对象   
 15'   
 16'*****************************************************   
 17Private Function GetDataXML(ByRef p_sTableName, ByRef p_sSQL, ByRef p_oDbConn)   
 18Dim oRecordset   
 19Dim sXMLStr, sCleanXML   
 20Dim nEnsData 
 21
 22ON ERROR RESUME NEXT 
 23
 24nEnsData = 0 
 25
 26Set oRecordset = p_oDbConn.Execute(p_sSQL)   
 27If Err.Number <>0 Then   
 28m_nErrCode = m_nErrCode_ReadData   
 29Exit Function   
 30End If 
 31
 32IF (Not oRecordset.eof) Then   
 33nEnsData = 1   
 34End IF   
 35  
 36IF (nEnsData = 1) Then   
 37oRecordset.save m_oXMLDOM, 1   
 38  
 39oRecordset.close   
 40Set oRecordset = Nothing 
 41
 42sCleanXML = m_oXMLDOM.transformNode(m_oXSLDOM) 
 43
 44sXMLStr = "<" & p_sTableName & ">"   
 45sXMLStr = sXMLStr & sCleanXML   
 46sXMLStr = sXMLStr & "
 47<!--" & p_sTableName & "-->
 48"   
 49Else   
 50sXMLStr = "<" & p_sTableName & "/>"   
 51End IF   
 52
 53
 54  
 55GetDataXML = sXMLStr 
 56
 57End Function 
 58
 59  
 60'*****************************************************   
 61' 过程: SaveDataXML(ByRef p_sXMLStr)   
 62' 描述: 保存XML格式的字符串到文件   
 63' 参数:   
 64' p_sXMLStr : XML格式的字符串   
 65'*****************************************************   
 66Private Sub SaveDataXML(ByRef p_sXMLStr)   
 67Dim sFileInfo 
 68
 69If (Len(m_sSaveFileName) = 0) Then   
 70m_sSaveFileName = GetRndFileName()   
 71End If   
 72  
 73If (Len(m_sSaveFilePath) = 0) Then   
 74sFileInfo = m_sSaveFileName   
 75Else   
 76IF (Right(m_sSaveFilePath,1) = "/")Then   
 77sFileInfo = m_sSaveFilePath & m_sSaveFileName   
 78Else   
 79sFileInfo = m_sSaveFilePath & "/" & m_sSaveFileName   
 80End IF   
 81End If 
 82
 83m_oXMLDOM.loadxml(p_sXMLStr) 
 84
 85ON ERROR RESUME NEXT 
 86
 87m_oXMLDOM.save ( Server.MapPath(sFileInfo) )   
 88If Err.Number <>0 Then   
 89m_nErrCode = m_nErrCode_Save   
 90Exit Sub   
 91End If 
 92
 93End Sub 
 94
 95'*****************************************************   
 96' 过程: ResponseXML(ByRef p_sXMLStr)   
 97' 描述: 输出XML格式的字符串到浏览器   
 98' 参数:   
 99' p_sXMLStr : XML格式的字符串   
100'*****************************************************   
101Private Sub ResponseXML(ByRef p_sXMLStr)   
102Response.CharSet = m_sEncoding   
103Response.ContentType = "text/xml"   
104Response.write p_sXMLStr   
105End Sub 
106
107  
108'============================= 数据导出 End ============================= 
109
110'============================= 数据导入 Begin ============================= 
111
112'*****************************************************   
113' 过程: Import(ByRef p_oDbConn)   
114' 描述: 导入数据   
115' 参数:   
116' p_oDbConn: 数据库连接对象   
117'   
118'*****************************************************   
119Public Sub Import(ByRef p_oDbConn)   
120Dim oRootNode 
121
122If (Len(m_sXMLFile) < 1) Then   
123m_nErrCode = m_nErrCode_EnsFile   
124Exit Sub   
125End If 
126
127ON ERROR RESUME NEXT 
128
129Set m_oXMLDOM = Server.CreateObject("Microsoft.XMLDOM")   
130  
131If Err.Number <>0 Then   
132m_nErrCode = m_nErrCode_XMLDOM   
133Exit Sub   
134End If   
135  
136m_oXMLDOM.async = false 
137
138m_oXMLDOM.load( Server.MapPath(m_sXMLFile) )   
139If Err.Number <>0 Then   
140m_nErrCode = m_nErrCode_EnsFile   
141Exit Sub   
142End If 
143
144If (Len(m_oXMLDOM.xml) < 1) Then   
145m_nErrCode = m_nErrCode_ErrFile   
146Exit Sub   
147End If 
148
149Set oRootNode = m_oXMLDOM.documentElement   
150Set m_oXMLDOM = Nothing   
151  
152m_sImportSQL = GetImportSQL(oRootNode) 
153
154Set oRootNode = Nothing 
155
156Call p_oDbConn.Execute(m_sImportSQL)   
157If Err.Number <>0 Then   
158m_nErrCode = m_nErrCode_WriteData   
159Exit Sub   
160End If   
161  
162End Sub 
163
164  
165'*****************************************************   
166' 函数: GetImportSQL(ByRef p_oDataBase)   
167' 描述: 获得将XML数据转换为SQL后的字符串   
168' 参数:   
169' p_oDataBase : XML文件的根节点   
170'   
171'*****************************************************   
172Private Function GetImportSQL(ByRef p_oDataBase)   
173Dim oTable, oRow, oDatas, oData   
174Dim sColNames, sColValues   
175Dim sColName   
176Dim sSQL 
177
178  
179sSQL = "" 
180
181For Each oTable In p_oDataBase.childNodes   
182  
183For Each oRow In oTable.childNodes 
184
185Set oDatas = oRow.selectNodes("@*") 
186
187sColNames = ""   
188sColValues = "" 
189
190For Each oData In oDatas 
191
192sColName = oData.nodeName 
193
194If ( Instr( Lcase(Cstr(m_sVacancyCols)), Lcase(Cstr("," & sColName & ",")) ) < 1) Then   
195sColNames = sColNames & sColName & ", "   
196sColValues = sColValues & "'" & oData.nodeValue & "', "   
197End If   
198  
199Next 
200
201sColNames = "(" & Left(sColNames,Len(sColNames)-2) & ") "   
202sColValues = "(" & Left(sColValues,Len(sColValues)-2) & ") " 
203
204sSQL = sSQL & " Insert Into " & oTable.nodeName   
205sSQL = sSQL & " " & sColNames & " Values " & sColValues & " ; " 
206
207Next 
208
209Next 
210
211Set oData = Nothing   
212Set oDatas = Nothing   
213Set oRow = Nothing   
214Set oTable = Nothing 
215
216GetImportSQL = sSQL   
217End Function 
218
219'============================= 数据导入 End ============================= 
220
221  
222'*****************************************************   
223' 函数: GetErrExegesis(ByRef p_nErrCode)   
224' 描述: 获得错误代码的注释   
225' 参数:   
226' p_oDataBase : XML文件的根节点   
227'   
228'*****************************************************   
229Public Function GetErrExegesis(ByRef p_nErrCode)   
230Dim sExegesis   
231Dim nErrCode 
232
233nErrCode = Cint(p_nErrCode)   
234  
235Select Case (nErrCode) 
236
237Case m_nErrCode_NotErr   
238sXSLStr = "运行成功!" 
239
240Case m_nErrCode_NotArray   
241sXSLStr = "属性: SQL语句数组 不正确!" 
242
243Case m_nErrCode_XMLDOM   
244sXSLStr = "不能创建XML文档,服务器必须支持MSXML!" 
245
246Case m_nErrCode_ReadData   
247sXSLStr = "读取数据库数据发生错误! " & "

<br/>

1"   
2sXSLStr = sXSLStr & " 请检查 " & " "   
3sXSLStr = sXSLStr & "1.数据库是否已连接 " & " "   
4sXSLStr = sXSLStr & "2.语句是否正确 " 
5
6Case m_nErrCode_WriteData   
7sXSLStr = "写入数据库数据发生错误! " & "

<br/>

1"   
2sXSLStr = sXSLStr & " 请检查 " & " "   
3sXSLStr = sXSLStr & "1.数据库是否已连接 " & " "   
4sXSLStr = sXSLStr & "2.SQL语句是否正确 " & "

<br/>

1"   
2sXSLStr = sXSLStr & "SQL语句 " & "

<br/>

<br/>

 1"   
 2sXSLStr = sXSLStr & "" & m_sImportSQL   
 3  
 4Case m_nErrCode_Save   
 5sXSLStr = "不能保存XML文档,请检查是否对该目录或文件有' 写入权限 ' !" 
 6
 7Case m_nErrCode_EnsFile   
 8sXSLStr = "不能读取XM数据,XML文件不存在 ' !"   
 9sXSLStr = sXSLStr & "文件:" & m_sXMLFile   
10
11
12Case m_nErrCode_ErrFile   
13sXSLStr = "不能读取XM数据,XML文件格式错误 ' !"   
14sXSLStr = sXSLStr & "文件:" & m_sXMLFile   
15  
16Case Else   
17sXSLStr = "未知错误 !" 
18
19End Select   
20
21
22GetErrExegesis = "

<br/>

1" & sXSLStr & "

<br/>

1"   
2  
3End Function 
4
5End Class   
Published At
Categories with Web编程
Tagged with
comments powered by Disqus