博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句...
阅读量:6237 次
发布时间:2019-06-22

本文共 5085 字,大约阅读时间需要 16 分钟。

(喷血分享)利用.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文件后,在我们的项目中添加命名空间:

using Microsoft.SqlServer.Management.Common;using Microsoft.SqlServer.Management.Smo;

现在,我们就可以使用MSSQLSERVER提供的类库来生成表的CREATE语句了。

下面给出创建的全部代码:

    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的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语句后的控件。

欢迎讨论其他方法,谢谢!

如果觉得对你有引导与帮助,可以点下推荐,谢谢!

 

作者: EricHu出处: http://blog.csdn.net/chinahuyongEmail: 406590790@qq.comQQ 交流:406590790 QQ群: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 联系我,非常感谢。

 

 

 

 

 

 

 

你可能感兴趣的文章
oc中使用switch实现图片浏览功能,补充其它的实现方式
查看>>
6、DRN-----深度强化学习在新闻推荐上的应用
查看>>
用父类指针指向子类对象
查看>>
Flexigrid默认是可以选择多行
查看>>
PHP导入导出Excel方法小结
查看>>
ZOJ 3870 Team Formation 位运算 位异或用与运算做的
查看>>
清除浮动float的方法
查看>>
java学习第十二天
查看>>
1 Kubernetes管理之master和Node
查看>>
M端计算rem方法
查看>>
as3 用StyleSheet css 设置文本样式
查看>>
hdu4612(双连通缩点+树的直径)
查看>>
【转】深入理解 C# 协变和逆变
查看>>
第六次作业
查看>>
UML
查看>>
9.[Java开发之路](6)File类的使用
查看>>
折半插入排序(binary insertion sort)
查看>>
打包常见问题
查看>>
javascript解析json
查看>>
在Ubuntu下编译WebKit源码
查看>>