`
shirlly
  • 浏览: 1652341 次
  • 性别: Icon_minigender_2
  • 来自: 福州
社区版块
存档分类
最新评论

dotnet代码自动生成机的实现(1)

    博客分类:
  • .NET
阅读更多
在我们写程序的时候,特别是数据库应用程序的时候,经常会遇到这样的情况:对于一个给定的表,写出这个表对应的类(用一句时髦的话说是实现业务实体类),类的数据成员是所有的字段,并且类含有该表的添加修改删除等操作。还有,对于一个给定的存储过程,要完成根据存储过程存取数据或别的数据库操作。如下代码就是我们通常要完成的:
1.表的业务实体化

private int iId;
        public int Id
        {
            get
            {
                return iId;
            }
            set
            {
                iId = value;
            }
        }


        private string strName;
        public string Name
        {
            get
            {
                return strName;
            }
            set
            {
                strName = value;
            }
        }


        private string strCode;
        public string Code
        {
            get
            {
                return strCode;
            }
            set
            {
                strCode = value;
            }
        }


        private string strDescription;
        public string Description
        {
            get
            {
                return strDescription;
            }
            set
            {
                strDescription = value;
            }
        }


        private int iFatherid;
        public int Fatherid
        {
            get
            {
                return iFatherid;
            }
            set
            {
                iFatherid = value;
            }
        }


        private int iType;
        public int Type
        {
            get
            {
                return iType;
            }
            set
            {
                iType = value;
            }
        }


        private int iUserId;
        public int UserId
        {
            get
            {
                return iUserId;
            }
            set
            {
                iUserId = value;
            }
        }
 


对表的增加、修改操作
public bool Add()
        {
            SqlConnection conn = SqlConn.Instance().Connection;

            string strSql = "insert into book(id, Name, Code, Description, Fatherid, Type, UserId)"
            + "values(@id, @Name, @Code, @Description, @Fatherid, @Type, @UserId)";

            SqlCommand command = new SqlCommand(strSql, conn);

            command.Parameters.Add("@id", SqlDbType.Int);
            command.Parameters["@id"].value = iId;

            command.Parameters.Add("@Name", SqlDbType.NVarChar, 50);
            if (strName != null)
                command.Parameters["@Name"].value = strName;
            else
                command.Parameters["@Name"].value = DBNull.value;

            command.Parameters.Add("@Code", SqlDbType.NVarChar, 255);
            if (strCode != null)
                command.Parameters["@Code"].value = strCode;
            else
                command.Parameters["@Code"].value = DBNull.value;

            command.Parameters.Add("@Description", SqlDbType.NVarChar, 255);
            if (strDescription != null)
                command.Parameters["@Description"].value = strDescription;
            else
                command.Parameters["@Description"].value = DBNull.value;

            command.Parameters.Add("@Fatherid", SqlDbType.Int);
            command.Parameters["@Fatherid"].value = iFatherid;

            command.Parameters.Add("@Type", SqlDbType.Int);
            command.Parameters["@Type"].value = iType;

            command.Parameters.Add("@UserId", SqlDbType.Int);
            command.Parameters["@UserId"].value = iUserId;

            try
            {
                conn.Open();
                command.ExecuteNonQuery();
                return true;
            }
            catch (Exception e)
            {
                throw (new Exception("Error in the Database" + e.Message));
            }
            finally
            {
                conn.Close();
            }
        }
        public bool Modify()
        {
            SqlConnection conn = SqlConn.Instance().Connection;
            string strSql = "update book set id = @id, Name = @Name, Code = @Code, Description = @Description, Fatherid = @Fatherid, Type = @Type, UserId = @UserId "
            + " where id =@id ";
            SqlCommand command = new SqlCommand(strSql, conn);
            command.Parameters.Add("@id", SqlDbType.Int);
            command.Parameters["@id"].value = iId;

            command.Parameters.Add("@Name", SqlDbType.NVarChar, 50);
            command.Parameters["@Name"].value = strName;

            command.Parameters.Add("@Code", SqlDbType.NVarChar, 255);
            command.Parameters["@Code"].value = strCode;

            command.Parameters.Add("@Description", SqlDbType.NVarChar, 255);
            command.Parameters["@Description"].value = strDescription;

            command.Parameters.Add("@Fatherid", SqlDbType.Int);
            command.Parameters["@Fatherid"].value = iFatherid;

            command.Parameters.Add("@Type", SqlDbType.Int);
            command.Parameters["@Type"].value = iType;

            command.Parameters.Add("@UserId", SqlDbType.Int);
            command.Parameters["@UserId"].value = iUserId;

            try
            {
                conn.Open();
                command.ExecuteNonQuery();
                return true;
            }
            catch (Exception e)
            {
                throw (new Exception("Error in the Database" + e.Message));
            }
            finally
            {
                conn.Close();
            }
        }


存储过程
public bool ExeSP_ddms_Modify_Trx(
                    int aiPrsn_trx_no,
                    int aiUlt_incid_no,
                    int aiPrsn_trx_status_cd,
                    DateTime adtTrx_cmpl_dt,
                    string astrEmail_addr)
        {
            SqlConnection conn = SqlConn.Instance().Connection;

            string strSPName = "ddms_Modify_Trx";
            SqlCommand command = new SqlCommand(strSPName, conn);
            command.CommandType = CommandType.StoredProcedure;

            command.Parameters.Add("@prsn_trx_no", SqlDbType.SmallInt);
            command.Parameters["@prsn_trx_no"].value = aiPrsn_trx_no;

            command.Parameters.Add("@ult_incid_no", SqlDbType.Int);
            command.Parameters["@ult_incid_no"].value = aiUlt_incid_no;

            command.Parameters.Add("@prsn_trx_status_cd", SqlDbType.Int);
            command.Parameters["@prsn_trx_status_cd"].value = aiPrsn_trx_status_cd;

            command.Parameters.Add("@trx_cmpl_dt", SqlDbType.DateTime);
            if (adtTrx_cmpl_dt != DateTime.Minvalue)
                command.Parameters["@trx_cmpl_dt"].value = adtTrx_cmpl_dt;
            else
                command.Parameters["@trx_cmpl_dt"].value = DBNull.value;

            command.Parameters.Add("@email_addr", SqlDbType.VarChar, 70);
            if (astrEmail_addr != null)
                command.Parameters["@email_addr"].value = astrEmail_addr;
            else
                command.Parameters["@email_addr"].value = DBNull.value;

            try
            {
                conn.Open();
                command.ExecuteNonQuery();
                return true;
            }
            catch (Exception e)
            {
                throw (new Exception("Error in the Database" + e.Message));
            }
            finally
            {
                conn.Close();
            }
        }


上面处理表的代码也挺长的,但那只是7个字段,如果一个表含有二三十个字段的话,恐怕代码更长,同样,检查你写好的代码是否有错误也是一个痛苦的过程。
但是,写这些代码本身并没有多少难度,而且很多工作都是重复的,这就不能不启发我们通过一个程序来完成这些繁琐易出错的工作。
假如让我们来设计一个程序完成上面的代码,我们应该怎么做哪?

要完成上面的工作,我们首先应该找到我们要处理的表或存储过程。
我们也可以通过编程实现:
1.列出所有的数据库服务器
public static ArrayList GetServerList()
        {
            ArrayList alServers = new ArrayList();
            SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass();
            try
            {
                SQLDMO.NameList serverList = sqlApp.ListAvailableSQLServers();
                for (int i = 1; i <= serverList.Count; i++)
                {
                    alServers.Add(serverList.Item(i));
                }
            }
            catch (Exception e)
            {
                throw (new Exception("取数据库服务器列表出错:" + e.Message));
            }
            finally
            {
                sqlApp.Quit();
            }
            return alServers;
        }

这样,所有的数据库服务器迷宫凝成都存在了ArrayList里,我们可以用一个下拉列表来列出所有的服务器,让用户选择他需要的一个。
2。得到选定服务器所有的数据库列表
要完成这个工作,我们需要用户输入这个数据库服务器的用户名和密码,代码如下:
public static ArrayList GetDbList(string strServerName, string strUserName, string strPwd)
        {
            ArrayList alDbs = new ArrayList();
            SQLDMO.Application sqlApp = new SQLDMO.ApplicationClass();
            SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass();
            try
            {
                svr.Connect(strServerName, strUserName, strPwd);
                foreach (SQLDMO.Database db in svr.Databases)
                {
                    if (db.Name != null)
                        alDbs.Add(db.Name);
                }
            }
            catch (Exception e)
            {
                throw (new Exception("连接数据库出错:" + e.Message));
            }
            finally
            {
                svr.DisConnect();
                sqlApp.Quit();
            }
            return alDbs;
        } 

这样就得到了数据库的列表,你同样可以让用户选择一个数据库。
3。列出选定数据库所有的用户表和存储过程
在这一步我们不用SQLDMO了,我们通过读取选定数据库的sysobjects表中的记录实现,当然,完成这个工作需要如下信息:你选择的数据库服务器名,用户名,密码,数据库名等信息:
 public static ArrayList GetTableList(string strServerName, string strDBName, string strUserName, string strPwd)
        {
            string strConStr = " data source=" + strServerName + ";initial catalog=" + strDBName +
            ";password=" + strPwd + ";persist security info=True;user id=" + strUserName;
            SqlConnection conn = new SqlConnection(strConStr);

            ArrayList alTbs = new ArrayList();

            string strSql = "select * from sysobjects where (xtype='u' or xtype='p') and category<>2 order by name";
            SqlCommand comm = new SqlCommand(strSql, conn);

            SqlDataReader sr = null;
            try
            {
                conn.Open();
                sr = comm.ExecuteReader();
                while (sr.Read())
                {
                    string strName = sr["name"].ToString();
                    bool blTable = sr["xtype"].ToString().Trim().ToUpper() == "U" ? true : false;
                    TableInfo tb = new TableInfo(strName, blTable);
                    alTbs.Add(tb);
                }

            }
            catch (Exception err)
            {
                throw (new Exception("取表明列表出错:" + err.Message));
            }
            finally
            {
                if (sr != null)
                {
                    sr.Close();
                    sr = null;
                }
                conn.Close();
            }
            return alTbs;
        }

这样我们就得到了所有的用户表和存储过程,注意这一句:
select * from sysobjects where (xtype='u' or xtype='p') and category<>2 order by name,这是关键的sql语句,其中xtype='u' 表示用户表,xtype='p'表示存储过程,category<>2表示不是系统存储过程。


下一步是取得选定表的所有字段或存储过程的所有参数
我们从表syscolumns取得我们想要到的东西:
strTableName = tbInfo.Name ;
string strSql = "select * from syscolumns where id=( " +
" select id from sysobjects where name='"+ strTableName + "')" ;

SqlDataAdapter sa = new SqlDataAdapter(strSql,conn) ;
DataSet ds = new DataSet() ;
sa.Fill(ds) ;
这样我们就把某个表(或存储过程)的所有字段信息放到了结果集ds里。
分享到:
评论

相关推荐

    动软代码自动生成器(DOTNET三层开发)

    标题中的“动软代码自动生成器(DOTNET三层开发)”是一款专为.NET开发者设计的工具,主要用于加速.NET框架下的三层架构开发。三层架构是一种常见的软件设计模式,它将应用程序分为表现层(UI)、业务逻辑层(BLL)和...

    DotNet代码生成器_动软

    DotNet代码生成器是针对微软的.NET框架设计的一款高效开发工具,主要目的是为了加速软件开发过程,通过自动化的方式自动生成符合特定需求的源代码。动软作为该代码生成器的品牌,旨在提供简单易用且功能强大的解决...

    dotnet-一个用于解析swaggerjson生成符合WebApiClient接口代码的代码生成工具

    标题中的“dotnet-一个用于解析swaggerjson生成符合WebApiClient接口代码的代码生成工具”指出,这是一个基于.NET框架的工具,其主要功能是解析Swagger JSON格式的文档,自动生成符合WebApiClient规范的接口代码。...

    dotnet format 忽略生成代码的格式化.rar

    4. **自动生成代码的处理**:详细阐述如何在使用Roslyn analyzers、T4模板、Source Generators等自动生成代码时,确保它们不受dotnet format影响。 5. **案例分析**:提供具体的项目案例,展示如何在实际开发中配置...

    基于T4引擎的代码自动生成器

    总结来说,基于T4引擎的代码自动生成器是一种强大的工具,结合了模板语言和编程逻辑,实现了代码的自动化生成。通过合理利用这个工具,开发者可以显著提升开发效率,专注于更高级别的业务逻辑和创新,而不是沉溺于...

    dotnet 用 SourceGenerator 源代码生成技术实现中文编程语言.rar

    这对于生成元数据、自动生成API绑定或者在编译时执行特定逻辑非常有用。 在本案例中,我们关注的是使用SourceGenerator实现中文编程语言的支持。这可能涉及到解析和理解中文关键字、标识符,以及构建相应的语法解析...

    C#自动代码生成器源码

    本资源是C#语言实现的自动代码生成器的源码,其主要功能是根据数据结构自动生成数据表的实体类(Entity)和数据操作类(Access)。 【描述】:“C#代码生成器源码,可根据数据结构生成数据表的实体(Entity),数据...

    C#自动生成.cs文件

    在C#编程中,自动生成.cs文件是一种常见的需求,它可以帮助开发者提高效率,减少重复劳动,尤其是在处理大量相似代码或需要遵循特定模板时。本文将深入探讨如何在C#环境中自动生成.cs文件,并涵盖相关技术点。 首先...

    dotnet-dotnetformat是dotnet的代码格式化程序

    6. **性能优化**:通过自动化代码格式化,可以减少手动调整代码格式的时间,让开发者更专注于业务逻辑的实现。 **总结** dotnet-format是.NET开发中一个非常实用的代码格式化工具,它能够帮助开发者保持代码的一致...

    CodeSmith.Pro.4.1.2 DotNet 代码生成工具

    。Net下的强大的代码生成工具 可以对实体类自动生存,自动与数据库映射

    dotnet 使用增量源代码生成技术的 Telescope 库导出程序集类型.rar

    例如,在数据绑定和接口实现中,Telescope库可以自动生成必要的代码,减少手动工作量。此外,当业务逻辑或界面设计发生变化时,增量源代码生成能确保仅更新相关的部分,而不会影响整个项目的编译速度。 在实际开发...

    dotnet-KalmanStudio开发辅助工具内置基于T4的代码生成器

    总结而言,dotnet-KalmanStudio凭借其内置的T4代码生成器,为.NET开发者提供了一个高效、灵活的工具,不仅能够根据数据库元数据自动生成代码,还能适应不同的开发框架和项目需求。通过深入学习和熟练运用,开发者...

    自动生成实体类....

    T4模板是一种代码生成技术,允许开发者编写模板,然后在编译时自动生成代码。 4. **手工编写但利用代码生成器辅助**:虽然手工编写实体类可能费时,但有些开发者会选择半自动化的方式,使用数据库设计工具导出表...

    dotnet-SoEasyPlatform一款轻量级开源的代码生成器

    同时,SoEasyPlatform的灵活性还体现在对数据库表结构的快速映射,能自动生成符合规范的代码,大大节省了编写数据访问层代码的时间。 在技术实现上,SoEasyPlatform所依赖的DLL组件均开源,可以在GitHub上获取源...

    Ascgen dotNET.rar

    Ascgen是一款知名的代码生成工具,尤其在.NET框架下,它为开发者提供了高效便捷的代码自动化生成服务。本文将深入探讨Ascgen在dotNET平台上的使用方法、功能特性以及其在实际开发中的重要性。 一、Ascgen简介 ...

    dotnet-微软开源的一种用于检测近似重复源代码的简单工具

    1. **代码扫描**:遍历整个代码库,提取每个代码片段。 2. **相似度计算**:使用特定的算法计算每个代码片段之间的相似度。 3. **阈值设置**:用户可以根据需求设定相似度阈值,低于该阈值的被视为不重复。 4. **...

    dotnet-TexturaCode是RoslynAPI的包装器用于生成保存和编译C代码

    这在动态构建代码库、自动生成测试代码或者实现元编程场景时,具有很高的价值。 `Textura.Code`中的主要功能包括但不限于以下几点: 1. **类生成**:你可以创建新的类,并为其指定命名空间、访问修饰符、基类和...

    dotnet-AutoUpdate基于WPF框架的自动更新软件

    总的来说,“dotnet-AutoUpdate”是.NET开发中的一个实用工具,它利用WPF的强大力量,简化了软件自动更新的实现过程。对于.NET开发者来说,掌握这样的工具和原理,有助于提升软件的生命周期管理和用户体验,同时也是...

    dotnet-dotnetscript用于从数据库表和视图中生成POCO类

    标题中的“dotnet-dotnetscript”是一个基于.NET的命令行工具,主要用于运行.NET脚本,而这个工具在描述中提到的特殊应用场景是从数据库的表和视图中自动生成POCO(Plain Old C# Object)类。POCO类是C#中一种简单的...

Global site tag (gtag.js) - Google Analytics