在.net1.0中可以通過oledb的方式串連資料庫,擷取資料庫的各種屬性,以前曾經使用過,沒什麼問題的了(http://dlwang2002.cnblogs.com/archive/2005/04/11/207996.html)
但是這種方式並不能處理對sql server express的操作,而只能使用SqlConnection。
http://www.microsoft.com/china/MSDN/library/data/dataAccess/DAadonet2schemas.mspx。
按照上邊的介紹,寫了幾個測試如下
SqlConnection connection = null;
connection = new SqlConnection(connectString);
connection.Open();
DataTable tables=connection.GetSchema("Tables");
這段代碼可以擷取資料庫的所有資料表。
string[] col = new string[4];/**////for colums{"Table_CATALOG","TABLE_SCHEMA","TABLE_NAME","COLUMN_NAME","ORDINAL_POSITION","COLUMN_DEFAULT"}
for (int i = 0; i < 4; i++)
col[i] = null;
ol[2] = tableName;
DataView columns = connection.GetSchema("Columns",col).DefaultView;
上邊的代碼可以擷取指定表的所有列。注意GetSchema第二個參數,是一個限制條件,第三列指定的是資料表的名稱。
//connection.GetSchema(DbMetaDataCollectionNames.MetaDataCollections).WriteXml("Meta.xml");
DataTable keyFields = connection.GetSchema("IndexColumns", new string[] { null, null, tableName });
int index=0;
for (int i = 0; i < keyFields.Rows.Count; i++)
{
if (keyFields.Rows[i][2].ToString().IndexOf("PK_") > -1)
index = i;
}
return Global.Clean(keyFields.Rows[index][6].ToString());
這一段是用來擷取主鍵的。好像裡面沒有PrimaryKeys這一個關鍵字,只能這樣湊合著用了。
DataTable keyFields = connection.GetSchema("ForeignKeys",new string[] {null,null,tableName });
這一段是用來擷取外鍵的,不過,這一段來湊合著用都不行
這是輸出的結果 <ForeignKeys>
<CONSTRAINT_CATALOG>D:\xx\BIN\DEBUG\ASPNETDB.MDF</CONSTRAINT_CATALOG>
<CONSTRAINT_SCHEMA>dbo</CONSTRAINT_SCHEMA>
<CONSTRAINT_NAME>FK__aspnet_Us__Appli__0425A276</CONSTRAINT_NAME>
<TABLE_CATALOG>D:\xx\BIN\DEBUG\ASPNETDB.MDF</TABLE_CATALOG>
<TABLE_SCHEMA>dbo</TABLE_SCHEMA>
<TABLE_NAME>aspnet_Users</TABLE_NAME>
<CONSTRAINT_TYPE>FOREIGN KEY</CONSTRAINT_TYPE>
<IS_DEFERRABLE>NO</IS_DEFERRABLE>
<INITIALLY_DEFERRED>NO</INITIALLY_DEFERRED>
</ForeignKeys>
本來指著從這裡擷取"FK_TABLE_NAME","FK_COLUMN_NAME","PK_TABLE_NAME","PK_COLUMN_NAME"的,但是,好像不好找這些參數了。應該如何擷取呢?