分享最近抽空写的一个代码生成器,集成EasyDBUtility数据库访问帮助类

一直想写一个自己的代码生成器,但是因为工作事情多,一直搁置下来,最近下决心终于利用下班时间写完了,现在分享给有需要的朋友,代码生成器集成EasyDBUtility数据库访问帮助类,暂时只支持sqlserver数据库,界面如下

部分代码如下

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using EasyDBUtility;

namespace CodeGenerator
{
    /// <summary>
    /// 生成sqlserver相关代码
    /// </summary>
    public class SqlServer
    {
        //获取所有数据库名称
        public const string Get_DataBaseName_SQL = "SELECT Name FROM Master..SysDatabases where Name not in(‘master‘,‘model‘,‘msdb‘,‘tempdb‘) ORDER BY Name";
        //获取指定数据库中所有表名
        public const string Get_Tables_SQL = "SELECT Name FROM [{0}]..SysObjects Where XType=‘U‘ ORDER BY Name";
        //获取指定数据库中所有视图
        public const string Get_Views_SQL = "SELECT Name FROM [{0}]..SysObjects Where XType=‘V‘ ORDER BY Name";
        //获取指定数据库中所有存储过程
        public const string Get_Procedures_SQL = "SELECT Name FROM [{0}]..SysObjects Where XType=‘P‘ ORDER BY Name";
        //获取指定表或视图中的所有列信息
        public const string Get_Columns_SQL = "select a.name,b.name typeName,a.is_identity,a.is_nullable from sys.columns a " +
                    "left join sys.types b on a.user_type_id=b.user_type_id where a.object_id=object_id(‘{0}‘) order by column_id";
        //获取指定表中主键信息
        public const string GetPKeys_SQL = "Declare @objectid int;Set @objectid=object_id(‘{0}‘);Select col_name(@objectid,colid) " +
            "From sysobjects as o Inner Join sysindexes as i On i.name=o.name Inner Join sysindexkeys as k On k.indid=i.indid " +
            "Where o.xtype = ‘PK‘ and [email protected] and [email protected]";
        //获取指定列的数据类型
        public const string Get_Type_Name_SQL = "SELECT type_name(user_type_id) as [type_name] FROM sys.columns where [object_id] = object_id(‘{0}‘) and [name] = ‘{1}‘";

        /// <summary>
        /// 生成业务逻辑层代码
        /// </summary>
        /// <param name="tableName">表名</param>
        /// <param name="connectionString">数据库连接字符串</param>
        /// <param name="paramsData">生成参数</param>
        /// <returns></returns>
        public static string CreateBLL(string tableName, string connectionString, ParamsData paramsData)
        {
            string primaryKeyName = string.Empty;//主键名称
            string primaryKeyTypeName = string.Empty;//主键数据类型

            SqlHelper helper = new SqlHelper(connectionString);
            helper.AutoClose = false;
            //获取表的主键列名称
            helper.CreateCommand(string.Format(GetPKeys_SQL, tableName));
            object primaryKeyObj = helper.ExecuteScalar();
            if (primaryKeyObj != null)
            {
                primaryKeyName = primaryKeyObj.ToString();
                helper.CommandText(string.Format(Get_Type_Name_SQL, tableName, primaryKeyName));
                primaryKeyTypeName = helper.ExecuteScalar().ToString();
            }
            else
            {
                //获取表的所有列信息
                helper.CommandText(string.Format(SqlServer.Get_Columns_SQL, tableName));
                List<ColumnsData> columnList = helper.ExecuteReader<ColumnsData>();
                ColumnsData columnsData = (from col in columnList where col.Is_identity == true select col).FirstOrDefault();
                if (columnsData != null)
                {
                    primaryKeyName = columnsData.Name;
                    primaryKeyTypeName = columnsData.TypeName;
                }
            }
            helper.Close();
            if (string.IsNullOrEmpty(primaryKeyName) || string.IsNullOrEmpty(primaryKeyTypeName))
            {
                throw new Exception("在表“" + tableName + "”中没有找到主键或自增列,无法生成BLL代码!请设置表的主键或自增列后再重试!");
            }

            string deleteThePrefixTheTableName = frmMain.GetDeleteThePrefixTheTableName(tableName, paramsData);//生成的类名
            string parameterName = primaryKeyName.Substring(0, 1).ToLower() + primaryKeyName.Substring(1);
            StringBuilder bll = new StringBuilder();
            bll.Append("using System.Collections.Generic;\r\n");
            if (paramsData.Architecture == Architecture.反射工厂模式)
                bll.Append("using DALFactory;\r\n");
            bll.Append("using " + paramsData.IDALNamespace + "\r\n");
            bll.Append("using " + paramsData.ModelNamespace + "\r\n\r\n");
            bll.Append("namespace " + paramsData.BLLNamespace + "\r\n");
            bll.Append("{\r\n    ");
            bll.Append("public class " + deleteThePrefixTheTableName + paramsData.BLLSuffix + "\r\n    ");
            bll.Append("{\r\n        ");
            if (paramsData.Architecture == Architecture.反射工厂模式)
            {
                bll.Append("private static readonly I" + deleteThePrefixTheTableName + " dal = DataAccess.CreateInstance<I" + deleteThePrefixTheTableName + ">(\""
                    + deleteThePrefixTheTableName + paramsData.DALSuffix + "\");\r\n\r\n");
            }
            else if (paramsData.Architecture == Architecture.简单三层)
            {
                bll.Append("private static readonly " + deleteThePrefixTheTableName + paramsData.DALSuffix + " dal = new " + deleteThePrefixTheTableName + paramsData.DALSuffix + "();\r\n\r\n");
            }
            //新增方法
            if (paramsData.CreateInsertMethod)
            {
                bll.Append("        public static bool " + paramsData.InsertMethodName + "(" + deleteThePrefixTheTableName + paramsData.ModelSuffix + " data)\r\n        ");
                bll.Append("{\r\n            ");
                bll.Append("return dal." + paramsData.InsertMethodName + "(data);\r\n        ");
                bll.Append("}\r\n\r\n");
            }
            //删除
            if (paramsData.CreateDeleteMethod)
            {
                bll.Append("        public static bool " + paramsData.DeleteMethodName + "(" + ChangeToCSharpType(primaryKeyTypeName, false) + " " + parameterName + ")\r\n        ");
                bll.Append("{\r\n            ");
                bll.Append("return dal." + paramsData.DeleteMethodName + "(" + parameterName + ");\r\n        ");
                bll.Append("}\r\n\r\n");
            }
            //批量删除
            if (paramsData.CreateBatchDeleteMethod)
            {
                bll.Append("        public static bool " + paramsData.BatchDeleteMethodName + "(" + ChangeToCSharpType(primaryKeyTypeName, false) + "[] " + parameterName + ")\r\n        ");
                bll.Append("{\r\n            ");
                bll.Append("return dal." + paramsData.BatchDeleteMethodName + "(" + parameterName + ");\r\n        ");
                bll.Append("}\r\n\r\n");
            }
            //修改
            if (paramsData.CreateUpdateMethod)
            {
                bll.Append("        public static bool " + paramsData.UpdateMethodName + "(" + deleteThePrefixTheTableName + paramsData.ModelSuffix + " data)\r\n        ");
                bll.Append("{\r\n            ");
                bll.Append("return  dal." + paramsData.UpdateMethodName + "(data);\r\n        ");
                bll.Append("}\r\n\r\n");
            }
            //查询
            if (paramsData.CreateSelectMethod)
            {
                bll.Append("        public static " + deleteThePrefixTheTableName + paramsData.ModelSuffix + " " + paramsData.SelectMethodName + "(" + ChangeToCSharpType(primaryKeyTypeName, false) + " " + parameterName + ")\r\n        ");
                bll.Append("{\r\n            ");
                bll.Append("return dal." + paramsData.SelectMethodName + "(" + parameterName + ");\r\n        ");
                bll.Append("}\r\n\r\n");
            }
            //查询所有
            if (paramsData.CreateSelectAllMethod)
            {
                bll.Append("        public static IList<" + deleteThePrefixTheTableName + paramsData.ModelSuffix + "> " + paramsData.SelectAllMethodName + "()\r\n        ");
                bll.Append("{\r\n            ");
                bll.Append("return dal." + paramsData.SelectAllMethodName + "();\r\n        ");
                bll.Append("}\r\n\r\n");
            }
            bll.Append("    }\r\n");
            bll.Append("}");
            return bll.ToString();
        }
}

执行文件下载地址:http://pan.baidu.com/s/1sjptNsh 解压密码:shili

源码有进行大量注释,考虑了可扩展性,如果新增其他数据库支持,很容易方便加入。

需要源码的留下邮箱。

分享最近抽空写的一个代码生成器,集成EasyDBUtility数据库访问帮助类,布布扣,bubuko.com

时间: 2024-10-05 18:39:45

分享最近抽空写的一个代码生成器,集成EasyDBUtility数据库访问帮助类的相关文章

一个C#的XML数据库访问类

原文地址:http://hankjin.blog.163.com/blog/static/33731937200942915452244/ 程序中不可避免的要用到配置文件或数据,对于数据量比较小的程序,部署数据库花费的时间就显得浪费了,因此用XML来存储不妨为一个很好的办法,而且结合C#的DataSet,我们可以很轻易的封装出一个代码简单而功能强大的数据访问类XMLConfigconfig.xml<root>  <table1>    <rowName1>hello&l

分享个刚写好的 android 的 ListView 动态加载类,功能全而代码少。

(转载声明出处:http://www.cnblogs.com/linguanh/) 简介:      该ListView 实现动态加载数据,为了方便用户充分地自定义自己的数据源.点击事件,等核心操作,本类采用接口形式提供上述具体操作!      1,所有关键的操作使用接口,由用户自己定义,              包括:数据适配器的配置.动态加载函数的配置.item点击接口;      2,已经新建线程来执行动态函数.      //3,提供一个默认的动态执行函数; 用法: 你只需要在自己的

最近采集写的一个超简单实用的HTML解析类

1. [文件] HtmlDom.php <?php$oldSetting = libxml_use_internal_errors( true ); libxml_clear_errors();/** *  * -+----------------------------------- * |PHP5 Framework - 2011 * |Web Site: www.iblue.cc * |E-mail: [email protected] * |Date: 2012-10-12 * -+--

ASP.NET:分享一个操作SQL Server数据库的工具类

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Collections; 6 using System.Data.SqlClient; 7 8 public class DatabaseHelper 9 { 10 private string connectionString = Constants.ConnectionURL;

分享我的数据库访问帮助类EasyDBUtility.dll C#

今天有幸被召回母校给即将毕业的学弟学妹们讲我这两年的工作史,看了下母校没啥特别的变化,就是寝室都安了空调,学妹们都非常漂亮而已..好了不扯蛋了,说下今天的主题吧.这些天我在深度定制语法高亮功能的同时发现了博客园提供的一些有意思的函数,甚至有几个博客园都没用到,我也不知道怎么才能触发那些功能..打开这个js就可以看到很多好用的东西了,虽然写的不怎么样,但是至少有这些功能. ps: 推荐安装一个代码格式化的插件,否则一坨看着蛋疼.比如第一个就是 log,方便调试. http://www.ebay.c

我也来写:数据库访问类DBHelper

一.前言 相信许多人都百度过:“.net 数据库访问类”.然后就出来一大堆SqlHelper.我也用过这些SqlHelper,也自己写过,一堆静态方法,开始使用起来感觉很不错,它们也确实在很多时候可以很好的工作.ADO.NET已经封装很好了,我们很容易就可以实现自己的数据库访问类. 很久前,忘记在哪里看到过了,有一个朋友写了一篇[如何做一个好用的数据库访问类](有兴趣的朋友仍然可以搜索到),这篇文章确实写得很好,作者很详细的讲解了如何设计一个好的数据库访问类:所谓“好“是指:轻量.易用.通用.高

我也来写:数据库访问类DBHelper(转)

一.前言 相信许多人都百度过:“.net 数据库访问类”.然后就出来一大堆SqlHelper.我也用过这些SqlHelper,也自己写过,一堆静态方法,开始使用起来感觉很不错,它们也确实在很多时候可以很好的工作.ADO.NET已经封装很好了,我们很容易就可以实现自己的数据库访问类. 很久前,忘记在哪里看到过了,有一个朋友写了一篇[如何做一个好用的数据库访问类](有兴趣的朋友仍然可以搜索到),这篇文章确实写得很好,作者很详细的讲解了如何设计一个好的数据库访问类:所谓“好“是指:轻量.易用.通用.高

写了一个DELPHI操作USB摄像头类分享给大家

最近在使用Usb摄像头做了个项目,其中写了一个操作usb摄像头类分享给大家 {*******************************************************} { } { 操作USB摄像头类 } { } { 作者:lqen } { 日期:2015.05.18 } { } {*******************************************************} unit untUsbCamera; interface uses Window

iOS-如何写好一个UITableView

如何写好一个UITableView 字数5787 阅读3745 评论25 喜欢69 本文是直播分享的简单文字整理,直播共分为上.下两部分.第一部分:优酷 Or YouTube,第二部分:优酷 Demo 地址:KtTableView 如果你觉得 UITableViewDelegate 和 UITableViewDataSource 这两个协议中有大量方法每次都是复制粘贴,实现起来大同小异:如果你觉得发起网络请求并解析数据需要一大段代码,加上刷新和加载后简直复杂度爆表,如果你想知道为什么下面的代码可