喷血分享 利用.NET生成数据库表的创建脚本

(喷血分享)利用.NET生成数据库表的创建脚本,类似编写表的语句
在我们.NET代码生成器中,有这样一个应用,就是通过数据库表自动生成表的语句,如下图所示:
在实现此功能前摸索了很多方法 , 最后借助自带的dll文件来完成 。先截图展示下此功能生成后的效果 , 然后再分享代码与方法 , 欢迎大家讨论其他可行方式,谢谢 。
通过上图可以看到,生成的表语句与企业管理器生成的语句完全一样 。现在我们来看一看如何实现 。在上面我说过,我采用的是自带的dll文件的方法来完成 。因此,我们首先要引用的相关dll文件,如我的安装在“D:\ Files\ SQL \” , 打开目录“D:\ Files\ SQL \100\SDK\”,就可以看到的全部dll文件了 , 其实通过这些dll文件,我们可以完成像企业管理器一样的功能,非常强大,看你怎么使用了,在此仅抛砖引玉 。我们需要在我们的项目中添加两个dll文件的引用,分别为:
...dll

喷血分享  利用.NET生成数据库表的创建脚本

文章插图
...Sdk.Sfc.dll
如下图所示:
引用了上面两个dll文件后,在我们的项目中添加命名空间:
using Microsoft.SqlServer.Management.Common;using Microsoft.SqlServer.Management.Smo;
现在,我们就可以使用提供的类库来生成表的语句了 。
下面给出创建的全部代码:
喷血分享  利用.NET生成数据库表的创建脚本

文章插图
【喷血分享利用.NET生成数据库表的创建脚本】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;}/// /// 生成数据库类型为SqlServer指定表的DDL/// 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的bugif (str.Contains("ADDDEFAULT") && 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("ADDDEFAULT") + 4, "CONSTRAINT " + ids));}elsesbOutPut.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();}}
说明:为显示生成表语句后的控件 。
欢迎讨论其他方法,谢谢!
如果觉得对你有引导与帮助,可以点下推荐,谢谢!
作者: EricHu出处: http://blog.csdn.net/chinahuyongEmail: 406590790@qq.comQQ 交流:406590790 :16653241平台博客:【CSDN】http://blog.csdn.net/chinahuyong【CNBLOGS】http://www.cnblogs.com/huyong关于作者:高级工程师、信息系统项目管理师、DBA 。专注于微软平台项目架构、管理和企业解决方案,多年项目开发与管理经验,曾多次组织并开发多个大型项目 , 精通DotNet,DB(SqlServer、Oracle等)技术 。熟悉Java、Delhpi及Linux操作系统,有扎实的网络知识 。在面向对象、面向服务以及数据库领域有一定的造诣 。现从事DB管理与开发、WinForm、WCF、WebService、网页数据抓取以及ASP.NET等项目管理、开发、架构等工作 。如有问题或建议,请多多赐教!本文版权归作者和CSDN博客共有 , 欢迎转载,但未经作者同意必须保留此段声明 , 且在文章页面明显位置给出原文连接,如有问题,可以通过邮箱或QQ 联系我,非常感谢 。