解决CodeSmith不能读取MySql数据库字段说明的问题

打开项目:

C:\Program Files\CodeSmith\v5.2\Samples\Samples\Projects\CSharp\MySQLSchemaProvider

将MySQLSchemaProvider.cs中的GetExtendedProperties修改为:

 

  1         /// <summary>
  2         /// Gets the extended properties for a given schema object.
  3         /// </summary>
  4         /// <param name="connectionString">The connection string used to connect to the target database.</param>
  5         /// <param name="schemaObject"></param>
  6         /// <returns></returns>
  7         public ExtendedProperty[] GetExtendedProperties(string connectionString, SchemaObjectBase schemaObject)
  8         {
  9             List<ExtendedProperty> extendedProperties = new List<ExtendedProperty>();
 10 
 11             if (schemaObject is ColumnSchema)
 12             {
 13                 ColumnSchema columnSchema = schemaObject as ColumnSchema;
 14 
 15                 string commandText = string.Format(@"SELECT EXTRA, COLUMN_DEFAULT, COLUMN_TYPE, COLUMN_COMMENT
 16 FROM INFORMATION_SCHEMA.COLUMNS
 17 WHERE TABLE_SCHEMA = '{0}'
 18   AND TABLE_NAME = '{1}'
 19   AND COLUMN_NAME = '{2}'", columnSchema.Table.Database.Name, columnSchema.Table.Name, columnSchema.Name);
 20 
 21                 using (DbConnection connection = CreateConnection(connectionString))
 22                 {
 23                     connection.Open();
 24 
 25                     DbCommand command = connection.CreateCommand();
 26                     command.CommandText = commandText;
 27                     command.Connection = connection;
 28 
 29                     using (IDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection))
 30                     {
 31                         while (reader.Read())
 32                         {
 33                             string extra = reader.GetString(0).ToLower();
 34                             bool columndefaultisnull = reader.IsDBNull(1);
 35                             string columndefault = "";
 36                             if (!columndefaultisnull)
 37                             {
 38                                 columndefault = reader.GetString(1).ToUpper();
 39                             }
 40                             string columntype = reader.GetString(2).ToUpper();
 41                             string columncomment = reader.GetString(3);
 42 
 43                             bool isIdentity = (extra.IndexOf("auto_increment"> -1);
 44                             extendedProperties.Add(new ExtendedProperty("CS_IsIdentity", isIdentity, columnSchema.DataType));
 45 
 46                             if (isIdentity)
 47                             {
 48                                 /*
 49                                 MySQL auto_increment doesn't work exactly like SQL Server's IDENTITY
 50                                 I believe that auto_increment is equivalent to IDENTITY(1, 1)
 51                                 However, auto_increment behaves differently from IDENTITY when used
 52                                 with multi-column primary keys.  See the MySQL Reference Manual for details.
 53                                 */
 54                                 extendedProperties.Add(new ExtendedProperty("CS_IdentitySeed"1, columnSchema.DataType));
 55                                 extendedProperties.Add(new ExtendedProperty("CS_IdentityIncrement"1, columnSchema.DataType));
 56                             }
 57 
 58                             extendedProperties.Add(new ExtendedProperty("CS_ColumnDefaultIsNull", columndefaultisnull, DbType.Boolean));
 59                             extendedProperties.Add(new ExtendedProperty("CS_ColumnDefault", columndefault, DbType.String));
 60                             extendedProperties.Add(new ExtendedProperty("CS_ColumnType", columntype, DbType.String));
 61                             extendedProperties.Add(new ExtendedProperty("CS_ColumnExtra", extra.ToUpper(), DbType.String));
 62                             extendedProperties.Add(new ExtendedProperty("CS_Description", columncomment, DbType.String));
 63                         }
 64 
 65                         if (!reader.IsClosed)
 66                             reader.Close();
 67                     }
 68 
 69                     if (connection.State != ConnectionState.Closed)
 70                         connection.Close();
 71                 }
 72             }
 73             if (schemaObject is TableSchema)
 74             {
 75                 TableSchema tableSchema = schemaObject as TableSchema;
 76                 string commandText = string.Format(@"SHOW CREATE TABLE `{0}`.`{1}`", tableSchema.Database.Name, tableSchema.Name);
 77 
 78                 using (DbConnection connection = CreateConnection(connectionString))
 79                 {
 80                     connection.Open();
 81 
 82                     DbCommand command = connection.CreateCommand();
 83                     command.CommandText = commandText;
 84                     command.Connection = connection;
 85 
 86                     using (IDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection))
 87                     {
 88                         while (reader.Read())
 89                         {
 90                             string createtable = reader.GetString(1);
 91                             extendedProperties.Add(new ExtendedProperty("CS_CreateTableScript", createtable, DbType.String));
 92                         }
 93 
 94                         if (!reader.IsClosed)
 95                             reader.Close();
 96                     }
 97 
 98                     if (connection.State != ConnectionState.Closed)
 99                         connection.Close();
100                 }
101             }
102 
103             return extendedProperties.ToArray();
104         }

 

 

然后将生成的dSchemaExplorer.MySQLSchemaProvider.dll文件放入C:\Program Files\CodeSmith\v5.2\SchemaProviders

 

示例模板:

 1 <%-- 
 2 Name: CSharp Model
 3 Author: ahui
 4 Description: C# Model Class 
 5 Date: 2010-12-16
 6 --%>
 7 <%@ CodeTemplate Language="C#" ResponseEncoding="UTF-8" TargetLanguage="Text" Src="" Inherits="" Debug="False" CompilerVersion="v3.5" Description="Template description here." %>
 8 <%@ Assembly Name="SchemaExplorer" %>
 9 <%@ Import Namespace="SchemaExplorer" %>
10 <%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="DataTable" Description="数据表" %>
11 <%@ Property Name="NameSpacce" Type="System.String" Category="Context" Default="PubDS.Model" Description="命名空间" %>
12 <%@ Property Name="Author" Type="System.String" Category="Context" Default="ahui" Description="作者" %>
13 <%@ Property Name="Description" Type="String" Category="Context" Description="类说明" Optional="true"%>
14 
15 <script runat="template">
16 
17 public string GetSystemType(ColumnSchema col)
18 {
19     string typeName = col.SystemType.Name;
20     if (col.AllowDBNull && col.SystemType.IsValueType)
21     {
22         typeName += "?";
23     }
24     return typeName;
25 }
26 
27 </script>
28 using System;
29 using System.Collections.Generic;
30 using System.Text;
31 
32 namespace <%= NameSpacce %>
33 {
34     /// <summary>
35     /// <%= Description %>
36     /// </summary>
37     public class <%= StringUtil.ToPascalCase(SourceTable.Name) %>
38     {
39         #region 构造函数
40         public <%= StringUtil.ToPascalCase(SourceTable.Name) %>()
41         {
42         }
43         #endregion
44         
45         #region 表字段
46 <% foreach (ColumnSchema col in SourceTable.Columns) { %>
47         /// <summary>
48         /// <%= col.Description %>
49         /// </summary>
50         public <%= GetSystemType(col) %> <%= StringUtil.ToPascalCase(col.Name) %>
51         {
52             get;
53             set;
54         }
55         
56 <% } %>
57         #endregion
58     }
59 }

 

 

posted @ 2010-12-16 14:11  ahui  阅读(4230)  评论(8编辑  收藏  举报