zoukankan      html  css  js  c++  java
  • (喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句

    (喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句

     

    在我们RDIFramework.NET代码生成器中,有这样一个应用,就是通过数据库表自动生成表的CREATE语句,如下图所示:

     

    在实现此功能前摸索了很多方法,最后借助MSSQLSERVER自带的dll文件来完成。先截图展示下此功能生成后的效果,然后再分享代码与方法,欢迎大家讨论其他可行方式,谢谢。 

    通过上图可以看到,生成的表CREATE语句与SQLSERVER企业管理器生成的语句完全一样。现在我们来看一看如何实现。在上面我说过,我采用的是SQLSERVER自带的dll文件的方法来完成。因此,我们首先要引用MSSQLSERVER的相关dll文件,如我的SQLSERVER安装在“D:Program FilesMicrosoft SQL Server”,打开目录“D:Program FilesMicrosoft SQL Server100SDKAssemblies”,就可以看到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;
            }
    
            /// <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语句后的控件。

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

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

     

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

     

     

     

     

     

     

  • 相关阅读:
    思考的乐趣
    编程的知识体系
    Android用Intent来启动Service报“java.lang.IllegalArgumentException: Service Intent must be explicit”错误的解决方法
    手拼SQL小技巧,WHERE 1=1
    n+1 < n , are you sure?
    java swing 去掉按钮文字周围的焦点框
    MyBatis使用动态SQL标签的小陷阱
    String、StringBuffer、StringBuilder的一些小经验……
    SQL Server 2012安装后找不到服务器名称的解决办法!!!
    CSS元素水平垂直居中方法总结(主要对大漠以及张鑫旭博客所述方法进行了归纳)
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3214950.html
Copyright © 2011-2022 走看看