当对现有数据库的数据进行分析时,经常需要对某一部分的数据进行分析.此时,使用
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) > 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>
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 & "<xsl:output omit-xml-declaration="yes"></xsl:output>"
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="."></xsl:value-of>"
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>
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