天天看點

(噴血分享)利用.NET生成資料庫表的建立腳本,類似SqlServer編寫表的CREATE語句

(噴血分享)利用.NET生成資料庫表的建立腳本,類似SqlServer編寫表的CREATE語句

  在我們RDIFramework.NET代碼生成器中,有這樣一個應用,就是通過資料庫表自動生成表的CREATE語句,如下圖所示:

(噴血分享)利用.NET生成資料庫表的建立腳本,類似SqlServer編寫表的CREATE語句

  在實作此功能前摸索了很多方法,最後借助MSSQLSERVER自帶的dll檔案來完成。先截圖展示下此功能生成後的效果,然後再分享代碼與方法,歡迎大家讨論其他可行方式,謝謝。

(噴血分享)利用.NET生成資料庫表的建立腳本,類似SqlServer編寫表的CREATE語句

  通過上圖可以看到,生成的表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

如下圖所示:

(噴血分享)利用.NET生成資料庫表的建立腳本,類似SqlServer編寫表的CREATE語句

引用了上面兩個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>/// &lt;summary&gt;</code>

<code>        </code><code>/// 生成資料庫類型為SqlServer指定表的DDL</code>

<code>        </code><code>/// &lt;/summary&gt;</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) &amp;&amp; textEditorDDL.Text.Trim().Length &gt; 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>) &amp;&amp; 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,如需轉載請自行聯系原作者