【分享帖】一个存储过程一分钟一键生成所有实体类

ycproc 2012-05-02 10:17:53
加精

文章在我博客时间太长了,看到点击量太少就贴出来主动分享吧!借马桶哥的花献佛

存储过程:


set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

create proc [dbo].[p_db_wsp]
@dbname varchar(50), --数据库名
@path varchar(100), --实体类所在目录名,如D:/My/Models
@namespace varchar(50) --实体类命名空间,默认值为Models
as
--判断数据库是否存在
if(db_id(@dbname)is not null)
begin
if(isnull(@namespace,'')='')
set @namespace='Models'
-- 允许配置高级选项
EXEC sp_configure 'show advanced options', 1
-- 重新配置
RECONFIGURE
-- 启用Ole Automation Procedures
EXEC sp_configure 'Ole Automation Procedures', 1
-- 启用xp_cmdshell,可以向磁盘中写入文件
EXEC sp_configure 'xp_cmdshell', 1
-- 重新配置
RECONFIGURE
declare @dbsql varchar(1000),@tablename varchar(100)
set @dbsql='declare wsp cursor for select name from '+@dbname+'..sysobjects where xtype=''u'' and name <>''sysdiagrams'''
exec(@dbsql)
open wsp
fetch wsp into @tablename--使用游标循环遍历数据库中每个表
while(@@fetch_status=0)
begin
--根据表中字段组合实体类中的字段和属性
declare @nsql nvarchar(4000),@sql varchar(8000)
set @nsql='select @s=isnull(@s+char(9)+''private '',''using System;'+char(13)+'using System.Collections.Generic;'
+char(13)+'using System.Text;'+char(13)+'namespace '+@namespace+char(13)+
'{'+char(13)+char(9)+'public class '+@tablename+char(13)+'{''+char(13)+char(9)+''private '')+
case when a.name in(''image'',''uniqueidentifier'',''ntext'',''varchar'',''ntext'',''nchar'',''nvarchar'',''text'',''char'') then ''string''
when a.name in(''tinyint'',''smallint'',''int'',''bigint'') then ''int''
when a.name in(''datetime'',''smalldatetime'') then ''DateTime''
when a.name in(''float'',''decimal'',''numeric'',''money'',''real'',''smallmoney'') then ''decimal''
when a.name =''bit'' then ''bool''
else a.name end+'' ''+lower(''_''+b.name)+'';''+char(13)+char(9)+''public ''+
case when a.name in(''image'',''uniqueidentifier'',''ntext'',''varchar'',''ntext'',''nchar'',''nvarchar'',''text'',''char'') then ''string''
when a.name in(''tinyint'',''smallint'',''int'') then ''int''
when a.name=''bigint'' then ''long''
when a.name in(''datetime'',''smalldatetime'') then ''DateTime''
when a.name in(''float'',''decimal'',''numeric'',''money'',''real'',''smallmoney'') then ''decimal''
when a.name =''bit'' then ''bool''
else a.name end
+'' ''+b.name+char(13)+char(9)+''{''+char(13)+char(9)+char(9)+''get{return ''+lower(''_''+b.name)+'';}''+
char(13)+char(9)+char(9)+''set{''+lower(''_''+b.name)+''=value;}''+char(13)+char(9)+''}''+char(13)
from '+@dbname+'..syscolumns b,
(select distinct name,xtype from '+@dbname+'..systypes where status=0) a
where a.xtype=b.xtype and b.id=object_id('''+@dbname+'..'+@tablename+''')'
exec sp_executesql @nsql,N'@s varchar(8000) output',@sql output
set @sql=@sql+char(9)+'}'+char(13)+'}'
--print @sql
DECLARE @err INT,@fso INT,@fleExists BIT,@file VARCHAR(100)
SET @file=@path+'/'+@tablename+'.cs'
EXEC @err=sp_OACreate 'Scripting.FileSystemObject',@fso OUTPUT
EXEC @err=sp_OAMethod @fso, 'FileExists',@fleExists OUTPUT,@file
EXEC @err = sp_OADestroy @fso

IF @fleExists!=0
exec('exec xp_cmdshell ''del '+@file+'''') --存在则删除
exec('exec xp_cmdshell ''echo '+@sql+' > '+@file+'''') --将文本写进文件中
set @sql=null
fetch wsp into @tablename
end
close wsp
deallocate wsp
print '生成成功!'
end
else
print '数据库不存在!'



调用示例:

exec [dbo].[p_db_wsp]
'数据库名',
'如果你的项目在那个文件夹下面就直接写物理路径。例如:D:/My/Models',
'你需要给定的命名空间名称'


使用:
打开解决方案,点击解决方案资源管理器的“显示所有文件”
看到生成的文件后鼠标右键选中,包括在项目中!
1分钟内Model生成完毕。

...全文
2088 88 打赏 收藏 转发到动态 举报
写回复
用AI写文章
88 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuguv 2012-10-17
  • 打赏
  • 举报
回复
去 LZ空间看看。
adjt2011 2012-10-17
  • 打赏
  • 举报
回复
不错..谢谢楼主分享
让IE灭亡 2012-08-06
  • 打赏
  • 举报
回复
不错,虽然我们现在都在使用EF了,还是顶个
yzf86211861 2012-08-06
  • 打赏
  • 举报
回复
感谢分享
zhangdaowu5 2012-08-06
  • 打赏
  • 举报
回复
http://blog.csdn.net/zhangdaowu5/article/details/7836098

  • 打赏
  • 举报
回复
Moon.ORM技术全攻略

一.绪论

本文主要是针对Moon.ORM的技术的讨论及其使用使用指导.如有其它疑问,请留言.本文从实际出发解析Moon.ORM.(技术群:
216965349
)


<fieldset><legend>关于实体框架</legend>
微软不久前开源了EF5.0,获取了其代码发现并不能编译,大致看了其代码.优雅便捷可谓正统,但其实战性仍待提高.

1)Linq不能为我们生成理想的sql,而且linq自身的性能有损失.这是EF不得不面主要的问题.没有完美的东西只有平衡点--没有银弹

2)linq不能解决复杂度较高的查询;而且微软一开始试图忽视数据库的存在,但这是绝对不可能的.大家自己去思考.

3)多数据库多数据源问题解决较为麻烦;

4)仅仅支持.net 4.5,目前无法在windows 2003上运行.

EF 的优点诸多不必多说. Linq的优缺点似乎也成了EF的优缺点之一.微软想通过Linq让我们以一种面向数据对象的方式来思考,及持久化他们的数据.可是我们可想想数据库的中 的记录难道就不是对象了?Linq给人以优雅和便捷我想这是他明显的优势,然后就是匿名对象在其中发挥的重要作用.
...</fieldset>

二.Moon.ORM的特色及优势

----但凡众多的智慧都是及其简单的,但不为人所知.这也是Moon.ORM的主要特色:大道至简.

1.高性能是Moon.ORM优势之一,也是我架构它的主要目的之一,如以前我说的那样,是为了弥补项目中遇到的性能问题而设计.可以说对于整个框架数据 处理上采用了纯的ADO.NET进行封装同时结合了EMIT达到快速生成实体的目的(当然到时候也可以用4.0的代码生成器完成纯ADO.NET的开 发).我不得不承认linq和lambda语句带来的优雅,但同时我们需要承认linq的局限性.或许有人说可以通过手段进行一些弥补,如有人以提高 linq性能来写文章一样,但我们需要承认两个事实,每次对linq的系统识别后才能进行优化,也就是说,linq的天性决定有性能损失.再次linq不 是银弹,因为负责的场合linq几乎是做不到的,何况linq生成的sql不一定是你真正要的.(注意:我不是敌对linq,而是说实话,正如曾说:实际开发中没有银弹,只有平衡点,适合需求能解决实际情况的架构那就够了)而且我也没有必要再去写一个框架,做一个类似Nhibernate,或者实体框架的东西.做东西我一直认为需要做一个能有自我的特色和优势.

2.易用性,我想用过Moon.ORM的应该可以知道这点.配置简单,智能感知,代码生成器的辅助,会sql就可会用Moon.

3.多数据库多数据源支持.在同一个项目中我们需要处理这种情况时,Moon.ORM是你最好的选择.如你系统默认为MSSQL,现在要同时使用 MYSQL,你只需要实例化一个引擎就可以.DBFactory.GetEntity (pjy_AdminRoleTable.RoleID.BiggerThan(0),new MYSQL("连接字符串"));当然你可以把引擎做成全局的.

4.语法糖功能.个人使用的结果是大概能满足我实际需求的70%以上的功能.

5..NET 2.0原生支持,这个就不用说了.

6.数据库转变问题,如果你发现你有一天你的数据库需要从mysql转变到mssql,你只需要转变你的配置文件即可.(当然sql语法差异的问题,你需要自己注意了,如果你在用原生的sql进行操作时).

三.维护问题.

有人曾说'都没源代码,所以我不能用'.我不能自比微软,但我们可以换一个位置想想:知道.net framework 3.5 sp1中的bug吗?微软的库中也会有bug信吗?Moon.ORM标准版,一律免费使用(包括API文档等)和群技术支持.对于企业用户我会提供专门的 服务和技术支持以及更加美观强大易用的企业版Moon.orm代码生成器工具及技术培训资料.

四.同类产品对比.
http://www.cnblogs.com/humble/archive/2012/05/20/2510756.html

五. 绝对性能优势

3.9版本后已将查询性能提升到了极致≈纯sql查询的性能.

六.技术指导(主要提供绝大部分的情况,供参考,具体请看API文档)

一.查询操作.

1.查询一条记录(一个实体)
Administrator newUser=DBFactory.GetEntity(AdministratorTable.ID.Equal(userID).And(
AdministratorTable
.Age.Equal(12)));

2.查询多条记录(多个实体)
var list=DBFactory.GetEntities(AdministratorTable.ID.BiggerThan(9));

3.嵌套查询(codeID作为外键指向Administrator的ID)
var list=DBFactory.GetEntities(AdministratorTable.ID
.Equal(AttachmentTable.codeID.SelectWhere(AttachmentTable.fileName.Equal("ee.txt"))));

4.对于复杂的多表查询,使用代码生成器,把你的sql复制过去,然后它帮助你生成实体,最终

NewOBJ newUser=DBFactory.GetEntity(sql语句);

5.单一数据查询.
string userName=DBFactory.GetOneField<string>(AdministratorTable.UserName,AdministratorTable.ID.BiggerThan(0));

(注意可能报异常,比如查出来的数据为DBNull).

6.记录条数查询.

long count=DBFactory.GetCount(AdministratorTable.UserName,AdministratorTable.ID.BiggerThan(0));

7. 返回其他的格式.可以参考API看DB

(调用方法如:DBFactory.DefaultDB.GetDataSet("sql语句");)DefaultDB的类型为DB,其API可看帮助文档;




8. 查询单一字段.
var userName=DBFactory.GetOneField<string>(UserTable.UserName,UserTable.Age.Equal(12).And(UserTable.Tel.Equal("qsmy")));


9.指定字段对象查询.
var user=DBFactory.GetEntity(UserTable.Age+UserTable.UserName,UserTable.ID.Equal(12));

10.复杂查询功能.Moon给出了三种解决方案.

1.代码生成器生成实体,把您的sql语句(无论多么复杂)放入代码生成器,它会自动给你生成强类型实体,如第4条说的.

2.智能实体,不需要代码生成器,如下
var list=DBFactory.GetIntelligentEntities("select * from [User]");
Console.WriteLine(list[index]["username"].To<string>());(注意字段全是小写)


var user=DBFactory.GetIntelligentEntity("select * from [User] where age>3");
Console.WriteLine(user["username"].To<string>());

3.动态编译实体,同样不需要代码生成器(Moon5.0会与大家相见)



var list=DBFactory.GetAutoEntities("相当复杂的一个sql查询语句","自定义类名");
for(var a in list){
int count=a.Count;
string country=a.Country;
}





二.数据添加操作.
Administrator admin=new Administrator();
admin.UserName="秦仕川"+DateTime.Now;
admin.Password="qsmy";
//开启事务操作
admin.StartTransaction(true);
//返回主键值
int userID=Convert.ToInt32(DBFactory.Add(admin));
三.数据删除操作.
//返回删除的条数
long count=DBFactory.DeleteWhen(AdministratorTable.ID.BiggerThan(0));
四.数据修改操作.
Administrator admin=new Administrator();
admin.UserName="秦仕川"+DateTime.Now;
admin.Password="qsmy";
admin.SetOnlyMark(AdministratorTable.ID.BiggerThan(0));
//开启事务操作
admin.StartTransaction(true);
//返回主键值
DBFactory.Update(admin);


七.需要明白的Moon.ORM设计前提

1.对于数据库的设计,每一个表必须要有主键;

2.由业务决定逻辑的主键设计方案是错误的,所以主键是不能被业务牵制的,因为业务是变动的.Moon.ORM需建立独立于业务

之外的.所以主键的设计MOON选择的是guid或者自增的情况(建议用自增的方式).


八.使用说明


使用说明:代码生成器及使用说明
http://www.cnblogs.com/humble/archive/2012/05/20/2510756.html


1.下载代码生成器(上面,最新版本下载)

2.修改代码生成器的配置文件.如下图.(如果是mysql见 6.使用说明)
3.运行代码生成器生成实体


用代码生成器生成实体层. 加入你要做的项目中.
(可以把这段代码文件.cs复制到项目中,也可引用编译文件.dll)



4.实际项目中引入Moon.Orm和上面生成的.cs或.dll



Moon 4.1及代码生成器下载:
技术群:
216965349

最新版下载
  • 打赏
  • 举报
回复
zhangdaowu5 2012-08-06
  • 打赏
  • 举报
回复
做成可视化的配置连接工具就更好了,
lionzjz 2012-08-06
  • 打赏
  • 举报
回复
谢谢分享
ai422139987 2012-08-06
  • 打赏
  • 举报
回复
学习了 很不错
翘楚时代 2012-08-04
  • 打赏
  • 举报
回复
谢谢分享
杰拉尔 2012-08-03
  • 打赏
  • 举报
回复
生成的实体类没有格式很乱最好能改进下
lutaotony 2012-08-03
  • 打赏
  • 举报
回复
学习 分享 中
xiexue202 2012-07-27
  • 打赏
  • 举报
回复
感谢lz送福利
  • 打赏
  • 举报
回复
感谢分享
Coolyu0916 2012-07-26
  • 打赏
  • 举报
回复
有一种东西叫 CodeSmith Studio,功能比这个强大。
xiangaylian 2012-07-26
  • 打赏
  • 举报
回复
灰常感谢,收藏了!
manbufenglin 2012-07-25
  • 打赏
  • 举报
回复
不错啊
那一笑的凄凉 2012-06-13
  • 打赏
  • 举报
回复
膜拜啊,收藏了
xuejiyong0619 2012-05-07
  • 打赏
  • 举报
回复
帮顶,
支持分享
加载更多回复(50)
动软.Net代码生成器Codematic是一款为C#数据库程序员设计的自动代码生成器,Codematic生成的代码基于面向对象的思想和三层架构设计,可以直接生成三层架构的项目的代码,使程序员可以节省大量机械录入的时间和重复劳动,而将精力集中于核心业务逻辑的开发。 Codematic同时提供方便的多类型数据库管理,查询分析器,SQL脚本生成存储过程生成,数据库文档生成,Web项目发布,代码批量自动输出等多项开发工作中常用到的功能,您可以很方便轻松地进行项目开发。 功能如下: 自动生成C#代码 一键自动生成各种C#代码,可以节省大量的时间来做业务逻辑的代码,那些重复的代码就交给它去做吧,1分钟生成一个架构所有的基本代码。有了它开发项目的效率简直轻松多了。 •可以生成3种不同架构的代码:简单三层结构;基于工厂模式三层架构;自定义结构模版 •可以生成页面Html代码和页面.cs处理代码 •支持父子表的(事务)的代码生成 •可以自定义选择生成的字段 •可以自由设定命名空间和实体类名 •自动生成方法属性注释 •支持对表和视图的代码生成 •支持对多种类型数据库生成代码:如SQLServer2000/2005,Oracle,OleDb等 •可以生成3种不同类型数据层: 基于SQL字符串方式,基于Parameter方式和基于存储过程方式的数据层 数据库服务器管理 类似SQLServer2005的管理界面,方便平常在代码编辑的时候想查看数据库的信息,并且可以很直观的查看字段类型,长度,主键,默认值等详细信息,省去了在代码和数据库管理器之间的来回切换,方便快捷。 •可支持SQL Server2000/2005、Oracle、OleDb三种类型的数据库同时管理。 •可以轻松浏览库,表,视图,存储过程的结构信息. •可以查看存储过程和视图的定义脚本。 •表的重命名,删除操作。 查询分析器 实现类似SQLServer2005的查询分析器的功能,方便编写代码时想进行数查询。 •实现执行选中部分SQL语句。 •实现关键字高亮。 •支持F5快捷键执行语句。 •实现打开现有脚本,保存当前脚本功能。 •实现错误检测提示功能。 自动生成存储过程和SQL脚本 •可以自动生成表的创建脚本。 •可以自动生成表数据的插入脚本。 •可以自动生成增、删、改、查等操作的存储过程脚本。 •可以根据选定的数据库和表,进行多选批量生成。 •支持在当前生成和导出脚本文件功能。 自动生成数据库文档 可以根据选定的数据库和表(可批量生成),可以生成字段的详细信息,包括默认值,描述等信息.生成相应的表结构文档,免去手工写文档和操作的麻烦。 Web项目文件发布 有时候我们需要根据自己的要求,导出项目文件,VS.NET自带的复制项目功能,对一些图片或js 文件等等其他一些文件,不能自动导出,除非把这些都添加到项目里。所以,有了这个功能,对项目发布非常的方便,并且支持自己定义哪些发布哪些不发布。 其他功能 •C#ToVB.NET代码转换器。 •支持扩展插件机制的代码生成和插件的自定制开发。 •免费提供数据访问类库组件,页面数据校验等等通用函数类库源码。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧