使用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>

然后,调用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

运行效果:



运行结果:

  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

相关链接: 使用XML + XSLT进行实体类代码生成 (一)
                     使用XML + XLST进行实体类代码生成 (二) 
                     使用XML + XLST进行实体类代码生成 (三) 
                    使用XML + XLST进行实体类代码生成 (四)

posted on 2005-11-09 17:45  Lancer  阅读(2355)  评论(0编辑  收藏  举报

导航