zoukankan      html  css  js  c++  java
  • T4 模版应用类

    Dbhelper.ttinclude

    ---------------------------------------------------------------------------------------------》

    <#@ assembly name="System.Core.dll" #>
    <#@ assembly name="System.Data.dll" #>
    <#@ assembly name="System.Data.DataSetExtensions.dll" #>
    <#@ assembly name="System.Xml.dll" #>
    <#@ import namespace="System" #>
    <#@ import namespace="System.Xml" #>
    <#@ import namespace="System.Linq" #>
    <#@ import namespace="System.Data" #>
    <#@ import namespace="System.Data.SqlClient" #>
    <#@ import namespace="System.Collections.Generic" #>
    <#@ import namespace="System.IO" #>

    <#+
    public class DbHelper
    {
    #region GetDbTables

    public static List<DbTable> GetDbTables(string connectionString, string database, string tables = null)
    {

    if (!string.IsNullOrEmpty(tables))
    {
    tables = string.Format(" and obj.name in ('{0}')", tables.Replace(",", "','"));
    }
    #region SQL
    string sql = string.Format(@"SELECT
    obj.name tablename,
    schem.name schemname,
    idx.rows,
    CAST
    (
    CASE
    WHEN (SELECT COUNT(1) FROM sys.indexes WHERE object_id= obj.OBJECT_ID AND is_primary_key=1) >=1 THEN 1
    ELSE 0
    END
    AS BIT) HasPrimaryKey
    from {0}.sys.objects obj
    inner join {0}.dbo.sysindexes idx on obj.object_id=idx.id and idx.indid<=1
    INNER JOIN {0}.sys.schemas schem ON obj.schema_id=schem.schema_id
    where type='U' {1}
    order by obj.name", database, tables);
    #endregion
    DataTable dt = GetDataTable(connectionString, sql);
    return dt.Rows.Cast<DataRow>().Select(row => new DbTable
    {
    TableName = row.Field<string>("tablename"),
    SchemaName = row.Field<string>("schemname"),
    Rows = row.Field<int>("rows"),
    HasPrimaryKey = row.Field<bool>("HasPrimaryKey")
    }).ToList();
    }
    #endregion

    #region GetDbColumns

    public static List<DbColumn> GetDbColumns(string connectionString, string database, string tableName, string schema = "dbo")
    {
    #region SQL
    string sql = string.Format(@"
    WITH indexCTE AS
    (
    SELECT
    ic.column_id,
    ic.index_column_id,
    ic.object_id
    FROM {0}.sys.indexes idx
    INNER JOIN {0}.sys.index_columns ic ON idx.index_id = ic.index_id AND idx.object_id = ic.object_id
    WHERE idx.object_id =OBJECT_ID(@tableName) AND idx.is_primary_key=1
    )
    select
    colm.column_id ColumnID,
    CAST(CASE WHEN indexCTE.column_id IS NULL THEN 0 ELSE 1 END AS BIT) IsPrimaryKey,
    colm.name ColumnName,
    systype.name ColumnType,
    colm.is_identity IsIdentity,
    colm.is_nullable IsNullable,
    cast(colm.max_length as int) ByteLength,
    (
    case
    when systype.name='nvarchar' and colm.max_length>0 then colm.max_length/2
    when systype.name='nchar' and colm.max_length>0 then colm.max_length/2
    when systype.name='ntext' and colm.max_length>0 then colm.max_length/2
    else colm.max_length
    end
    ) CharLength,
    cast(colm.precision as int) Precision,
    cast(colm.scale as int) Scale,
    prop.value Remark
    from {0}.sys.columns colm
    inner join {0}.sys.types systype on colm.system_type_id=systype.system_type_id and colm.user_type_id=systype.user_type_id
    left join {0}.sys.extended_properties prop on colm.object_id=prop.major_id and colm.column_id=prop.minor_id
    LEFT JOIN indexCTE ON colm.column_id=indexCTE.column_id AND colm.object_id=indexCTE.object_id
    where colm.object_id=OBJECT_ID(@tableName)
    order by colm.column_id", database);
    #endregion
    SqlParameter param = new SqlParameter("@tableName", SqlDbType.NVarChar, 100) { Value = string.Format("{0}.{1}.{2}", database, schema, tableName) };
    DataTable dt = GetDataTable(connectionString, sql, param);
    return dt.Rows.Cast<DataRow>().Select(row => new DbColumn()
    {
    ColumnID = row.Field<int>("ColumnID"),
    IsPrimaryKey = row.Field<bool>("IsPrimaryKey"),
    ColumnName = row.Field<string>("ColumnName"),
    ColumnType = row.Field<string>("ColumnType"),
    IsIdentity = row.Field<bool>("IsIdentity"),
    IsNullable = row.Field<bool>("IsNullable"),
    ByteLength = row.Field<int>("ByteLength"),
    CharLength = row.Field<int>("CharLength"),
    Scale = row.Field<int>("Scale"),
    Remark = row["Remark"].ToString()
    }).ToList();
    }

    #endregion


    #region GetDataTable

    public static DataTable GetDataTable(string connectionString, string commandText, params SqlParameter[] parms)
    {
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
    SqlCommand command = connection.CreateCommand();
    command.CommandText = commandText;
    command.Parameters.AddRange(parms);
    SqlDataAdapter adapter = new SqlDataAdapter(command);

    DataTable dt = new DataTable();
    adapter.Fill(dt);

    return dt;
    }
    }

    #endregion
    }

    #region DbTable
    /// <summary>
    /// 表结构
    /// </summary>
    public sealed class DbTable
    {
    /// <summary>
    /// 表名称
    /// </summary>
    public string TableName { get; set; }
    /// <summary>
    /// 表的架构
    /// </summary>
    public string SchemaName { get; set; }
    /// <summary>
    /// 表的记录数
    /// </summary>
    public int Rows { get; set; }

    /// <summary>
    /// 是否含有主键
    /// </summary>
    public bool HasPrimaryKey { get; set; }
    }
    #endregion

    #region DbColumn
    /// <summary>
    /// 表字段结构
    /// </summary>
    public sealed class DbColumn
    {
    /// <summary>
    /// 字段ID
    /// </summary>
    public int ColumnID { get; set; }

    /// <summary>
    /// 是否主键
    /// </summary>
    public bool IsPrimaryKey { get; set; }

    /// <summary>
    /// 字段名称
    /// </summary>
    public string ColumnName { get; set; }

    /// <summary>
    /// 字段类型
    /// </summary>
    public string ColumnType { get; set; }

    /// <summary>
    /// 数据库类型对应的C#类型
    /// </summary>
    public string CSharpType
    {
    get
    {
    return SqlServerDbTypeMap.MapCsharpType(ColumnType);
    }
    }

    /// <summary>
    ///
    /// </summary>
    public Type CommonType
    {
    get
    {
    return SqlServerDbTypeMap.MapCommonType(ColumnType);
    }
    }

    /// <summary>
    /// 字节长度
    /// </summary>
    public int ByteLength { get; set; }

    /// <summary>
    /// 字符长度
    /// </summary>
    public int CharLength { get; set; }

    /// <summary>
    /// 小数位
    /// </summary>
    public int Scale { get; set; }

    /// <summary>
    /// 是否自增列
    /// </summary>
    public bool IsIdentity { get; set; }

    /// <summary>
    /// 是否允许空
    /// </summary>
    public bool IsNullable { get; set; }

    /// <summary>
    /// 描述
    /// </summary>
    public string Remark { get; set; }
    }
    #endregion

    #region SqlServerDbTypeMap

    public class SqlServerDbTypeMap
    {
    public static string MapCsharpType(string dbtype)
    {
    if (string.IsNullOrEmpty(dbtype)) return dbtype;
    dbtype = dbtype.ToLower();
    string csharpType = "object";
    switch (dbtype)
    {
    case "bigint": csharpType = "long"; break;
    case "binary": csharpType = "byte[]"; break;
    case "bit": csharpType = "bool"; break;
    case "char": csharpType = "string"; break;
    case "date": csharpType = "DateTime"; break;
    case "datetime": csharpType = "DateTime"; break;
    case "datetime2": csharpType = "DateTime"; break;
    case "datetimeoffset": csharpType = "DateTimeOffset"; break;
    case "decimal": csharpType = "decimal"; break;
    case "float": csharpType = "double"; break;
    case "image": csharpType = "byte[]"; break;
    case "int": csharpType = "int"; break;
    case "money": csharpType = "decimal"; break;
    case "nchar": csharpType = "string"; break;
    case "ntext": csharpType = "string"; break;
    case "numeric": csharpType = "decimal"; break;
    case "nvarchar": csharpType = "string"; break;
    case "real": csharpType = "Single"; break;
    case "smalldatetime": csharpType = "DateTime"; break;
    case "smallint": csharpType = "short"; break;
    case "smallmoney": csharpType = "decimal"; break;
    case "sql_variant": csharpType = "object"; break;
    case "sysname": csharpType = "object"; break;
    case "text": csharpType = "string"; break;
    case "time": csharpType = "TimeSpan"; break;
    case "timestamp": csharpType = "byte[]"; break;
    case "tinyint": csharpType = "byte"; break;
    case "uniqueidentifier": csharpType = "Guid"; break;
    case "varbinary": csharpType = "byte[]"; break;
    case "varchar": csharpType = "string"; break;
    case "xml": csharpType = "string"; break;
    default: csharpType = "object"; break;
    }
    return csharpType;
    }

    public static Type MapCommonType(string dbtype)
    {
    if (string.IsNullOrEmpty(dbtype)) return Type.Missing.GetType();
    dbtype = dbtype.ToLower();
    Type commonType = typeof(object);
    switch (dbtype)
    {
    case "bigint": commonType = typeof(long); break;
    case "binary": commonType = typeof(byte[]); break;
    case "bit": commonType = typeof(bool); break;
    case "char": commonType = typeof(string); break;
    case "date": commonType = typeof(DateTime); break;
    case "datetime": commonType = typeof(DateTime); break;
    case "datetime2": commonType = typeof(DateTime); break;
    case "datetimeoffset": commonType = typeof(DateTimeOffset); break;
    case "decimal": commonType = typeof(decimal); break;
    case "float": commonType = typeof(double); break;
    case "image": commonType = typeof(byte[]); break;
    case "int": commonType = typeof(int); break;
    case "money": commonType = typeof(decimal); break;
    case "nchar": commonType = typeof(string); break;
    case "ntext": commonType = typeof(string); break;
    case "numeric": commonType = typeof(decimal); break;
    case "nvarchar": commonType = typeof(string); break;
    case "real": commonType = typeof(Single); break;
    case "smalldatetime": commonType = typeof(DateTime); break;
    case "smallint": commonType = typeof(short); break;
    case "smallmoney": commonType = typeof(decimal); break;
    case "sql_variant": commonType = typeof(object); break;
    case "sysname": commonType = typeof(object); break;
    case "text": commonType = typeof(string); break;
    case "time": commonType = typeof(TimeSpan); break;
    case "timestamp": commonType = typeof(byte[]); break;
    case "tinyint": commonType = typeof(byte); break;
    case "uniqueidentifier": commonType = typeof(Guid); break;
    case "varbinary": commonType = typeof(byte[]); break;
    case "varchar": commonType = typeof(string); break;
    case "xml": commonType = typeof(string); break;
    default: commonType = typeof(object); break;
    }
    return commonType;
    }
    }
    #endregion

    #>

    -------------------------------------------------------------------------------------------------------》

    Manager.ttinclude

    -------------------------------------------------------------------------------------------------------》

    <#@ assembly name="System.Core"#>
    <#@ assembly name="System.Data.Linq"#>
    <#@ assembly name="EnvDTE"#>
    <#@ assembly name="System.Xml"#>
    <#@ assembly name="System.Xml.Linq"#>
    <#@ import namespace="System"#>
    <#@ import namespace="System.CodeDom"#>
    <#@ import namespace="System.CodeDom.Compiler"#>
    <#@ import namespace="System.Collections.Generic"#>
    <#@ import namespace="System.Data.Linq"#>
    <#@ import namespace="System.Data.Linq.Mapping"#>
    <#@ import namespace="System.IO"#>
    <#@ import namespace="System.Linq"#>
    <#@ import namespace="System.Reflection"#>
    <#@ import namespace="System.Text"#>
    <#@ import namespace="System.Xml.Linq"#>
    <#@ import namespace="Microsoft.VisualStudio.TextTemplating"#>
    <#+

    // Manager class records the various blocks so it can split them up
    class Manager {
    private class Block {
    public String Name;
    public int Start, Length;
    }

    private Block currentBlock;
    private List<Block> files = new List<Block>();
    private Block footer = new Block();
    private Block header = new Block();
    private ITextTemplatingEngineHost host;
    private StringBuilder template;
    protected List<String> generatedFileNames = new List<String>();

    public static Manager Create(ITextTemplatingEngineHost host, StringBuilder template) {
    return (host is IServiceProvider) ? new VSManager(host, template) : new Manager(host, template);
    }

    public void StartNewFile(String name) {
    if (name == null)
    throw new ArgumentNullException("name");
    CurrentBlock = new Block { Name = name };
    }

    public void StartFooter() {
    CurrentBlock = footer;
    }

    public void StartHeader() {
    CurrentBlock = header;
    }

    public void EndBlock() {
    if (CurrentBlock == null)
    return;
    CurrentBlock.Length = template.Length - CurrentBlock.Start;
    if (CurrentBlock != header && CurrentBlock != footer)
    files.Add(CurrentBlock);
    currentBlock = null;
    }

    public virtual void Process(bool split) {
    if (split) {
    EndBlock();
    String headerText = template.ToString(header.Start, header.Length);
    String footerText = template.ToString(footer.Start, footer.Length);
    String outputPath = Path.GetDirectoryName(host.TemplateFile);
    files.Reverse();
    foreach(Block block in files) {
    String fileName = Path.Combine(outputPath, block.Name);
    String content = headerText + template.ToString(block.Start, block.Length) + footerText;
    generatedFileNames.Add(fileName);
    CreateFile(fileName, content);
    template.Remove(block.Start, block.Length);
    }
    }
    }

    protected virtual void CreateFile(String fileName, String content) {
    if (IsFileContentDifferent(fileName, content))
    File.WriteAllText(fileName, content);
    }

    public virtual String GetCustomToolNamespace(String fileName) {
    return null;
    }

    public virtual String DefaultProjectNamespace {
    get { return null; }
    }

    protected bool IsFileContentDifferent(String fileName, String newContent) {
    return !(File.Exists(fileName) && File.ReadAllText(fileName) == newContent);
    }

    private Manager(ITextTemplatingEngineHost host, StringBuilder template) {
    this.host = host;
    this.template = template;
    }

    private Block CurrentBlock {
    get { return currentBlock; }
    set {
    if (CurrentBlock != null)
    EndBlock();
    if (value != null)
    value.Start = template.Length;
    currentBlock = value;
    }
    }

    private class VSManager: Manager {
    private EnvDTE.ProjectItem templateProjectItem;
    private EnvDTE.DTE dte;
    private Action<String> checkOutAction;
    private Action<IEnumerable<String>> projectSyncAction;

    public override String DefaultProjectNamespace {
    get {
    return templateProjectItem.ContainingProject.Properties.Item("DefaultNamespace").Value.ToString();
    }
    }

    public override String GetCustomToolNamespace(string fileName) {
    return dte.Solution.FindProjectItem(fileName).Properties.Item("CustomToolNamespace").Value.ToString();
    }

    public override void Process(bool split) {
    if (templateProjectItem.ProjectItems == null)
    return;
    base.Process(split);
    projectSyncAction.EndInvoke(projectSyncAction.BeginInvoke(generatedFileNames, null, null));
    }

    protected override void CreateFile(String fileName, String content) {
    if (IsFileContentDifferent(fileName, content)) {
    CheckoutFileIfRequired(fileName);
    File.WriteAllText(fileName, content);
    }
    }

    internal VSManager(ITextTemplatingEngineHost host, StringBuilder template)
    : base(host, template) {
    var hostServiceProvider = (IServiceProvider) host;
    if (hostServiceProvider == null)
    throw new ArgumentNullException("Could not obtain IServiceProvider");
    dte = (EnvDTE.DTE) hostServiceProvider.GetService(typeof(EnvDTE.DTE));
    if (dte == null)
    throw new ArgumentNullException("Could not obtain DTE from host");
    templateProjectItem = dte.Solution.FindProjectItem(host.TemplateFile);
    checkOutAction = (String fileName) => dte.SourceControl.CheckOutItem(fileName);
    projectSyncAction = (IEnumerable<String> keepFileNames) => ProjectSync(templateProjectItem, keepFileNames);
    }

    private static void ProjectSync(EnvDTE.ProjectItem templateProjectItem, IEnumerable<String> keepFileNames) {
    var keepFileNameSet = new HashSet<String>(keepFileNames);
    var projectFiles = new Dictionary<String, EnvDTE.ProjectItem>();
    var originalFilePrefix = Path.GetFileNameWithoutExtension(templateProjectItem.get_FileNames(0)) + ".";
    foreach(EnvDTE.ProjectItem projectItem in templateProjectItem.ProjectItems)
    projectFiles.Add(projectItem.get_FileNames(0), projectItem);

    // Remove unused items from the project
    foreach(var pair in projectFiles)
    if (!keepFileNames.Contains(pair.Key) && !(Path.GetFileNameWithoutExtension(pair.Key) + ".").StartsWith(originalFilePrefix))
    pair.Value.Delete();

    // Add missing files to the project
    foreach(String fileName in keepFileNameSet)
    if (!projectFiles.ContainsKey(fileName))
    templateProjectItem.ProjectItems.AddFromFile(fileName);
    }

    private void CheckoutFileIfRequired(String fileName) {
    var sc = dte.SourceControl;
    if (sc != null && sc.IsItemUnderSCC(fileName) && !sc.IsItemCheckedOut(fileName))
    checkOutAction.EndInvoke(checkOutAction.BeginInvoke(fileName, null, null));
    }
    }
    } #>

  • 相关阅读:
    堆栈学习
    需要阅读的书籍
    Rust Book Lang Ch.19 Fully Qualified Syntax, Supertraits, Newtype Pattern, type aliases, never type, dynamic sized type
    Rust Lang Book Ch.19 Placeholder type, Default generic type parameter, operator overloading
    Rust Lang Book Ch.19 Unsafe
    Rust Lang Book Ch.18 Patterns and Matching
    Rust Lang Book Ch.17 OOP
    Rust Lang Book Ch.16 Concurrency
    Rust Lang Book Ch.15 Smart Pointers
    HDU3966-Aragorn's Story-树链剖分-点权
  • 原文地址:https://www.cnblogs.com/hf-0712/p/6108242.html
Copyright © 2011-2022 走看看