(喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句
(喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句
在我们RDIFramework.NET代码生成器中,有这样一个应用,就是通过数据库表自动生成表的CREATE语句,如下图所示:
在实现此功能前摸索了很多方法,最后借助MSSQLSERVER自带的dll文件来完成。先截图展示下此功能生成后的效果,然后再分享代码与方法,欢迎大家讨论其他可行方式,谢谢。
通过上图可以看到,生成的表CREATE语句与SQLSERVER企业管理器生成的语句完全一样。现在我们来看一看如何实现。在上面我说过,我采用的是SQLSERVER自带的dll文件的方法来完成。因此,我们首先要引用MSSQLSERVER的相关dll文件,如我的SQLSERVER安装在“D:\Program Files\Microsoft SQL Server\”,打开目录“D:\Program Files\Microsoft SQL Server\100\SDK\Assemblies”,就可以看到SQLSERVER的全部dll文件了,其实通过这些dll文件,我们可以完成像SQLSERVER企业管理器一样的功能,非常强大,看你怎么使用了,在此仅抛砖引玉。我们需要在我们的项目中添加两个dll文件的引用,分别为:
Microsoft.SqlServer.ConnectionInfo.dll
Microsoft.SqlServer.Management.Sdk.Sfc.dll
如下图所示:
引用了上面两个dll文件后,在我们的项目中添加命名空间:
1 2 | using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; |
现在,我们就可以使用MSSQLSERVER提供的类库来生成表的CREATE语句了。
下面给出创建的全部代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | private void ScriptOption() { scriptOption.ContinueScriptingOnError = true ; scriptOption.IncludeIfNotExists = true ; scriptOption.NoCollation = true ; scriptOption.ScriptDrops = false ; scriptOption.ContinueScriptingOnError = true ; //scriptOption.DriAllConstraints = true; scriptOption.WithDependencies = false ; scriptOption.DriForeignKeys = true ; scriptOption.DriPrimaryKey = true ; scriptOption.DriDefaults = true ; scriptOption.DriChecks = true ; scriptOption.DriUniqueKeys = true ; scriptOption.Triggers = true ; scriptOption.ExtendedProperties = true ; scriptOption.NoIdentities = false ; } /// <summary> /// 生成数据库类型为SqlServer指定表的DDL /// </summary> private void GenerateSqlServerDDL() { //对于已经生成过的就不用再次生成了,节约资源。 if (! string .IsNullOrEmpty(textEditorDDL.Text) && textEditorDDL.Text.Trim().Length > 10) { return ; } ScriptOption(); ServerConnection sqlConnection = null ; try { StringBuilder sbOutPut = new StringBuilder(); if (dbSet.ConnectStr.ToLower().Contains( "integrated security" )) //Windows身份验证 { sqlConnection = new ServerConnection(dbSet.Server); } else //SqlServer身份验证 { string [] linkDataArray = dbSet.ConnectStr.Split( ';' ); string userName = string .Empty; string pwd = string .Empty; foreach ( string str in linkDataArray) { if (str.ToLower().Replace( " " , "" ).Contains( "userid=" )) { userName = str.Split( '=' )[1]; } if (str.ToLower().Replace( " " , "" ).Contains( "password" )) { pwd = str.Split( '=' )[1]; } } sqlConnection = new ServerConnection(dbSet.Server,userName,pwd); } Server sqlServer = new Server(sqlConnection); Table table = sqlServer.Databases[dbSet.DbName].Tables[txtName.Text]; string ids; //编写表的脚本 sbOutPut = new StringBuilder(); sbOutPut.AppendLine(); sCollection = table.Script(scriptOption); foreach (String str in sCollection) { //此处修正smo的bug if (str.Contains( "ADD DEFAULT" ) && str.Contains( "') AND type = 'D'" )) { ids = str.Substring(str.IndexOf( "OBJECT_ID(N'" ) + "OBJECT_ID(N'" .Length, str.IndexOf( "') AND type = 'D'" ) - str.IndexOf( "OBJECT_ID(N'" ) - "OBJECT_ID(N'" .Length); sbOutPut.AppendLine(str.Insert(str.IndexOf( "ADD DEFAULT" ) + 4, "CONSTRAINT " + ids)); } else sbOutPut.AppendLine(str); sbOutPut.AppendLine( "GO" ); } //生成存储过程 this .textEditorDDL.SetCodeEditorContent( "SQL" , sbOutPut.ToString()); this .textEditorDDL.SaveFileName = this .TableName + ".sql" ; sbOutPut = new StringBuilder(); } catch (Exception ex) { LogHelper.WriteException(ex); } finally { sqlConnection.Disconnect(); } } |
说明:textEditorDDL为显示生成表CREATE语句后的控件。
欢迎讨论其他方法,谢谢!
如果觉得对你有引导与帮助,可以点下推荐,谢谢!
作者:
RDIF
出处:
http://www.cnblogs.com/huyong/
Email:
406590790@qq.com
QQ:
406590790
微信:
13005007127(同手机号)
框架官网:
http://www.guosisoft.com/
http://www.rdiframework.net/
框架其他博客:
http://blog.csdn.net/chinahuyong
http://www.cnblogs.com/huyong
国思RDIF开发框架
,
给用户和开发者最佳的.Net框架平台方案,为企业快速构建跨平台、企业级的应用提供强大支持。
关于作者:系统架构师、信息系统项目管理师、DBA。专注于微软平台项目架构、管理和企业解决方案,多年项目开发与管理经验,曾多次组织并开发多个大型项目,在面向对象、面向服务以及数据库领域有一定的造诣。现主要从事基于
RDIF
框架的技术开发、咨询工作,主要服务于金融、医疗卫生、铁路、电信、物流、物联网、制造、零售等行业。
如有问题或建议,请多多赐教!
本文版权归作者和CNBLOGS博客共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过微信、邮箱、QQ等联系我,非常感谢。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战