smo是sql mangagement objects的簡稱.與之相對應的是ado.net,不過不同的地方是ado.net是用于資料通路的,而smo是用于設計的,雖然smo能夠再伺服器上執行任意的sql語句.另外一個不同的地方是ado.net可以通路計算機中任意資料源,而smo對象是專門針對sql server而設計的.
在smo中最重要的一個類就是server.其他大多數對象都是server對象的後代.比如database,table,view等等對象都是通過server屬性不斷向下檢索到的.
要在vs2005中使用必須引用smo的程式集.我們建立好一個控制台應用程式,添加引用:microsoft.sqlserver.connectioninfo和microsoft.sqlserver.smo.我們可以輸入如下代碼使用server對象給出某伺服器中的資料庫數目:
using system;
using microsoft.sqlserver.management.smo;
namespace smotest
{
class class1
public static void main()
microsoft.sqlserver.management.common.serverconnection conn = new microsoft.sqlserver.management.common.serverconnection("tcp:157.60.15.215,12345", "sa", "123456");
server s = new server(conn);
console.writeline("databasecount:" + s.databases.count);
}
運作以上代碼就可以得到伺服器上資料庫的數目.下面我們再來看看在smo中對資料庫常見的操作:
1,建立删除資料庫.
database db2 = new database(s, "newdatabasename");
db2.create();
以上是建立資料庫的代碼,那麼删除資料庫的代碼就是:
database db2 = s.databases["newdatabasename"];
db2.drop();
2,建立表.
database db = s.databases["adventureworks"];
table tb = new table(db, "newtablename");
column c = new column(tb, "customerid");
c.identity = true;
c.identityseed = 1;
c.datatype = datatype.int;
c.nullable = false;
tb.columns.add(c);
c = new column(tb, "customername");
c.datatype = datatype.varchar(20);
c.nullable = true;
tb.create();
以上語句是在資料庫adventureworks中建立了一個表newtablename,其中我們定義了兩個字段,一個是customerid,一個是customername.需要注意的是在建立表的時候必須要指定其中的列,如果沒有指定列,那麼建立表就會失敗.
3,建立存儲過程.
storedprocedure sp = new storedprocedure(db, "newstoredprocedure");
storedprocedureparameter spp1 = new storedprocedureparameter(sp, "@addrid", datatype.int);
sp.textmode = false;
sp.parameters.add(spp1);
sp.textbody = "select * from person.address where addressid=@addrid";
sp.create();
這兒需要說明的是如果不寫sp.textmode = false;那麼可能建立存儲過程要失敗,是以最好把這句加上.
整個語句比較簡單,而且也比較好了解,就不用多作解釋了.
4,删除對象.
删除對象比較簡單,隻要将需要删除的對象引用過來,然後執行drop操作就可以了.比如:
删除表:
table tb=db.tables["tablename"]; tb.drop();
删除存儲過程:
storedprocedure sp = db.storedprocedures["newstoredprocedure123"]; sp.drop();
5,執行存儲過程.
執行存儲過程不需要在storedprocedure對象下尋找方法,要smo直接執行存儲過程可以使用database對象下的executenonquery方法.
6,更新對象屬性.
若想要修改資料庫的屬性,修改存儲過程内容等,在進行修改後必須要執行alter方法才能真正更新.
比如修改資料庫屬性可以使用修改db.databaseoptions下的屬性,新屬性修改好後執行一句db.alter();便可.
若要修改存儲過程,代碼如下:
storedprocedure sp = db.storedprocedures["newstoredprocedure123"];
storedprocedureparameter spp1 = new storedprocedureparameter(sp, "@spid", datatype.int);
sp.textbody = "select * from person.address where stateprovinceid=@spid";
sp.alter();
其他的一下對象如表,視圖等等原理相同.