使用XML + XSLT进行实体类代码生成 (五)
自完成了用dataset序列化的VO以后已经有几天,之所以迟迟没有贴出如何生成DO对像的模板是因为一直没有想好如何去实现这个DO。DO主要负责数据访问,但需要有哪些查询和操作方法我还是没有想太好,不过我还是把它贴出来和大家一起太讨一下。
对于DO的访问方法这里实现了:
1,查询数据
-- 获取所有数据
-- 按列查询
-- 其他的组合查询可以通过修改XML的Query节点来实现
2,新增数据。
-- 按列插入
-- 其他复杂的数据新增,需要修改XML的Insert节点来实现
3,修改数据。
4,删除数据。
-- 目前只要按照主键来删除数据。
要实现上面的操作,首先要按照 使用XML + XSLT进行实体类代码生成 (一) 得实现方法修改生成的XML格式。
1
<?xml version="1.0" encoding="utf-16"?>
2
<Schema>
3
<TableName value="Authors" />
4
<FIELDS>
5
<FIELD Name="PKId" Type="String" Identity="True" />
6
<FIELD Name="Name" Type="String" />
7
</FIELDS>
8
<PrimaryKeys>
9
<FIELD Name="PKId" Type="String" Identity="True" />
10
</PrimaryKeys>
11
<Query>
12
<Command Name="SelectAll" ReturnMode="Multiple" />
13
<Command Name="SelectByPKId" ReturnMode="Multiple">
14
<FIELD Name="PKId" Type="String" Identity="True" />
15
</Command>
16
<Command Name="SelectByName" ReturnMode="Multiple">
17
<FIELD Name="Name" Type="String" />
18
</Command>
19
</Query>
20
<Insert>
21
<Command Name="InsertAuthors">
22
<FIELD Name="PKId" Type="String" Identity="True" />
23
<FIELD Name="Name" Type="String" />
24
</Command>
25
</Insert>
26
<Update>
27
<Command Name="UpdateAuthors">
28
<FIELD Name="PKId" Type="String" Identity="True" />
29
<FIELD Name="Name" Type="String" />
30
</Command>
31
</Update>
32
<Delete>
33
<Command Name="DeleteAuthors">
34
<FIELD Name="PKId" Type="String" Identity="True" />
35
</Command>
36
</Delete>
37
</Schema>
<?xml version="1.0" encoding="utf-16"?>2
<Schema>3
<TableName value="Authors" />4
<FIELDS>5
<FIELD Name="PKId" Type="String" Identity="True" />6
<FIELD Name="Name" Type="String" />7
</FIELDS>8
<PrimaryKeys>9
<FIELD Name="PKId" Type="String" Identity="True" />10
</PrimaryKeys>11
<Query>12
<Command Name="SelectAll" ReturnMode="Multiple" />13
<Command Name="SelectByPKId" ReturnMode="Multiple">14
<FIELD Name="PKId" Type="String" Identity="True" />15
</Command>16
<Command Name="SelectByName" ReturnMode="Multiple">17
<FIELD Name="Name" Type="String" />18
</Command>19
</Query>20
<Insert>21
<Command Name="InsertAuthors">22
<FIELD Name="PKId" Type="String" Identity="True" />23
<FIELD Name="Name" Type="String" />24
</Command>25
</Insert>26
<Update>27
<Command Name="UpdateAuthors">28
<FIELD Name="PKId" Type="String" Identity="True" />29
<FIELD Name="Name" Type="String" />30
</Command>31
</Update>32
<Delete>33
<Command Name="DeleteAuthors">34
<FIELD Name="PKId" Type="String" Identity="True" />35
</Command>36
</Delete>37
</Schema>然后,调用DO实现模板:
1
<?xml version="1.0" encoding="UTF-8" ?>
2
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
3
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />
4
<xsl:template match="/Schema">Imports System.Data.SqlClient
5
Imports APJ.Common.Data
6
7
Namespace Modules.YourModule
8
Public Class do<xsl:apply-templates select="//TableName" />
9
Implements IDisposable
10
11
#Region "feilds constants"
12
<xsl:for-each select="FIELDS/FIELD">Public Const FIELD_<xsl:value-of select="@Name" /> As String = "<xsl:value-of select="@Name" />"
13
</xsl:for-each>#End Region
14
15
#Region "Command constants"
16
<xsl:for-each select="Query/Command">Private Const Command_<xsl:value-of select="@Name" /> As String = "<xsl:value-of select="@Name" />"
17
</xsl:for-each>
18
<xsl:for-each select="Insert/Command">Private Const Command_<xsl:value-of select="@Name" /> As String = "<xsl:value-of select="@Name" />"
19
</xsl:for-each>
20
<xsl:for-each select="Update/Command">Private Const Command_<xsl:value-of select="@Name" /> As String = "<xsl:value-of select="@Name" />"
21
</xsl:for-each>
22
<xsl:for-each select="Delete/Command">Private Const Command_<xsl:value-of select="@Name" /> As String = "<xsl:value-of select="@Name" />"
23
</xsl:for-each>#End Region
24
25
#Region "Constructor"
26
'----------------------------------------------------------------
27
' Sub New:
28
' Constructor.
29
'----------------------------------------------------------------
30
Public Sub New()
31
End Sub
32
33
'----------------------------------------------------------------
34
' Sub Dispose:
35
' Dispose of this object's resources.
36
'----------------------------------------------------------------
37
Public Sub Dispose() Implements IDisposable.Dispose
38
GC.SuppressFinalize(True) ' as a service to those who might inherit from us
39
End Sub
40
#End Region
41
42
#Region "Read <xsl:apply-templates select="//TableName" />"<xsl:for-each select="Query/Command">
43
<xsl:choose>
44
<xsl:when test="@ReturnMode='Multiple'">
45
Public Function get<xsl:apply-templates select="//TableName" />
46
<xsl:choose>
47
<xsl:when test="count(*)>0">By</xsl:when>
48
<xsl:otherwise>All</xsl:otherwise>
49
</xsl:choose>
50
<xsl:for-each select="FIELD">
51
<xsl:value-of select="@Name" />
52
</xsl:for-each>(<xsl:for-each select="FIELD">
53
<xsl:if test="position()!=count(../*)">Byval p<xsl:value-of select="@Name" /> as <xsl:value-of select="@Type" />, </xsl:if>
54
<xsl:if test="position() = count(../*)">Byval p<xsl:value-of select="@Name" /> as <xsl:value-of select="@Type" /></xsl:if>
55
</xsl:for-each>) As dsEntity<xsl:apply-templates select="//TableName" />
56
Dim ds<xsl:apply-templates select="//TableName" /> As New dsEntity<xsl:apply-templates select="//TableName" />
57
58
'get the sql statement
59
Dim sql As SqlType
60
61
sql = DataAccessConfiguration.GetSQL(Me.GetType.Name, Command_<xsl:value-of select="@Name" />)
62
<xsl:for-each select="FIELD"> sql.setValue(FIELD_<xsl:value-of select="@Name" />, p<xsl:value-of select="@Name" />)
63
</xsl:for-each>
64
SQLDBObject.RunProcedureByRef(sql, sql.getMapping(), ds<xsl:apply-templates select="//TableName" />, ds<xsl:apply-templates select="//TableName" />.Table_Name)
65
66
Return ds<xsl:apply-templates select="//TableName" />
67
End Function
68
</xsl:when>
69
<xsl:otherwise>
70
Public Function get<xsl:apply-templates select="//TableName" />
71
<xsl:choose>
72
<xsl:when test="count(*)>0">By</xsl:when>
73
<xsl:otherwise>All</xsl:otherwise>
74
</xsl:choose>
75
<xsl:for-each select="FIELD">
76
<xsl:value-of select="@Name" />
77
</xsl:for-each>(<xsl:for-each select="FIELD">
78
<xsl:if test="position()!=last()">Byval p<xsl:value-of select="@Name" /> as <xsl:value-of select="@Type" />, </xsl:if>
79
<xsl:if test="position() = last()">Byval p<xsl:value-of select="@Name" /> as <xsl:value-of select="@Type" /></xsl:if>
80
</xsl:for-each>) As Entity<xsl:apply-templates select="//TableName" />
81
Dim i<xsl:apply-templates select="//TableName" /> As New Entity<xsl:apply-templates select="//TableName" />
82
83
'get the sql statement
84
Dim sql As SqlType
85
86
sql = DataAccessConfiguration.GetSQL(Me.GetType.Name, Command_<xsl:value-of select="@Name" />)
87
<xsl:for-each select="FIELD"> sql.setValue(FIELD_<xsl:value-of select="@Name" />, p<xsl:value-of select="@Name" />)
88
</xsl:for-each>
89
i<xsl:apply-templates select="//TableName" /> = SQLDBObject.RunProcedureReturnObject(sql, sql.getMapping(), GetType(Entity<xsl:apply-templates select="//TableName" />))
90
91
Return i<xsl:apply-templates select="//TableName" />
92
End Function
93
</xsl:otherwise>
94
</xsl:choose>
95
</xsl:for-each> #End Region
96
97
#Region "Insert <xsl:apply-templates select="//TableName" />"<xsl:for-each select="Insert/Command">
98
Public Sub <xsl:value-of select="@Name" />(<xsl:for-each select="FIELD">
99
<xsl:if test="position()!=last()">Byval p<xsl:value-of select="@Name" /> as <xsl:value-of select="@Type" />, </xsl:if>
100
<xsl:if test="position() = last()">Byval p<xsl:value-of select="@Name" /> as <xsl:value-of select="@Type" /></xsl:if>
101
</xsl:for-each>)
102
'get the sql statement
103
Dim sql As SqlType
104
sql = DataAccessConfiguration.GetSQL(Me.GetType.Name, Command_<xsl:value-of select="@Name" />)
105
<xsl:for-each select="FIELD"> sql.setValue(FIELD_<xsl:value-of select="@Name" />, p<xsl:value-of select="@Name" />)
106
</xsl:for-each>
107
SQLDBObject.RunProcedure(sql, sql.getMapping())
108
End Sub
109
</xsl:for-each> #End Region
110
111
#Region "Update <xsl:apply-templates select="//TableName" />"<xsl:for-each select="Update/Command">
112
Public Sub <xsl:value-of select="@Name" />(<xsl:for-each select="FIELD">
113
<xsl:if test="position()!=last()">Byval p<xsl:value-of select="@Name" /> as <xsl:value-of select="@Type" />, </xsl:if>
114
<xsl:if test="position() = last()">Byval p<xsl:value-of select="@Name" /> as <xsl:value-of select="@Type" /></xsl:if>
115
</xsl:for-each>)
116
'get the sql statement
117
Dim sql As SqlType
118
sql = DataAccessConfiguration.GetSQL(Me.GetType.Name, Command_<xsl:value-of select="@Name" />)
119
<xsl:for-each select="FIELD"> sql.setValue(FIELD_<xsl:value-of select="@Name" />, p<xsl:value-of select="@Name" />)
120
</xsl:for-each>
121
SQLDBObject.RunProcedure(sql, sql.getMapping())
122
End Sub
123
</xsl:for-each> #End Region
124
125
#Region "Delete <xsl:apply-templates select="//TableName" />"<xsl:for-each select="Delete/Command">
126
Public Sub <xsl:value-of select="@Name" />(<xsl:for-each select="FIELD">
127
<xsl:if test="position()!=last()">Byval p<xsl:value-of select="@Name" /> as <xsl:value-of select="@Type" />, </xsl:if>
128
<xsl:if test="position() = last()">Byval p<xsl:value-of select="@Name" /> as <xsl:value-of select="@Type" /></xsl:if>
129
</xsl:for-each>)
130
'get the sql statement
131
Dim sql As SqlType
132
sql = DataAccessConfiguration.GetSQL(Me.GetType.Name, Command_<xsl:value-of select="@Name" />)
133
<xsl:for-each select="FIELD"> sql.setValue(FIELD_<xsl:value-of select="@Name" />, p<xsl:value-of select="@Name" />)
134
</xsl:for-each>
135
SQLDBObject.RunProcedure(sql, sql.getMapping())
136
End Sub
137
</xsl:for-each> #End Region
138
End Class
139
End Namespace</xsl:template>
140
<xsl:template match="//TableName">
141
<xsl:value-of select="@value" />
142
</xsl:template>
143
</xsl:stylesheet>
144
<?xml version="1.0" encoding="UTF-8" ?>2
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">3
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />4
<xsl:template match="/Schema">Imports System.Data.SqlClient5
Imports APJ.Common.Data6

7
Namespace Modules.YourModule8
Public Class do<xsl:apply-templates select="//TableName" />9
Implements IDisposable10
11
#Region "feilds constants"12
<xsl:for-each select="FIELDS/FIELD">Public Const FIELD_<xsl:value-of select="@Name" /> As String = "<xsl:value-of select="@Name" />"13
</xsl:for-each>#End Region14
15
#Region "Command constants"16
<xsl:for-each select="Query/Command">Private Const Command_<xsl:value-of select="@Name" /> As String = "<xsl:value-of select="@Name" />"17
</xsl:for-each>18
<xsl:for-each select="Insert/Command">Private Const Command_<xsl:value-of select="@Name" /> As String = "<xsl:value-of select="@Name" />"19
</xsl:for-each>20
<xsl:for-each select="Update/Command">Private Const Command_<xsl:value-of select="@Name" /> As String = "<xsl:value-of select="@Name" />"21
</xsl:for-each>22
<xsl:for-each select="Delete/Command">Private Const Command_<xsl:value-of select="@Name" /> As String = "<xsl:value-of select="@Name" />"23
</xsl:for-each>#End Region24

25
#Region "Constructor"26
'----------------------------------------------------------------27
' Sub New:28
' Constructor. 29
'----------------------------------------------------------------30
Public Sub New()31
End Sub32

33
'----------------------------------------------------------------34
' Sub Dispose:35
' Dispose of this object's resources.36
'----------------------------------------------------------------37
Public Sub Dispose() Implements IDisposable.Dispose38
GC.SuppressFinalize(True) ' as a service to those who might inherit from us39
End Sub40
#End Region41
42
#Region "Read <xsl:apply-templates select="//TableName" />"<xsl:for-each select="Query/Command">43
<xsl:choose>44
<xsl:when test="@ReturnMode='Multiple'">45
Public Function get<xsl:apply-templates select="//TableName" />46
<xsl:choose>47
<xsl:when test="count(*)>0">By</xsl:when>48
<xsl:otherwise>All</xsl:otherwise>49
</xsl:choose>50
<xsl:for-each select="FIELD">51
<xsl:value-of select="@Name" />52
</xsl:for-each>(<xsl:for-each select="FIELD">53
<xsl:if test="position()!=count(../*)">Byval p<xsl:value-of select="@Name" /> as <xsl:value-of select="@Type" />, </xsl:if>54
<xsl:if test="position() = count(../*)">Byval p<xsl:value-of select="@Name" /> as <xsl:value-of select="@Type" /></xsl:if>55
</xsl:for-each>) As dsEntity<xsl:apply-templates select="//TableName" />56
Dim ds<xsl:apply-templates select="//TableName" /> As New dsEntity<xsl:apply-templates select="//TableName" />57

58
'get the sql statement59
Dim sql As SqlType60

61
sql = DataAccessConfiguration.GetSQL(Me.GetType.Name, Command_<xsl:value-of select="@Name" />)62
<xsl:for-each select="FIELD"> sql.setValue(FIELD_<xsl:value-of select="@Name" />, p<xsl:value-of select="@Name" />)63
</xsl:for-each>64
SQLDBObject.RunProcedureByRef(sql, sql.getMapping(), ds<xsl:apply-templates select="//TableName" />, ds<xsl:apply-templates select="//TableName" />.Table_Name)65

66
Return ds<xsl:apply-templates select="//TableName" />67
End Function68
</xsl:when>69
<xsl:otherwise>70
Public Function get<xsl:apply-templates select="//TableName" />71
<xsl:choose>72
<xsl:when test="count(*)>0">By</xsl:when>73
<xsl:otherwise>All</xsl:otherwise>74
</xsl:choose>75
<xsl:for-each select="FIELD">76
<xsl:value-of select="@Name" />77
</xsl:for-each>(<xsl:for-each select="FIELD">78
<xsl:if test="position()!=last()">Byval p<xsl:value-of select="@Name" /> as <xsl:value-of select="@Type" />, </xsl:if>79
<xsl:if test="position() = last()">Byval p<xsl:value-of select="@Name" /> as <xsl:value-of select="@Type" /></xsl:if>80
</xsl:for-each>) As Entity<xsl:apply-templates select="//TableName" />81
Dim i<xsl:apply-templates select="//TableName" /> As New Entity<xsl:apply-templates select="//TableName" />82

83
'get the sql statement84
Dim sql As SqlType85

86
sql = DataAccessConfiguration.GetSQL(Me.GetType.Name, Command_<xsl:value-of select="@Name" />)87
<xsl:for-each select="FIELD"> sql.setValue(FIELD_<xsl:value-of select="@Name" />, p<xsl:value-of select="@Name" />)88
</xsl:for-each>89
i<xsl:apply-templates select="//TableName" /> = SQLDBObject.RunProcedureReturnObject(sql, sql.getMapping(), GetType(Entity<xsl:apply-templates select="//TableName" />))90

91
Return i<xsl:apply-templates select="//TableName" />92
End Function93
</xsl:otherwise>94
</xsl:choose>95
</xsl:for-each> #End Region96
97
#Region "Insert <xsl:apply-templates select="//TableName" />"<xsl:for-each select="Insert/Command">98
Public Sub <xsl:value-of select="@Name" />(<xsl:for-each select="FIELD">99
<xsl:if test="position()!=last()">Byval p<xsl:value-of select="@Name" /> as <xsl:value-of select="@Type" />, </xsl:if>100
<xsl:if test="position() = last()">Byval p<xsl:value-of select="@Name" /> as <xsl:value-of select="@Type" /></xsl:if>101
</xsl:for-each>)102
'get the sql statement103
Dim sql As SqlType104
sql = DataAccessConfiguration.GetSQL(Me.GetType.Name, Command_<xsl:value-of select="@Name" />)105
<xsl:for-each select="FIELD"> sql.setValue(FIELD_<xsl:value-of select="@Name" />, p<xsl:value-of select="@Name" />)106
</xsl:for-each>107
SQLDBObject.RunProcedure(sql, sql.getMapping())108
End Sub109
</xsl:for-each> #End Region110
111
#Region "Update <xsl:apply-templates select="//TableName" />"<xsl:for-each select="Update/Command">112
Public Sub <xsl:value-of select="@Name" />(<xsl:for-each select="FIELD">113
<xsl:if test="position()!=last()">Byval p<xsl:value-of select="@Name" /> as <xsl:value-of select="@Type" />, </xsl:if>114
<xsl:if test="position() = last()">Byval p<xsl:value-of select="@Name" /> as <xsl:value-of select="@Type" /></xsl:if>115
</xsl:for-each>)116
'get the sql statement117
Dim sql As SqlType118
sql = DataAccessConfiguration.GetSQL(Me.GetType.Name, Command_<xsl:value-of select="@Name" />)119
<xsl:for-each select="FIELD"> sql.setValue(FIELD_<xsl:value-of select="@Name" />, p<xsl:value-of select="@Name" />)120
</xsl:for-each>121
SQLDBObject.RunProcedure(sql, sql.getMapping())122
End Sub123
</xsl:for-each> #End Region124
125
#Region "Delete <xsl:apply-templates select="//TableName" />"<xsl:for-each select="Delete/Command">126
Public Sub <xsl:value-of select="@Name" />(<xsl:for-each select="FIELD">127
<xsl:if test="position()!=last()">Byval p<xsl:value-of select="@Name" /> as <xsl:value-of select="@Type" />, </xsl:if>128
<xsl:if test="position() = last()">Byval p<xsl:value-of select="@Name" /> as <xsl:value-of select="@Type" /></xsl:if>129
</xsl:for-each>)130
'get the sql statement131
Dim sql As SqlType132
sql = DataAccessConfiguration.GetSQL(Me.GetType.Name, Command_<xsl:value-of select="@Name" />)133
<xsl:for-each select="FIELD"> sql.setValue(FIELD_<xsl:value-of select="@Name" />, p<xsl:value-of select="@Name" />)134
</xsl:for-each>135
SQLDBObject.RunProcedure(sql, sql.getMapping())136
End Sub137
</xsl:for-each> #End Region138
End Class139
End Namespace</xsl:template>140
<xsl:template match="//TableName">141
<xsl:value-of select="@value" />142
</xsl:template>143
</xsl:stylesheet>144

运行效果:
运行结果:
1
Imports System.Data.SqlClient
2
Imports APJ.Common.Data
3
4
Namespace Modules.YourModule
5
Public Class doAuthors
6
Implements IDisposable
7
8
feilds constants
12
13
Command constants
21
22
Constructor
38
39
Read Authors
84
85
Insert Authors
99
100
Update Authors
114
115
Delete Authors
128
End Class
129
End Namespace
Imports System.Data.SqlClient2
Imports APJ.Common.Data3

4
Namespace Modules.YourModule5
Public Class doAuthors6
Implements IDisposable7
8
feilds constants12
13
Command constants21

22
Constructor38
39
Read Authors84
85
Insert Authors99
100
Update Authors114
115
Delete Authors128
End Class129
End Namespace相关链接: 使用XML + XSLT进行实体类代码生成 (一)
使用XML + XLST进行实体类代码生成 (二)
使用XML + XLST进行实体类代码生成 (三)
使用XML + XLST进行实体类代码生成 (四)

浙公网安备 33010602011771号