2009-10-16 81 views
4

有沒有一種方法可以使用ado.net從Sql數據庫中確定列的默認值?如何從Sql表中檢索DataColumn.DefaultValue?

我嘗試使用SqlDataAdapterFillSchema方法:

using (SqlDataAdapter adapter = new SqlDataAdapter()) { 
    adapter.SelectCommand = myConnection.CreateCommand(); 
    adapter.SelectCommand.CommandType = CommandType.Text; 
    adapter.SelectCommand.CommandText = "SELECT * FROM myTable"; 
    DataTable table = new DataTable(); 
    adapter.Fill(table); 
    adapter.FillSchema(table, SchemaType.Mapped); 
} 

當我檢查在DataTableDataColumns,我可以確定是否列是AutoIncrement,並能確定是否允許使用該AllowDBNull空值屬性。但是,DefaultValue(對於我知道的列有默認值)始終爲null

我認爲:

DataTable schemaTable = null; 
using (SqlDataReader reader = adapter.SelectCommand.ExecuteReader(CommandBehavior.SchemaOnly)) { 
    schemaTable = reader.GetSchemaTable(); 
    reader.Close(); 
} 

DefaultValue不包括在架構。

所以...我怎麼能得到一列的DefaultValue

回答

4

使用此查詢來詢問INFORMATION_SCHEMA你正在尋找的信息:

SELECT 
    TABLE_NAME, COLUMN_NAME, COLUMN_DEFAULT 
FROM 
    INFORMATION_SCHEMA.COLUMNS 
WHERE 
    TABLE_NAME = 'your table name' AND 
    COLUMN_NAME = 'your column name' 

馬克

+0

我認爲這意味着一個SQL Server(MSSQL),2005(?)或更高版本的服務器,對不對? – mjv

+1

不,任何支持INFORMATION_SCHEMA的數據庫都應該被支持。這不僅僅是SQL Server--還有其他一些人也支持這一點。這是使用INFORMATION_SCHEMA而不是SQL Server特定的「sys。*」或「sysobjects」目錄視圖的最大好處。 –

+0

據我所知,至少MySQL,PostgreSQL和一定程度的Oracle支持INFORMATION_SCHEMA(不清楚IBM DB2) –

2

不是真的。這是因爲可以在插入記錄時確定默認值(如GETDATE()NEW_ID())。所以價值不能提前確定。

COLUMN_DEFAULTINFORMATION_SCHEMA.COLUMNS不會給出實際的默認值,而是代碼SQL Server的字符串表示形式以及類似的代碼將執行以生成默認值。見http://msdn.microsoft.com/en-us/library/ms188348.aspx

話雖如此,簡單的常數值可以很容易地從這樣的表達式推導出來。