2011-04-14 46 views
7

有沒有一種方法,我可以在.NET確定,對於任意SQL Server的結果集,如果結果給定的列可以包含空值?SqlDataReader的找出一個數據字段爲空

舉例來說,如果我有陳述

Select NullableColumn From MyTable 

Select IsNull(NullableColumn, '5') as NotNullColumn From MyTable 

,我得到這樣一個DataReader:

var cmd = new SqlCommand(statement, connection); 
var rdr = cmd.ExecuteReader(); 

我能有這樣的功能?

bool ColumnMayHaveNullData(SqlDataReader rdr, int ordinal) 
{ 
    //???? 
} 

我希望它爲第一個語句返回true,爲第二個語句返回false。

rdr.GetSchemaTable()因爲它返回相關的列是否可以爲null,這不是我想要的不適合這項工作。有跡象表明,返回字段的基本SQL類型,但沒有人可以告訴我,如果它可以是空的DataReader的功能..

+1

我可以問你爲什麼想知道? – tomfanning 2011-04-14 23:26:23

+0

@tomfanning我正在破解一個ORM。我想記錄任何時候有人試圖運行一個可空數據庫字段映射到不可爲空值類型的查詢。 – dan 2011-04-15 00:22:03

回答

1

不幸的是,你不能因爲SQL服務器無法確定一個字段是否可爲空。您可以對結果集(運算符,函數調用等)中的字段執行仲裁轉換,並且這些轉換不具有關於它們的元數據,無論它們是否可以返回null。所以,你必須手動找出答案,或者使用與架構綁定的意見...

1

我有點困惑:

「不適用於這方面的工作因爲它返回相關的列是否可以爲null,這不是我想要的。「

‘但沒有人可以告訴我,如果它可以爲null。’

您可以查詢基礎表看如果列是無效的(假設這是你想要的)。

SELECT IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'MyTable' AND COLUMN_NAME = 'MyColumn' 
+0

我想知道,如果在結果集中的一列可以包含空值,如果不是在基礎表中的列可以包含空值。在我的示例中,我在select語句中使用IsNull()將空值轉換爲非空值。在這種情況下,即使基礎表列可以,該結果集列也不能包含空值。 – dan 2011-04-15 02:23:07

+0

結果集列仍然可以包含空值,但是您已將所有空值替換爲非空值。所以你想知道數據是否被「擦洗」?你可以兩次檢索相同的列......一個是空的,另一個是同一列的已擦除版本。 – 2011-04-15 02:52:30

+0

如果我把它換成非空的所有空值,然後將結果集列不包含空值。這就是我試圖找出的結果,但不必循環查看各個值。基本上我試圖在運行時驗證針對對象模型的臨時查詢。你和我可以通過查看哪個結果列可能包含空值的查詢來告訴,所以應該有一種方法來編寫一個可以計算出來的函數。 – dan 2011-04-15 05:50:50