C#分析数据库结构,使用XSL模板自动生成代码

看过一些自动生成"笨"代码的工具,小弟也自己做了一个,使用C#分析数据库结构,并使用XSL来 生成关于数据库表结构的代码,只需修改配置文件dbxmlcfg.xml中OLEDB数据库连接字符串就可 更新数据库连接属性,XSL高手还可以自己来编制代码生成模块, 模板文件为temp_模板名.xsl。 下图为用户界面


####################### index.htm   ##################################
<html>
    <head>
        <TITLE>分析数据库结构,自动生成代码</TITLE>
        <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    </head>
    <frameset cols="237,767" rows="*">
        <frame src="dbxml.aspx">
        <frame name="code" src="about:blank">
    </frameset>
</html>
########################### dbxml.aspx 文件内容,该文件没有C#代码文件 #############
<script language="C#" runat="server">
    System.Xml.XmlDocument myCfgXML = new System.Xml.XmlDocument();
    // 获得系统配置字符串
    string GetAppConfig(string strKey)
    {
        System.Xml.XmlElement cfgElement myCfgXML.SelectSingleNode ("//setting[@key='" + strKey + "']" )
            as System.Xml.XmlElement ;
        if( cfgElement == null )
            return "";
        else
            return cfgElement.InnerText ;
    }
   
    // 判断字符串是否是空白字符串
    bool isBlankString(string strText )
    {
        if(strText != null)
        {
            int iCount;
            for(iCount=0;iCount<strText.Length ;iCount++)
            {
                if(System.Char.IsWhiteSpace ( strText[iCount])==false)
                    return false;
            }
        }
        return true;
    }
    void Page_Load(Object sender, EventArgs e)
    {
        // 加载系统配置文件
        myCfgXML.Load(this.MapPath(".") + "\\dbxmlcfg.xml");
        string strType    = this.Request["type"];
        string strXSL    = "main.xml";
       
        if(strType == null)
            strType = "querytable";
        System.Xml.XmlDocument myDoc = new System.Xml.XmlDocument();
        myDoc.LoadXml("<dbxml />");
        string strConnection = GetAppConfig("conndbxml");
        System.Text.Encoding myEncode = System.Text.Encoding.GetEncoding(936);
                           
        if(isBlankString(strConnection)==false)
        {
            using(System.Data.OleDb.OleDbConnection myConn = new System.Data.OleDb.OleDbConnection(strConnection))
            {
                myConn.Open();
                if(myConn.State == System.Data.ConnectionState.Open )
                {
                    string strSQL = GetAppConfig(strType + "_" + myConn.Provider);
                    if(isBlankString(strSQL)==false)
                    {
                        using(System.Data.OleDb.OleDbCommand myCmd = myConn.CreateCommand())
                        {
                            string strTableName = null;
                            if(strType.Equals("queryfield"))
                            {
                                // 修正SQL语句
                                string strTableList = this.Request.Form["tablelist"];
                                string []strTables = strTableList.Split(",".ToCharArray());
                                strXSL = System.Web.HttpUtility.UrlPathEncode(this.Request.Form["template"] ) + ".xml";
                                strTableList = null;
                                for(int iCount = 0 ; iCount < strTables.Length ; iCount ++ )
                                {
                                    if(isBlankString(strTables[iCount])==false)
                                    {
                                        if(strTableList == null)
                                            strTableList = "'" + strTables[iCount] + "'";
                                        else
                                            strTableList = strTableList + ",'" + strTables[iCount] + "'";
                                    }
                                }
                                strSQL = strSQL.Replace("#tablelist", strTableList);
                                myCmd.CommandText                    = strSQL ;
                                string strLastTableName                = null;
                                string strFieldName                    = null;
                                System.Xml.XmlElement TableElement    = null;
                                System.Data.OleDb.OleDbDataReader myReader = myCmd.ExecuteReader();
                                while(myReader.Read())
                                {
                                    strTableName = myReader[0].ToString().ToUpper();
                                    if(strTableName.Equals(strLastTableName)==false)
                                    {
                                        // 填充表说明元素
                                        strLastTableName    = strTableName ;
                                        TableElement        = myDoc.CreateElement("table");
                                        TableElement.SetAttribute("tablename", strTableName);
                                        myDoc.DocumentElement.AppendChild(TableElement);
                                    }
                                    // 填充字段说明元素
                                    System.Xml.XmlElement FieldElement = myDoc.CreateElement("field");
                                        FieldElement.SetAttribute("fieldname",    myReader[1].ToString());
                                        FieldElement.SetAttribute("fieldtype",    myReader[2].ToString());
                                        FieldElement.SetAttribute("fieldwidth",    myReader[3].ToString());
                                        FieldElement.SetAttribute("isstring",  (myReader[2].ToString().ToUpper().IndexOf("CHAR")>=0?"1":"0"));
                                        strFieldName = myReader[1].ToString();
                                        int iLen = myEncode.GetByteCount(strFieldName);
                                        if(iLen < 20)
                                            FieldElement.SetAttribute("fixname", strFieldName + new string(' ', 20 - iLen));
                                    TableElement.AppendChild(FieldElement);
                                }
                                myReader.Close();
                            }
                            else
                            {
                                // 填充模板列表
                                string [] strFileNames = System.IO.Directory.GetFiles(this.Server.MapPath("."),"temp_*.xml");
                                for(int iCount = 0 ; iCount < strFileNames.Length ; iCount ++ )
                                {
                                    System.Xml.XmlElement tempXML = myDoc.CreateElement("template");
                                    tempXML.SetAttribute("key",System.IO.Path.GetFileNameWithoutExtension(strFileNames[iCount]));
                                    myDoc.DocumentElement.AppendChild(tempXML);
                                }
                                // 填充表名列表
                                myCmd.CommandText = strSQL ;
                                System.Data.OleDb.OleDbDataReader myReader = myCmd.ExecuteReader();
                                System.Xml.XmlElement TableElement = null;
                                while(myReader.Read())
                                {
                                    TableElement = myDoc.CreateElement("table");
                                    myDoc.DocumentElement.AppendChild(TableElement);
                                    strTableName = myReader[0].ToString();
                                    TableElement.SetAttribute("name", strTableName );
                                    TableElement.SetAttribute("count", myReader[1].ToString());
                                    int iLen = myEncode.GetByteCount(strTableName);
                                    if(iLen < 20 )
                                        TableElement.SetAttribute("fixname",strTableName + new string(' ', 20 - iLen));
                                }
                                myReader.Close();
                            }
                        }
                    }
                }
                myConn.Close();
            }
        }
        // 输出文档
        this.Response.ContentType = "text/xml";
        this.Response.ContentEncoding = myEncode ;
        this.Response.Write("<?xml version=\"1.0\" encoding=\"GB2312\" ?>");
        this.Response.Write("<?xml-stylesheet type=\"text/xsl\" href=\"" + strXSL  + "\"?>");
        this.Response.Write(myDoc.DocumentElement.OuterXml);
    }
</
script>

文件 dbxmlcfg.xml内容  

<?xml version="1.0" encoding="utf-8" ?>
<application>
    <settings>
        <setting key="conn">Provider=SQLOLEDB.1;Password=123456;Persist Security Info=True;User ID=CPR;Initial Catalog=HTIOA;Data Source=192.168.0.124</setting>
        <setting key="conndbxml">Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=IssueVision;Data Source=(local)</setting>
        <!--
       
            定义查询表结构使用的SQL语句, 
           
            queryfield_驱动程序名称 定义了查询指定表的字段定义的SQL语句,该语句带有一个参数
           
            querytable_驱动程序名称 定义了查询所有表名及其字段个数的SQL语句,该语句没有参数
           
            目前定义了 oracle和ms sql server 的SQL语句
           
         -->
        <setting key="queryfield_OraOLEDB.Oracle.1">Select TName  ,CName  ,coltype  ,width    From  Col  where tname in (#tablelist) Order by TName,CName</setting>
        <setting key="querytable_OraOLEDB.Oracle.1">Select TName   ,count(*)   From Col group by tname Order by TName </setting>
        <setting key="queryfield_SQLOLEDB.1"><![CDATA[select  sysobjects.name  ,syscolumns.name   ,systypes.name  ,syscolumns.length  from syscolumns,sysobjects,systypes where syscolumns.id=sysobjects.id and syscolumns.xtype=systypes.xtype and sysobjects.type='U' and systypes.name <>'_default_' and systypes.name<>'sysname' and sysobjects.name in (#tablelist) order by sysobjects.name,syscolumns.name]]></setting>
        <setting key="querytable_SQLOLEDB.1"><![CDATA[select  sysobjects.name ,count(*) from syscolumns,sysobjects,systypes where syscolumns.id=sysobjects.id and syscolumns.xtype=systypes.xtype and sysobjects.type='U' and systypes.name <>'_default_' and systypes.name<>'sysname' group by sysobjects.name order by sysobjects.name]]></setting>
    </settings>
</application>
####################### main.xml   ##################################
<?xml version="1.0" encoding="gb2312" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />
    <xsl:template match="/*">
        <html>
            <head>
                <title></title>
                <style>
                select2{ font-family: "宋体"; font-size: 12px}
                body{  font-family: "宋体"; font-size: 12px}
                table{ width:100%; border-collapse:collapse;
                    border: 1px #CC0066 solid; font-family: "宋体";
                    font-size: 12px}
                .tablehead{background-color:#CCCCFF}
                td{ border: 1px #CC0066 solid}            </style>
            </head>
            <body leftmargin='1' rightmargin='1' topmargin="1">
                <form name="frm" target="code" method="POST" action="dbxml.aspx?type=queryfield">
                模板<select name="template">
                        <xsl:for-each select="template">
                            <option>
                                <xsl:attribute name="value">
                                    <xsl:value-of select="@key" />
                                </xsl:attribute>
                                <xsl:value-of select="@key" />
                            </option>
                        </xsl:for-each>
                    </select>
                <input type="submit" value="提交" />
                <table>
                        <tr class="tablehead">
                            <td nowrap="1">选择</td>
                            <td nowrap="1">表名</td>
                            <td nowrap="1">字段个数</td>
                        </tr>
                        <xsl:for-each select="table">
                            <tr>
                                <td nowrap="1">
                                    <input type="checkbox" name="tablelist" style="width:13;height:13">
                                        <xsl:attribute name="value">
                                            <xsl:value-of select="@name" />
                                        </xsl:attribute>
                                    </input>
                                </td>
                                <td>
                                    <xsl:value-of select="@name" />
                                </td>
                                <td>
                                    <xsl:value-of select="@count" />
                                </td>
                            </tr>
                        </xsl:for-each>
                    </table>
            </form>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

############################### temp_CSharp.xml 内容 ############################################
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />
    <xsl:template match="/">
        <html>
            <head></head>
            <body>
                <xsl:for-each select="*/table">
<br />-------------- 文件名 <xsl:value-of select="@tablename" />.cs -----------------------------
            <pre style=" background-color:gainsboro">
//-----------------------------------------------------------------------------
<xsl:text disable-output-escaping="yes">
    /// <summary></xsl:text>
    /// 数据库表 <xsl:value-of select="@tablename" /> 操作对象
    /// 编制: 代码生成器
    /// 时间:
<xsl:text disable-output-escaping="yes">    /// </summary></xsl:text>
    public class Struct<xsl:value-of select="@tablename" />  : CommonStruct
    {    private const string c_TableName ="<xsl:value-of select="@tablename" />";
        // 定义数据库字段变量 ////////////////////////////////////////////////////////////////
        <xsl:for-each select="*">
            <xsl:variable name="csharptype">
                <xsl:choose>
                    <xsl:when test="@isstring='1'">string </xsl:when>
                    <xsl:when test="boolean('true')">int    </xsl:when>
                </xsl:choose>
            </xsl:variable>
            <xsl:variable name="lowfieldname">
                <xsl:value-of select="translate(@fieldname,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')" />
            </xsl:variable>
        private  <xsl:value-of select="$csharptype" /> m_<xsl:value-of select="@fixname" /> ; // 字段 <xsl:value-of select="@cname" />
        </xsl:for-each>
       
        // 定义属性 ///////////////////////////////////////////////////////////
        <xsl:for-each select="*">
        <xsl:variable name="csharptype">
                <xsl:choose>
                    <xsl:when test="@isstring='1'">string </xsl:when>
                    <xsl:when test="boolean('true')">int    </xsl:when>
                </xsl:choose>
            </xsl:variable>
        /// <xsl:text disable-output-escaping="yes">&lt;summary&gt;</xsl:text>
        /// 设置/返回数据库字段属性 <xsl:value-of select="@cname" />
         /// <xsl:text disable-output-escaping="yes">&lt;/summary&gt;</xsl:text>
        /// <xsl:text disable-output-escaping="yes">&lt;returns&gt;</xsl:text><xsl:value-of select="@cname" /><xsl:text disable-output-escaping="yes"> &lt;/returns&gt;</xsl:text>
        public <xsl:value-of select="$csharptype" /> m<xsl:value-of select="@fieldname" />
        {
            get{ return m_<xsl:value-of select="@fieldname" />  ;}
            set{ m_<xsl:value-of select="@fieldname" /> = value ;}
        }
        </xsl:for-each>
       
       
        new public  static string getTableName()
        {return c_TableName ;}
        new public static string getSelectSQL()
        {
            return  "Select <xsl:for-each select="*">
                            <xsl:value-of select="normalize-space(@fieldname)" />
                            <xsl:if test="position() != last()">,</xsl:if>
                        </xsl:for-each> From " + c_TableName ;
        }
        new public static string getTypeName()
        {
            return "<xsl:value-of select="translate(@tablename,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')" />";
        }
        new public  static string SearchKey(string strKey)
        {   
            return getSelectSQL() + " Where SEQ =" + strKey  ;
        }
        public override bool SetCommandParams( System.Data.OleDb.OleDbCommand myCmd,bool SetValues )
        {
            if(myCmd!= null)
            {
                myCmd.Parameters.Clear ();
                <xsl:for-each select="*">
                    myCmd.Parameters.Add("<xsl:value-of select="normalize-space(@fieldname)" />",System.Data.OleDb.OleDbType.<xsl:if test="@isstring='1'">VarWChar</xsl:if><xsl:if test="@isstring='0'">Integer</xsl:if>);</xsl:for-each>
                if(SetValues)
                {
                    <xsl:for-each select="*">
                    myCmd.Parameters[<xsl:value-of select="position()-1" />].Value = m_<xsl:value-of select="@fieldname" /> ; // 字段 <xsl:value-of select="@cname" />
                    </xsl:for-each>
                }
                return true;
            }
            return false;
        }
        public override bool SetInsertCommand( System.Data.OleDb.OleDbCommand myCmd)
        {
            if(myCmd != null)
            {
                myCmd.CommandText ="Insert Into " + c_TableName
                            + " ( <xsl:for-each select="*">[<xsl:value-of select="normalize-space(@fieldname)" />]<xsl:if test="position() != last()">,</xsl:if>
                        </xsl:for-each>) Values (<xsl:for-each select="*">?<xsl:if test="position() != last()">,</xsl:if>
                        </xsl:for-each>)";
                return this.SetCommandParams(myCmd,true);
            }
            return false;
        }
        public override bool SetUpdateCommand(System.Data.OleDb.OleDbCommand myCmd)
        {
            if(myCmd != null)
            {
                myCmd.CommandText ="Update " + c_TableName   
                            + " Set <xsl:for-each select="*">[<xsl:value-of select="normalize-space(@fieldname)" />]=? <xsl:if test="position() != last()">,</xsl:if></xsl:for-each> Where SEQ=" + m_SEQ ;
                return this.SetCommandParams(myCmd,true);
            }
            return false;
        }
        public override bool SelectRS(System.Data.OleDb.OleDbDataReader myReader)
        {
            try
            {
                if(myReader != null)
                {
                    if (myReader.FieldCount==5)
                    {
                        <xsl:for-each select="*">
                        m_<xsl:value-of select="@fixname" /> = Convert.To<xsl:if test="@isstring='1'">String</xsl:if><xsl:if test="@isstring='0'">Int32</xsl:if>(myReader[<xsl:value-of select="position()-1" />]);</xsl:for-each>
                        return true;
                    }
                }
            }
            catch
            {}
            return false;
        }
        public override bool ToXML(System.Xml.XmlElement myElement)
        {
            if(myElement != null)
            {
                <xsl:for-each select="*">
                myElement.SetAttribute("<xsl:value-of select="translate(@fieldname,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')" />",m_<xsl:value-of select="@fieldname" /><xsl:if test="@isstring='0'">.ToString()</xsl:if>);</xsl:for-each>
                return true;
            }
            return false;
        }
        public override bool FromXML(System.Xml.XmlElement myElement)
        {
            try
            {
                if(myElement != null)
                {
                    <xsl:for-each select="*">
                    m_<xsl:value-of select="@fixname" /> = <xsl:if test="@isstring='0'">Convert.ToInt32(</xsl:if>myElement.GetAttribute("<xsl:value-of select="translate(@fieldname,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')" />")<xsl:if test="@isstring='0'">)</xsl:if>;</xsl:for-each>
                    return true;
                }

            }
            catch
            {}
            return false;
        }
    }// 数据库操作类 Struct<xsl:value-of select="@tablename" /> 定义结束
</pre>
                    </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>
########################## temp_HTML代码.xml #####################################################
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />
    <xsl:template match="/*">
        <html>
            <head>
                <style>
            body{    font-family: "宋体"; font-size: 12px}
            table { width:100%; border-collapse:collapse;
                    border: 1px #CC0066 solid; font-family: "宋体";
                    font-size: 12px}
            .tablehead{background-color:#CCCCFF}
            td{ border: 1px #CC0066 solid}
            </style>
            </head>
            <body>
                <xsl:for-each select="table">
        数据表 <b><xsl:value-of select="translate(@tablename,'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')" /></b> 结构
        共 <xsl:value-of select="count(*)" /> 个字段
        <br />
        <table >
            <tr class="tablehead">
                <td>字段名</td>
                <td>类型</td>
                <td>长度</td>
            </tr>
            <xsl:for-each select="*">
                <tr>
                    <td>
                        <xsl:value-of select="@fieldname" />
                    </td>
                    <td>
                        <xsl:value-of select="@fieldtype" />
                    </td>
                    <td>
                        <xsl:value-of select="@fieldwidth" />
                    </td>
                </tr>
            </xsl:for-each>
        </table>
        <p /><hr />
    </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>
################################ temp_Java_Struct.xml #######################################################################
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />
    <xsl:template match="/">
    <html><head></head><body>
        <xsl:for-each select="*/table">
<br />-------------- 文件名 <xsl:value-of select="@tablename" />.java -----------------------------
            <pre style=" background-color:gainsboro">
package com.haitai.emr.struct;
import java.sql.*;
import java.io.*;
/**   <xsl:value-of select="@cname" />
*    @author 代码生成器 */
public class <xsl:value-of select="@tablename" /> implements Serializable
{        // 定义数据库字段变量 ////////////////////////////////////////////////////////////////
        <xsl:for-each select="*">
        <xsl:variable name="javatype">
                    <xsl:choose>
                        <xsl:when test="@isstring='1'">String  </xsl:when>
                        <xsl:when test="boolean('true')"            >int     </xsl:when>
                    </xsl:choose>
                </xsl:variable>
                <xsl:variable name="lowfieldname">
                    <xsl:value-of select="translate(@fixname,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')" />
                </xsl:variable>
    private <xsl:value-of select="$javatype" /> <xsl:text disable-output-escaping="yes"></xsl:text><xsl:value-of select="$lowfieldname" /> ; // 字段 <xsl:value-of select="@cname" /> 
        </xsl:for-each>
                public static final String SELECT =
                       "Select <xsl:for-each select="*">
                <xsl:value-of select="normalize-space(@fieldname)" />
                <xsl:if test="position() != last()">,</xsl:if>
            </xsl:for-each> From <xsl:value-of select="@tablename" />";
    /** @param conn
     * @exception SQLException */
   public java.sql.PreparedStatement makeInsSt (java.sql.Connection conn) throws SQLException{
        PreparedStatement pst=conn.prepareStatement("insert into <xsl:value-of select="@tablename" />(<xsl:for-each select="*">
                <xsl:value-of select="normalize-space(@fieldname)" />
                <xsl:if test="position() != last()">,</xsl:if>
            </xsl:for-each>)"
             +"values(<xsl:for-each select="*">?<xsl:if test="position() != last()">,</xsl:if></xsl:for-each>)");
      int index=0;
      <xsl:for-each select="*">
      pst.setString(++index,this.get<xsl:value-of select="@fieldname" />()); // <xsl:value-of select="@cname" />
      </xsl:for-each>
      return pst;
   }
  
    /** @param conn
     * @exception SQLException */
   public java.sql.PreparedStatement makeUpdSt (java.sql.Connection conn) throws SQLException{
     
         // TODO : implement
         PreparedStatement pst=conn.prepareStatement("update <xsl:value-of select="@tablename" /> set <xsl:for-each select="*"><xsl:value-of select="normalize-space(@fieldname)" /> =? <xsl:if test="position() != last()">,</xsl:if></xsl:for-each>)"
         +"where 数据表关键字段名=?");
         int index=0;
       <xsl:for-each select="*">
      pst.setString(++index,this.get<xsl:value-of select="@fieldname" />()); // <xsl:value-of select="@cname" />
      </xsl:for-each>

         //关键字
         pst.setString(++index,this.get数据表关键字段名());//数据表关键字段说明
  
         return pst;
      }
  
   public String toString (){
  
      // TODO : implement
      return <xsl:for-each select="*">"<xsl:if test="position() != 1">,</xsl:if><xsl:value-of select="normalize-space(@fieldname)" />="+ <xsl:value-of select="@lowfieldname" /><xsl:if test="position() != last()"> + </xsl:if> </xsl:for-each>;
   }
  
   // 读取和修改数据的接口
   <xsl:for-each select="*">
        <xsl:variable name="javatype">
                    <xsl:choose>
                        <xsl:when test="@isstring='1'">String</xsl:when>
                        <xsl:when test="boolean('true')">int</xsl:when>
                    </xsl:choose>
                </xsl:variable>
                <xsl:variable name="lowfieldname">
                    <xsl:value-of select="translate(@fieldname,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')" />
                </xsl:variable>
       public <xsl:value-of select="$javatype" /> get<xsl:value-of select="@fieldname" />(){
           return <xsl:value-of select="normalize-space($lowfieldname)" /> ;
       }
       //@param <xsl:value-of select="@cname" />
       public void  set<xsl:value-of select="@fieldname" />(<xsl:value-of select="@javatype" /> value){
           <xsl:value-of select="normalize-space($lowfieldname)" /> = value ;
       }
   </xsl:for-each>
} // 类 <xsl:value-of select="@tablename" /> 定义结束
</pre>
                    </xsl:for-each>
                   
    </body>
    </html>
    </xsl:template>
</xsl:stylesheet>
######################################## temp_VB.xml ############################################################
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />
    <xsl:template match="/">
        <html>
            <head></head>
            <body>
                <xsl:for-each select="*/table">
<br />-------------- 文件名 <xsl:value-of select="@tablename" />.cls -----------------------------
            <pre style=" background-color:gainsboro">
'******************************************************************************
'**
'**          数据表 <xsl:value-of select="@cname" />[ <xsl:value-of select="@tablename" /> ]操作的对象
'**
'** 编制:代码生成器
'** 时间:
'**
'******************************************************************************
'** 定义和数据库字段对应的变量 *************************************************************
    private const c_TableName As String  = "<xsl:value-of select="@tablename" />"        '** 数据表名称
    <xsl:for-each select="*">
    <xsl:variable name="vbtype">
                <xsl:choose>
                    <xsl:when test="@isstring='1'">String  </xsl:when>
                    <xsl:when test="boolean('true')"            >Integer </xsl:when>
                </xsl:choose>
            </xsl:variable>
            <xsl:variable name="lowfieldname">
                <xsl:value-of select="translate(@fieldname,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')" />
            </xsl:variable>
    private m_<xsl:value-of select="@fixname" /> As <xsl:value-of select="$vbtype" />  '** 字段 <xsl:value-of select="@cname" />   
    </xsl:for-each>
   
'** 定义数据库字段属性接口 ***************************************************************
        Public Property Get TableName() As String
            TableName = c_TableName
        End Property
    <xsl:for-each select="*">
    <xsl:variable name="vbtype">
                <xsl:choose>
                    <xsl:when test="@isstring='1'">String  </xsl:when>
                    <xsl:when test="boolean('true')"            >Integer </xsl:when>
                </xsl:choose>
            </xsl:variable>
        '** 数据库字段 <xsl:value-of select="@cname" />
        Public Property Get m<xsl:value-of select="@fieldname" />() As <xsl:value-of select="$vbtype" />
            m<xsl:value-of select="@fieldname" /> =  m_<xsl:value-of select="@fieldname" />
        End Property
        Public Property Let m<xsl:value-of select="@fieldname" />(Byval Value As <xsl:value-of select="$vbtype" />)
            m_<xsl:value-of select="@fieldname" /> =  m<xsl:value-of select="@fieldname" />
        End Property
    </xsl:for-each>
'** 获得查询所有数据使用的SQL语句 **
        public Function GetBaseSQL() As String
            GetBaseSQL ="Select <xsl:for-each select="*">
                            <xsl:value-of select="@fieldname" />
                            <xsl:if test="position() != last()">,</xsl:if>
                        </xsl:for-each> From " <xsl:text disable-output-escaping="yes">&</xsl:text> c_TableName
        End Function
       
'** 定义从数据库记录集获得数据的方法 **
    Public Function SelectRS(ByVal rs As ADODB.Recordset) As Boolean
        On Error GoTo SelectErr
        SelectRS = False
        <xsl:for-each select="*">
        m_<xsl:value-of select="@fixname" /> = rs.Fields(<xsl:value-of select="position()-1" />).Value  '** 字段 <xsl:value-of select="@cname" />
        </xsl:for-each>
        SelectRS = True
        Exit Function
SelectErr:
        SelectRS = False
    End Function
   
   
   
</pre>
                    </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>
####################### temp_表说明文档.xml   ##################################
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <html>
            <head></head>
            <body>
                <xsl:for-each select="*/table">
-------------表 <xsl:value-of select="@tablename" /> 的说明文档 <xsl:value-of select="count(*)" />个字段
<br /><pre style="word-wrap:break-word;background-color:gainsboro">
<xsl:for-each select="*"><xsl:value-of select="@fixname" /><xsl:text disable-output-escaping="yes">      </xsl:text><xsl:value-of select="@fieldtype" /> 
<xsl:if test="@isstring='1'">(<xsl:value-of select="@fieldwidth" />)</xsl:if>                .
<xsl:text disable-output-escaping="yes"></xsl:text>
</xsl:for-each>
                    </pre>
                    </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>
####################### temp_创建表的SQL语句.xml   ##################################
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <html>
            <head></head>
            <body>
                <xsl:for-each select="*/table">
-------------创建表 <xsl:value-of select="@tablename" /> 的SQL语句 <xsl:value-of select="count(*)" />个字段
<br /><pre style="word-wrap:break-word;background-color:gainsboro">
CREATE TABLE <xsl:value-of select="@tablename" />(
    <xsl:for-each select="*">
<xsl:text disable-output-escaping="yes"></xsl:text>
                            <xsl:value-of select="@fixname" />
                            <xsl:value-of select="@fieldtype" />
                            <xsl:if test="@isstring='1'">(<xsl:value-of select="@fieldwidth" />)</xsl:if>
                            <xsl:if test="position() != last()"> ,
        </xsl:if>
                        </xsl:for-each>
)
                        </pre>
                    </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>
#######################  temp_选择表使用的SQL语句.xml  ##################################
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/">
        <html>
            <head></head>
            <body>
                <xsl:for-each select="*/table">
-------------选择表 <xsl:value-of select="@tablename" /> 的SQL语句 <xsl:value-of select="count(*)" />个字段
<br /><pre style="word-wrap:break-word;background-color:gainsboro">
Select <xsl:for-each select="*">
                            <xsl:text disable-output-escaping="yes"></xsl:text>
                            <xsl:value-of select="normalize-space(@fieldname)" />
                            <xsl:if test="position() != last()"> , </xsl:if>
                        </xsl:for-each>
From <xsl:value-of select="@tablename" /></pre>
                    </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

posted @ 2008-01-18 09:29  wayguan  阅读(302)  评论(0编辑  收藏  举报