2012-09-10 82 views
2

我想要使用ADO.Net獲取表的所有關係。下面我有下面的代碼,但我無法得到Data.Relations或DataSet.Tables [0] .ChildRelations/ParentRelations使用c#獲取Sql表關係

string query = string.Format("SELECT TOP 0 * FROM {0}", tableName); 

var ds = new DataSet(tableName); 
SqlCommand sqlCmd = new SqlCommand(query, connection); 
SqlDataAdapter sda = new SqlDataAdapter(sqlCmd); 

sda.FillSchema(ds, SchemaType.Source, tableName); 
sda.Fill(ds, tableName); 

sda.Dispose(); 

謝謝!

+0

你可以使用Microsoft.SqlServer.Management.Smo命名空間 – 1Mayur

+0

我遇到過這個解決方案,但不想實現它,因爲我很快就想支持OLEDB連接等等。 – harsimranb

回答

0

經過多少思考,我打算做Microsoft.SqlServer.Management.Smo。因爲它會爲我節省很多時間。至於其他數據提供者,到時候,我會編寫類似的代碼。如果我最終編寫了一個好的API,我肯定會將其開源並與其他人分享。

3

DbCommand獲取結果不會返回有關用於形成返回值的投影的表格關係的任何信息(它們不是真正需要的,除了查詢之外)。

也就是說,您可以撥打GetSchema method來獲取有關關係的信息。

當不帶參數調用時,它將爲您提供該集合可用的所有元數據集合類型的列表。在SqlConnection的情況下,其中一個集合是「ForeignKeys」。

然後,您可以作出這樣一個電話:

DataTable foreignKeys = connection.GetSchema("ForeignKeys"); 

然後它會給你一切都存在於數據庫中的外鍵的列表。

也就是說,GetSchema的每個呼叫都是專門用於提供者;不能保證GetSchema將返回相同的數據集合或不同供應商的相同格式。你得到的Oracle,ODBC,OLE-DB,MySql等的結果可能都是不同的,你必須自己解決這些差異。

+0

只要我堅持一個API(ADO.Net),我就可以解釋所有不同的提供者。謝謝,我會試一試 – harsimranb

+0

嘿,我試了一下。該模式只給我提供具有外鍵的表的信息,而不是外鍵引用的表。 – harsimranb

+1

@ Pathachiever11對於那些數據查詢底層數據存儲的缺乏,沒有一種內置於.NET的方式來執行此操作。 – casperOne