(喷血分享)利用.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语句后的控件。

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

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

 

posted @   .NET快速开发框架  阅读(10356)  评论(49编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示