(喷血分享)利用.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
<code>using</code> <code>Microsoft.SqlServer.Management.Common; </code>
<code>using</code> <code>Microsoft.SqlServer.Management.Smo;</code>
现在,我们就可以使用MSSQLSERVER提供的类库来生成表的CREATE语句了。
下面给出创建的全部代码:
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
<code>private</code> <code>void</code> <code>ScriptOption()</code>
<code> </code><code>{</code>
<code> </code><code>scriptOption.ContinueScriptingOnError = </code><code>true</code><code>;</code>
<code> </code><code>scriptOption.IncludeIfNotExists = </code><code>true</code><code>;</code>
<code> </code><code>scriptOption.NoCollation = </code><code>true</code><code>;</code>
<code> </code><code>scriptOption.ScriptDrops = </code><code>false</code><code>;</code>
<code> </code><code>//scriptOption.DriAllConstraints = true;</code>
<code> </code><code>scriptOption.WithDependencies = </code><code>false</code><code>;</code>
<code> </code><code>scriptOption.DriForeignKeys = </code><code>true</code><code>;</code>
<code> </code><code>scriptOption.DriPrimaryKey = </code><code>true</code><code>;</code>
<code> </code><code>scriptOption.DriDefaults = </code><code>true</code><code>;</code>
<code> </code><code>scriptOption.DriChecks = </code><code>true</code><code>;</code>
<code> </code><code>scriptOption.DriUniqueKeys = </code><code>true</code><code>;</code>
<code> </code><code>scriptOption.Triggers = </code><code>true</code><code>;</code>
<code> </code><code>scriptOption.ExtendedProperties = </code><code>true</code><code>;</code>
<code> </code><code>scriptOption.NoIdentities = </code><code>false</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>/// <summary></code>
<code> </code><code>/// 生成数据库类型为SqlServer指定表的DDL</code>
<code> </code><code>/// </summary></code>
<code> </code><code>private</code> <code>void</code> <code>GenerateSqlServerDDL()</code>
<code> </code><code>//对于已经生成过的就不用再次生成了,节约资源。</code>
<code> </code><code>if</code> <code>(!</code><code>string</code><code>.IsNullOrEmpty(textEditorDDL.Text) && textEditorDDL.Text.Trim().Length > 10)</code>
<code> </code><code>{</code>
<code> </code><code>return</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>ScriptOption();</code>
<code> </code><code>ServerConnection sqlConnection = </code><code>null</code><code>;</code>
<code> </code><code>try</code>
<code> </code><code>StringBuilder sbOutPut = </code><code>new</code> <code>StringBuilder();</code>
<code> </code>
<code> </code><code>if</code> <code>(dbSet.ConnectStr.ToLower().Contains(</code><code>"integrated security"</code><code>)) </code><code>//Windows身份验证</code>
<code> </code><code>{</code>
<code> </code><code>sqlConnection = </code><code>new</code> <code>ServerConnection(dbSet.Server);</code>
<code> </code><code>}</code>
<code> </code><code>else</code> <code>//SqlServer身份验证</code>
<code> </code><code>string</code><code>[] linkDataArray = dbSet.ConnectStr.Split(</code><code>';'</code><code>);</code>
<code> </code><code>string</code> <code>userName = </code><code>string</code><code>.Empty;</code>
<code> </code><code>string</code> <code>pwd = </code><code>string</code><code>.Empty;</code>
<code> </code><code>foreach</code> <code>(</code><code>string</code> <code>str </code><code>in</code> <code>linkDataArray)</code>
<code> </code><code>{</code>
<code> </code><code>if</code><code>(str.ToLower().Replace(</code><code>" "</code><code>,</code><code>""</code><code>).Contains(</code><code>"userid="</code><code>))</code>
<code> </code><code>{</code>
<code> </code><code>userName = str.Split(</code><code>'='</code><code>)[1];</code>
<code> </code><code>}</code>
<code> </code><code>if</code> <code>(str.ToLower().Replace(</code><code>" "</code><code>, </code><code>""</code><code>).Contains(</code><code>"password"</code><code>))</code>
<code> </code><code>pwd = str.Split(</code><code>'='</code><code>)[1];</code>
<code> </code><code>}</code>
<code> </code><code>sqlConnection = </code><code>new</code> <code>ServerConnection(dbSet.Server,userName,pwd);</code>
<code> </code><code>Server sqlServer = </code><code>new</code> <code>Server(sqlConnection);</code>
<code> </code><code>Table table = sqlServer.Databases[dbSet.DbName].Tables[txtName.Text];</code>
<code> </code><code>string</code> <code>ids;</code>
<code> </code><code>//编写表的脚本</code>
<code> </code><code>sbOutPut = </code><code>new</code> <code>StringBuilder();</code>
<code> </code><code>sbOutPut.AppendLine();</code>
<code> </code><code>sCollection = table.Script(scriptOption);</code>
<code> </code><code>foreach</code> <code>(String str </code><code>in</code> <code>sCollection)</code>
<code> </code><code>//此处修正smo的bug</code>
<code> </code><code>if</code> <code>(str.Contains(</code><code>"ADD DEFAULT"</code><code>) && str.Contains(</code><code>"') AND type = 'D'"</code><code>))</code>
<code> </code><code>ids = str.Substring(str.IndexOf(</code><code>"OBJECT_ID(N'"</code><code>) + </code><code>"OBJECT_ID(N'"</code><code>.Length, str.IndexOf(</code><code>"') AND type = 'D'"</code><code>) - str.IndexOf(</code><code>"OBJECT_ID(N'"</code><code>) - </code><code>"OBJECT_ID(N'"</code><code>.Length);</code>
<code> </code><code>sbOutPut.AppendLine(str.Insert(str.IndexOf(</code><code>"ADD DEFAULT"</code><code>) + 4, </code><code>"CONSTRAINT "</code> <code>+ ids));</code>
<code> </code><code>else</code>
<code> </code><code>sbOutPut.AppendLine(str);</code>
<code> </code><code>sbOutPut.AppendLine(</code><code>"GO"</code><code>);</code>
<code> </code><code>//生成存储过程</code>
<code> </code><code>this</code><code>.textEditorDDL.SetCodeEditorContent(</code><code>"SQL"</code><code>, sbOutPut.ToString());</code>
<code> </code><code>this</code><code>.textEditorDDL.SaveFileName = </code><code>this</code><code>.TableName + </code><code>".sql"</code><code>;</code>
<code> </code><code>catch</code> <code>(Exception ex)</code>
<code> </code><code>LogHelper.WriteException(ex);</code>
<code> </code><code>finally</code>
<code> </code><code>sqlConnection.Disconnect();</code>
说明:textEditorDDL为显示生成表CREATE语句后的控件。
本文转自yonghu86 51CTO博客,原文链接:http://blog.51cto.com/yonghu/1321309,如需转载请自行联系原作者