2013-12-12 53 views
2

db中表的列可以存儲空值(如DBNull s)。有沒有一種方法可以從IDataReaderDbDataReader獲取此信息?有沒有方法來檢查列是否支持來自datareader的空值?

using (var reader = command.ExecuteReader()) 
{ 
    //can I get the column info like if it supports null value if I pass the ordinal? 
    reader.CheckIfSupportsNull(someIndex) ??? 

    while (reader.Read()) 
    { 

    } 
} 

我知道我可以讀取單元格的值,並檢查它反對DBNull.Value,但我沒有問我是否可以檢查讀值爲null,但如果我可以檢查柱本身無論表格中的實際值如何,均支持DBNull s

我想知道這是可能的MySqlDataReader和/或SqlDataReader ..

+1

_對於SqlDataReader.GetSchemaTable方法按以下順序返回有關每列的元數據:... AllowDBNull ..._ –

回答

2

@ usr的回答指出了我的正確方向。我這樣做了:

var table = reader.GetSchemaTable(); 
foreach (DataRow column in table.Rows) //here each row represents a column 
{ 
    var allowsNull = column.Field<bool>("AllowDbNull"); //get it one by one here 
    // similarly column.Field<string>("ColumnName") gives the name of the column 
} 

應該工作。

注:由於@Edper提到

var allowsNull = (bool)column["AllowDbNull"]; 

做這項工作了。這有一個額外的好處,你不需要參考Field<T>擴展方法所需的System.Data.DataSetExtensions.dll

+1

你可以像這樣做'column [「AllowDBNull」]'。 – Edper

+0

@Edper是的,只是你必須將其轉換爲布爾值。 – nawfal

+0

是的,你能在哪裏得到你想要的代碼?或者你現在能夠解決的地方? – Edper

6

IDataReader.GetSchemaTable允許這一點。它返回描述結果集的DataTable。查看文檔以查看它返回的列(有很多)。不知道這個電話有多昂貴。我不認爲它會對服務器進行往返。

它返回結果集的屬性,而不是直接返回某個表的屬性。但是,如果直接從表中選擇列,則屬性應該匹配。這對計算表達式(SomeCol + 1)無效,因爲SQL Server不能通過表達式精確地跟蹤可空性。

+1

模式表在結果集中每列返回一行。但是,列名爲'AllowDBNull'。謝謝。 – usr

+0

感謝您的領導,給了我方向。 + 1-ED。爲了完整性,我會接受我的答案。順便說一句,我更喜歡得到結果集的列信息,而不是表本身,所以沒有問題。我認爲表達式中的列信息在可空性方面或多或少是準確的,但瑣碎的罕見情況並不是一個大問題。 – nawfal

1

既然你是閱讀數據(使用的DbDataReader),那麼實際上沒有(儘管其他的答案),不可靠:列可以預先已允許和存儲空,後來禁空存儲沒有刪除已存儲的空值。有時使用這種做法是因爲檢查數據庫約束(如NOT NULLABLE)會使插入數據的速度變慢。

從本質上講,AllowDBNull僅在讀取數據時有用,如果您已經知道列已經具有NOT NULLABLE約束,則永久實施或在任何插入後檢查。

從MSDN:

AllowDBNull: 設置如果消費者可以設置欄爲空值,或者如果供應商不能確定消費者是否可以將列設置爲空值。否則,不設置。列可能包含空值,即使它不能被設置爲空值。

+0

尼斯邊緣案例,謝謝。 – nawfal

相關問題