`
mlzboy
  • 浏览: 726655 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论
阅读更多

为什么不是闲话,因为我很忙,项目中新问题是接连不断,上一篇讲到sqlite的并发问题,于是我又找了其它的嵌入式数据库Sqlserver CE compact 3.1/3.5也好不到哪去,万般无奈之下操起了berkeley db,为什么说是万般无奈呢?因为BDB(aka Berkeley DB)是非RDMBS,说白了你不能用sql.

BDB是一个大的哈希表,因为需要将原先储存在数据库中列以实体类转到字节的形式储存,OK,这里遇到一个问题,要生成实体类,实体类工具是一大把,mygeneration,codesmith,动软,之前都用过,可是原先的数据库是sqlite,一般的生成器可使不了这家伙,动软可以先排除了,本来想网上搜索一个轻便点的,结果找不到,于是down了一个新版的codesmith,找出以前我写的一套仿动软七层结构的模板(发现朗志项目的产出还挺大的,呵呵),拿出来改改,只是要生成个实体类,模板代码如下:

 

 

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><%@ CodeTemplate Language="C#" TargetLanguage="C#" Description="Generates a very simple business object." %>
<%@ Property Name="DevelopersName" Type="String" Category="Context" Default="Lexus" Description="The name to include in the comment header" %>
<%@ Property Name="NameSpace" Type="String" Category="Context" Default="Lexus" Description="The namespace to use for this class" %>
<%@ Property Name="SourceTable" Type="SchemaExplorer.TableSchema" Category="Context" Description="Table that the object is based on." %>
<%@ Assembly Name="SchemaExplorer" %>
<%@ Assembly Name="System.Data" %>
<%@ Import Namespace="SchemaExplorer" %>
<%@ Import Namespace="System.Data" %>
// File: <%= GetClassName(SourceTable) %>.cs
// <%=DateTime.Now.ToShortDateString() %>: <%=DevelopersName %>    Original Version
// 
// ===================================================================
[Serializable]
public class <%= GetClassName(SourceTable) %>
{
    
<% for (int i = 0; i < SourceTable.Columns.Count; i++) { %>    
    
public <%= GetCSharpVariableType(SourceTable.Columns[i]) %> <%= SourceTable.Columns[i].Name %>{get;set;}
    
<% if (i < SourceTable.Columns.Count - 1) Response.Write("\r\n"); %>        
    
<% } %>
}
<script runat="template">
script
#region script
public string GetMemberVariableDeclarationStatement(ColumnSchema column)
{
    
return GetMemberVariableDeclarationStatement("private", column);
}

public string GetMemberVariableDeclarationStatement(string protectionLevel, ColumnSchema column)
{
    
string statement = protectionLevel + " ";
    statement 
+= GetCSharpVariableType(column) + " " + GetMemberVariableName(column);
    
    
string defaultValue = GetMemberVariableDefaultValue(column);
    
if (defaultValue != "")
    {
        statement 
+= " = " + defaultValue;
    }
    
    statement 
+= ";";
    
    
return statement;
}

public string GetConstructorParameters()
{
    
string ret = "";
    
foreach(ColumnSchema column in SourceTable.Columns)
    {
        ret 
+= GetCSharpVariableType(column) + " " + GetCamelCaseName(GetPropertyName(column)) + ",\n\t\t\t";
    }
    
return ret.Substring(0, ret.Length - 5);
}

public string GetAssignValue()
{
    
string ret = "";
    
foreach(ColumnSchema column in SourceTable.Columns)
    {
        ret 
+= GetMemberVariableName(column) +  (new String(' ', GetPropertyNameMaxLength() - GetPropertyNameLength(column))) + " = " + GetCamelCaseName(GetPropertyName(column)) + ";\n\t\t\t";
    }
    
return ret;
}

public string GetReaderAssignmentStatement(ColumnSchema column, int index)
{
    
string statement = "if (!reader.IsDBNull(" + index.ToString() + ")) ";
    statement 
+= GetMemberVariableName(column) + " = ";
    
    
if (column.Name.EndsWith("TypeCode")) statement += "(" + column.Name + ")";
    
    statement 
+= "reader." + GetReaderMethod(column) + "(" + index.ToString() + ");";
    
    
return statement;
}

public string GetCamelCaseName(string value)
{
    
//return value.Substring(0, 1).ToLower() + value.Substring(1);
    
//lexus modify
    return value;
}

public string GetMemberVariableName(ColumnSchema column)
{
    
//string propertyName = GetPropertyName(column);
    string propertyName = column.Name;
    
string memberVariableName = "_" + GetCamelCaseName(propertyName);
    
    
return memberVariableName;
}


public string GetPropertyName(ColumnSchema column)
{
    
string propertyName = column.Name;
    
    
if (propertyName == column.Table.Name + "Name"return "Name";
    
if (propertyName == column.Table.Name + "Description"return "Description";
    
    
if (propertyName.EndsWith("TypeCode")) propertyName = propertyName.Substring(0, propertyName.Length - 4);
    
    
return propertyName;
}

public int GetPropertyNameLength(ColumnSchema column)
{
    
return (GetPropertyName(column)).Length;
}
public int GetPropertyNameMaxLength()
{
    
int ret = 0;
    
foreach(ColumnSchema column in SourceTable.Columns)
    {
        ret 
= ret < GetPropertyNameLength(column)?GetPropertyNameLength(column):ret;
    }
    
return ret;
}
        
public string GetMemberVariableDefaultValue(ColumnSchema column)
{
    
if(column.IsPrimaryKeyMember)
    {
        
return "";
    }
    
switch (column.DataType)
    {
        
case DbType.Guid:
        {
            
return "Guid.Empty";
        }
        
case DbType.AnsiString:
        
case DbType.AnsiStringFixedLength:
        
case DbType.String:
        
case DbType.StringFixedLength:
        {
            
return "String.Empty";
        }
        
default:
        {
            
return "";
        }
    }
}

public string GetCSharpVariableType(ColumnSchema column)
{
    
if (column.Name.EndsWith("TypeCode")) return column.Name;
    
    
switch (column.DataType)
    {
        
case DbType.AnsiString: return "string";
        
case DbType.AnsiStringFixedLength: return "string";
        
case DbType.Binary: return "byte[]";
        
case DbType.Boolean: return "bool";
        
case DbType.Byte: return "byte";
        
case DbType.Currency: return "decimal";
        
case DbType.Date: return "DateTime";
        
case DbType.DateTime: return "DateTime";
        
case DbType.Decimal: return "decimal";
        
case DbType.Double: return "double";
        
case DbType.Guid: return "Guid";
        
case DbType.Int16: return "short";
        
case DbType.Int32: return "int";
        
case DbType.Int64: return "long";
        
case DbType.Object: return "object";
        
case DbType.SByte: return "sbyte";
        
case DbType.Single: return "float";
        
case DbType.String: return "string";
        
case DbType.StringFixedLength: return "string";
        
case DbType.Time: return "TimeSpan";
        
case DbType.UInt16: return "ushort";
        
case DbType.UInt32: return "uint";
        
case DbType.UInt64: return "ulong";
        
case DbType.VarNumeric: return "decimal";
        
default:
        {
            
return "__UNKNOWN__" + column.NativeType;
        }
    }
}

public string GetReaderMethod(ColumnSchema column)
{
    
switch (column.DataType)
    {
        
case DbType.Byte:
        {
            
return "GetByte";
        }
        
case DbType.Int16:
        {
            
return "GetInt16";
        }
        
case DbType.Int32:
        {
            
return "GetInt32";
        }
        
case DbType.Int64:
        {
            
return "GetInt64";
        }
        
case DbType.AnsiStringFixedLength:
        
case DbType.AnsiString:
        
case DbType.String:
        
case DbType.StringFixedLength:
        {
            
return "GetString";
        }
        
case DbType.Boolean:
        {
            
return "GetBoolean";
        }
        
case DbType.Guid:
        {
            
return "GetGuid";
        }
        
case DbType.Currency:
        
case DbType.Decimal:
        {
            
return "GetDecimal";
        }
        
case DbType.DateTime:
        
case DbType.Date:
        {
            
return "GetDateTime";
        }
        
case DbType.Binary:
        {
            
return "GetBytes";
        }
        
default:
        {
            
return "__SQL__" + column.DataType;
        }
    }
}

public string GetClassName(TableSchema table)
{
    
/**//*
    if (table.Name.EndsWith("s"))
    {
        return table.Name.Substring(0, table.Name.Length - 1);
    }
    else
    {
        return table.Name;
    }
    
*/
    
if(table==null)
    {
        
return null;
    }
    
//lexus modify
    
//return table.Name + "Info";
    int len=table.Name.Length;
    
string result=string.Empty;
    
if(table.Name.EndsWith("ies"))
    {
        result
=table.Name.Substring(0,len-3)+"y";
    }
    
else
    {
        result
=table.Name.Substring(0,len-1);
    }
    
return result;
}

public string GetSqlDbType(ColumnSchema column)
{
    
switch (column.NativeType)
    {
        
case "bigint"return "BigInt";
        
case "binary"return "Binary";
        
case "bit"return "Bit";
        
case "char"return "Char";
        
case "datetime"return "DateTime";
        
case "decimal"return "Decimal";
        
case "float"return "Float";
        
case "image"return "Image";
        
case "int"return "Int";
        
case "money"return "Money";
        
case "nchar"return "NChar";
        
case "ntext"return "NText";
        
case "numeric"return "Decimal";
        
case "nvarchar"return "NVarChar";
        
case "real"return "Real";
        
case "smalldatetime"return "SmallDateTime";
        
case "smallint"return "SmallInt";
        
case "smallmoney"return "SmallMoney";
        
case "sql_variant"return "Variant";
        
case "sysname"return "NChar";
        
case "text"return "Text";
        
case "timestamp"return "Timestamp";
        
case "tinyint"return "TinyInt";
        
case "uniqueidentifier"return "UniqueIdentifier";
        
case "varbinary"return "VarBinary";
        
case "varchar"return "VarChar";
        
defaultreturn "__UNKNOWN__" + column.NativeType;
    }
}

public string GetPrimaryKeyType(TableSchema table)
{
    
if (table.PrimaryKey != null)
    {
        
if (table.PrimaryKey.MemberColumns.Count == 1)
        {
            
return GetCSharpVariableType(table.PrimaryKey.MemberColumns[0]);
        }
        
else
        {
            
throw new ApplicationException("This template will not work on primary keys with more than one member column.");
        }
    }
    
else
    {
        
throw new ApplicationException("This template will only work on tables with a primary key.");
    }
}

public override string GetFileName()
{
    
return this.GetClassName(this.SourceTable) + ".cs";
}
#endregion script
</script>

 

这个模板里有一些函数还是挺有用的,大家可以看看

另外,codesmith 4.1.2我用的版本,也不是一开始就支持sqlite的,这里引用了园友乱世经典修改后的驱动http://www.cnblogs.com/chsword/archive/2008/07/08/sqliteschemaproviders.html

生成的数据类型还是有一些对不上,自己手工改一下吧,因为工作量不是很大,

最后也把仿动软的架构的模板提供给大家http://

评论

相关推荐

    codesmith nettiers-2.3.1.zip codesmith 模板

    codesmith nettiers-2.3.1.zip codesmith 模板codesmith nettiers-2.3.1.zip codesmith 模板codesmith nettiers-2.3.1.zip codesmith 模板codesmith nettiers-2.3.1.zip codesmith 模板codesmith nettiers-2.3.1.zip...

    CodeSmith+注册码(注册机)

    CodeSmith+注册码(注册机)CodeSmith+注册码(注册机)CodeSmith+注册码(注册机)CodeSmith+注册码(注册机)CodeSmith+注册码(注册机)CodeSmith+注册码(注册机)CodeSmith+注册码(注册机)CodeSmith+注册码...

    CodeSmith教程[全].pdf CodeSmith教程[全].pdf CodeSmith教程[全].pdf

    CodeSmith教程[全].pdf CodeSmith教程[全].pdf CodeSmith教程[全].pdf CodeSmith教程[全].pdf CodeSmith教程[全].pdf CodeSmith教程[全].pdf CodeSmith教程[全].pdf CodeSmith教程[全].pdf CodeSmith教程[全].pdf ...

    MySql数据库CodeSmith模板

    MySQL数据库CodeSmith模板是一种高效的代码生成工具,它利用CodeSmith的强大功能,自动化地根据MySQL数据库中的表结构生成相应的代码,从而极大地提高了开发效率。CodeSmith是一款流行的数据驱动的代码生成器,它...

    CodeSmith

    CodeSmith是一款强大的代码生成工具,尤其在ASP.NET和C#开发环境中被广泛使用。它能够自动根据数据库中的表结构生成C#实体类,极大地提高了开发效率,减少了手动编写重复代码的工作量。 首先,CodeSmith的核心功能...

    CodeSmith 6.0 + 序列号

    CodeSmith是一款强大的代码生成工具,尤其对于程序员和开发团队来说,它能显著提高开发效率,减少重复编写基础代码的工作量。在标题中提到的"CodeSmith 6.0 + 序列号",指的是该软件的第六个主要版本,并且提供了一...

    CodeSmith初学者教程

    CodeSmith是一款强大的代码生成工具,尤其对于asp.net开发者而言,它极大地提高了开发效率,帮助程序员从繁琐的手动编码工作中解放出来。本教程专为初学者设计,旨在引导你快速掌握CodeSmith的基本用法和高级特性。 ...

    Java 代码生成器CodeSmith是一个好工具

    CodeSmith 是一种基于模板的代码生成工具,它使用类似于 ASP.NET 的语法来生成任意类型的代码或文本。与其他许多代码生成工具不同,CodeSmith 不要求您订阅特定的应用程序设计或体系结构。使用 CodeSmith,可以生成...

    解决CodeSmith 8.0生成mysql实体没有字段注释和表注释,亲测好用

    CodeSmith是一款强大的代码生成工具,尤其适用于快速生成数据库相关的实体模型、数据访问层以及业务逻辑层代码。在本文中,我们将深入探讨如何解决在使用CodeSmith 8.0时遇到的MySQL实体没有字段注释和表注释的问题...

    CodeSmith 生成工具 6.5 (可生成Nhibernate)

    CodeSmith是一款强大的代码生成工具,尤其在快速开发领域有着广泛的应用。版本6.5是它的一个重要里程碑,其中包含了对Nhibernate框架的支持,这使得开发者能够更高效地生成与Nhibernate配合的实体类和数据访问层代码...

    CodeSmith代码生成器

    CodeSmith是一款强大的代码生成工具,尤其在提升软件开发效率方面有着显著的作用。它允许开发者通过模板语言来定制自己的代码生成规则,从而自动化地创建出符合特定项目需求的源代码。这款工具广泛应用于国内的开发...

    CodeSmith8.0.1连接PostgreSQL报错问题解决

    在IT行业中,数据库连接是开发过程中的重要环节,特别是在使用代码生成工具如CodeSmith时。本文将详述CodeSmith 8.0.1版本在尝试连接到PostgreSQL数据库时遇到的问题,以及如何通过添加必要的DLL文件和理解连接字符...

    CodeSmithProfessional.v5.1.1

    CodeSmith Professional是一款强大的代码生成工具,它为程序员和软件开发者提供了高效的代码自动化生成解决方案。这款软件结合了Power Design,使得数据库设计与代码生成之间的工作流程更为顺畅,极大地提高了开发...

    CodeSmith三层模板

    CodeSmith是一款强大的代码生成工具,尤其在快速构建企业级应用的三层架构方面表现突出。它通过自定义模板,能够帮助开发者高效地生成数据访问层(DAL)、业务逻辑层(BLL)以及表现层(UI)的代码,显著提高开发...

    简单的CodeSmith模板

    CodeSmith是一款强大的代码生成工具,尤其在数据库对象到源代码的转换方面表现出色。它允许开发者通过使用模板语言创建自定义的代码生成方案,极大地提高了开发效率和代码一致性。"简单的CodeSmith模板"这个主题意味...

    Codesmith6.zip

    CodeSmith 是一种基于模板的代码生成工具,它使用类似于 ASP.NET 的语法来生成任意类型的代码或文本。与其他许多代码生成工具不同,CodeSmith 不要求您订阅特定的应用程序设计或体系结构。使用 CodeSmith,可以生成...

    CodeSmith5.01破解版(CodeSmith Professional 5.0.1.4983)

    CodeSmith 是一种基于模板的代码生成工具,它使用类似于 ASP.NET 的语法来生成任意类型的代码或文本。与其他许多代码生成工具不同,CodeSmith 不要求您订阅特定的应用程序设计或体系结构。使用 CodeSmith,可以生成...

    CodeSmith IBatis1.92模板

    CodeSmith是一款强大的代码生成工具,它能够帮助开发者自动生成各种编程语言中的常见代码,极大地提高了开发效率。在本案例中,我们关注的是"CodeSmith IBatis1.92模板",这表明它是一个专用于生成IBatis框架相关...

    codesmith生成实体类简单模板

    《使用Codesmith生成C#实体类的简易模板详解》 在软件开发过程中,尤其是在与数据库交互的业务逻辑层,实体类的创建是一项繁琐且重复的工作。 Codesmith是一款强大的代码生成工具,它允许开发者通过定制模板来自动...

    codesmith DatabaseGen

    《codesmith DatabaseGen:高效数据库生成工具的探索与实践》 在IT行业中,代码生成工具是提高开发效率的重要辅助手段,而"codesmith"正是这样一款备受开发者青睐的工具。"codesmith DatabaseGen"则是codesmith针对...

Global site tag (gtag.js) - Google Analytics