最近在項目中用到了有關SQL Server管理任務方面的編程實現,有了一些本身的心得體會,想在此跟你們分享一下,在工做中用到了SMO/SQL CLR/SSIS等方面的知識,在國內這方面的文章並很少見,有也是一些零星的應用,特別是SSIS部分國內外的文章大都是講解如何拖拽控件的,在開發過程當中周公除了參閱SQL Server幫助文檔、MSDN及StackOverFlow等網站,這些網站基本上都是英文的,爲了便於一些英文很差的開發者學習,周公在本身的理解上加以整理成系列,不到之處請你們諒解。
SMO簡介
SMO是英文SQL Server Management Objects的縮寫,意思是SQL Server管理對象系列,包含了一些列的命名空間(namespace)、動態連接庫(dll)和類(class)。這些類偏重於SQL Server的管理,而且在底層是經過SQL Server數據庫提供程序(System.Data.SqlClient)下的類來與SQL Server來進行交互的。能夠經過編程的方式利用SMO來管理SQL Server7.0以上的版本(SQL Server 7.0/2000/2005/2008),若是低於以上版本的SQL Server則沒法利用SMO來管理(除了歷史緣由遺留的系統,在如今的開發中那些不受支持的SQL Server算是和Windows95同樣的古董了)。同時,要使用SMO的話,必須安裝SQL Server Native Client,通常狀況下當咱們安裝.Net Framework2.0以上版本或者SQL Server2005以上版本時就會自動安裝上了。
在32位系統下若是安裝的是SQL Server2005而且沒有更改安裝路徑,則SMO程序集的路徑是:C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies,相應的,若是安裝的是SQL Server2008,則SMO程序集的路徑就是C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies,若是是在64位系統下安裝,則根據安裝的SQL Server的版原本判斷是在Program Files (x86)仍是在Program Files下面的對應目錄下。
在SMO中有以下命名空間:Microsoft.SqlServer.Management.Common、Microsoft.SqlServer.Management.Nmo、Microsoft.SqlServer.Management.Smo、Microsoft.SqlServer.Management.Smo.Agent、Microsoft.SqlServer.Management.Smo.Broker、Microsoft.SqlServer.Management.Smo.Mail、Microsoft.SqlServer.Management.Smo.RegisteredServers、Microsoft.SqlServer.Management.Smo.Wmi、Microsoft.SqlServer.Management.Trace,關於這些命名空間在哪一個dll中以及該命名空間下有哪些類,你們能夠查閱SQL Server的幫助文章或者查閱在線MSDN,例如查看命名空間下的類能夠瀏覽:
http://msdn.microsoft.com/zh-cn/library/microsoft.sqlserver.management.smo(v=sql.100)
SMO體系架構
咱們知道在SQL Server體系中處於頂層是SQL Server實例,每一個實例會有多個數據庫,每一個數據庫會有多個表、存儲過程、函數、登陸帳號等,每一個表會有列、索引、主鍵等信息,每一個列會有列名、默認值、字段大小等信息,在SMO中有與之相對應的一套類體系結構。
![](http://static.javashuo.com/static/loading.gif)
在DatabaseCollection中每一個元素都是一個Database類的實例,分別對應數據實例中的一個數據庫;在TableCollection中每一個元素都是一個Table的實例,分別對應數據庫中的一個表;在ColumnCollection中每一個元素都是一個Column類的實例,分別對應表中的每一列,以上這些類都位於Microsoft.SqlServer.Management.Smo命名空間下,在Microsoft.SqlServer.Smo.dll這個dll中。
固然,在Microsoft.SqlServer.Management.Smo命名空間中的類遠不止上面提到的這些,上面的表格只是作了一個簡單的類比。
SMO用法示例
上面的文章只是作了一個簡單的介紹,也許經過上面枯燥的介紹你們沒什麼印象,下面經過一段簡單的代碼來簡單演示一下用法,首先要添加響應的引用。在VS2008中能夠直接經過下面的方式添加引用:
![](http://static.javashuo.com/static/loading.gif)
可是在VS2010中就沒有這麼方便了,它使用了過濾屬性(並且還沒法禁用掉或者進行設置),使得沒法添加這些程序集,以下圖:
![](http://static.javashuo.com/static/loading.gif)
注意在編譯下面的代碼以前須要添加對microsoft.sqlserver.connectioninfo.dll和microsoft.sqlserver.smo.dll的引用。
代碼以下:
- using System;
- using Microsoft.SqlServer.Management.Common;
- using Microsoft.SqlServer.Management.Smo;
- namespace SSISStudy
- {
-
-
-
-
-
-
-
- class SMODemo01
- {
-
-
-
- public static void ShowServerInfo()
- {
-
- ServerConnection connection = new ServerConnection();
-
- connection.ConnectionString = "Data Source=goodapp;Initial Catalog=master;User ID=sa;Password=root;";
-
- Server server = new Server(connection);
- Console.WriteLine("ActiveDirectory:{0}", server.ActiveDirectory);
- Console.WriteLine("InstanceName:{0}",server.InstanceName);
-
- foreach (Login login in server.Logins)
- {
- Console.WriteLine("Name:{0},CreateDate:{1},DefaultDatabase:{2}", login.Name, login.CreateDate, login.DefaultDatabase);
- }
-
- Database db = server.Databases["master"];
- Console.WriteLine("Database:{0}", db.Name);
- Console.WriteLine("CreateDate:{0},Dbo:{1}", db.CreateDate, db.Owner);
- Console.WriteLine("DataSpaceUsage:{0},SpaceAvailable:{1}", db.DataSpaceUsage, db.SpaceAvailable);
- Console.WriteLine("PrimaryFilePath:{0}", db.PrimaryFilePath);
-
- foreach (Table table in db.Tables)
- {
- Console.WriteLine("\tTable:{0},DataSpaceUsed:{1},CreateDate:{2}", table.Name, table.DataSpaceUsed, table.CreateDate);
-
-
- foreach (Column column in table.Columns)
- {
- Console.WriteLine("\t\tColumn:{0},DataType:{1},Nullable:{2}", column.Name, column.DataType, column.Nullable);
- }
- }
-
- foreach(DatabaseRole dbRole in db.Roles)
- {
- Console.WriteLine("DB Role {0} Created at {1}", dbRole.Name, dbRole.CreateDate);
- }
- Console.ReadLine();
- }
- }
- }
程序的執行效果以下:
![](http://static.javashuo.com/static/loading.gif)
經過上面的代碼能夠獲取不少有關數據庫的信息,而在代碼中咱們沒有寫一行SQL語句,而在以前周公曾寫過一篇博客《
在.NET中根據SQL Server系統表獲取數據庫管理信息》,在其中爲了查找這些信息周公是查了不少資料才知道SQL語句的寫法,使用SMO以後連SQL語句都免了,可見利用SMO來管理數據庫的方便性。在後續的篇幅中周公將講述如何利用SMO來獲取SQL Server中數據庫的建立語句及如何利用SMO來建立Job。
周公
2012-05-17