使用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>
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
5Imports APJ.Common.Data
6
7Namespace 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
139End Namespace</xsl:template>
140 <xsl:template match="//TableName">
141 <xsl:value-of select="@value" />
142 </xsl:template>
143</xsl:stylesheet>
144
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
5Imports APJ.Common.Data
6
7Namespace 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
139End Namespace</xsl:template>
140 <xsl:template match="//TableName">
141 <xsl:value-of select="@value" />
142 </xsl:template>
143</xsl:stylesheet>
144
运行效果:
运行结果:
1Imports System.Data.SqlClient
2Imports APJ.Common.Data
3
4Namespace 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
129End Namespace
2Imports APJ.Common.Data
3
4Namespace 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
129End Namespace
相关链接: 使用XML + XSLT进行实体类代码生成 (一)
使用XML + XLST进行实体类代码生成 (二)
使用XML + XLST进行实体类代码生成 (三)
使用XML + XLST进行实体类代码生成 (四)