2013-07-29 11 views
34

我有以下查詢:使用SqlDataReader的發現場從DataReader對象數據類型

SqlCommand cmd = new SqlCommand("Select employee_id, 
      lastname, firstname from Employees", conn); 

//Execute reader 
SqlDataReader reader = cmd.ExecuteReader(); 

,我只是想知道的數據類型字段:

假設我想知道字段的數據類型EMPLOYEE_ID如何要知道使用reader變量?

感謝

+5

使用* GetFieldType()*方法。 – adatapost

回答

5

使用.GetFieldType(colnameIndex)爲:

If (reader.GetFieldType(0) Is GetType(String) Or reader.GetFieldType(0) Is 
GetType(Date)) 
{ 
... 

} 

,或者它可以只是:reader.GetFieldType(0)

根據您的進一步邏輯,您可以將此功能模擬爲簡單文本或條件格式。

+0

GetFieldType需要列序號,而不是名稱 –

+0

@JonG Thanx,我編輯它 –

+0

GetType方法究竟是什麼?似乎並不存在。 – Jimmy

43
reader.GetFieldType(int ordinal)

將返回字段的.NET類型,而:

reader.GetDataTypeName(int ordinal)

將返回一個表示字段的數據源(例如varchar)的數據類型的字符串。 GetFieldType對於給定的描述用例可能會更有用

+0

爲什麼GetFieldType返回數據類型System.String for OrderID是int(11)? – MagB

+0

@MagB,如果OrderID實際上是一個整數,它不應該從GetFieldType返回一個字符串。我建議你檢查你的表格的定義。你在使用什麼類型的數據庫? 您可能還想檢查您是否提供了正確的序號值。你可以通過爲那個序號調用reader.GetName(ordinal)來驗證。 – devinbost

+0

是的,我不明白爲什麼GetFieldType總是返回System.String,無論查詢是否返回decimal,int等。 –

0

您可以使用GetFieldType方法,傳遞您希望檢索其類型的列的序號。它返回該字段的System.Type。

舉個例子,如果你想獲得第一列的類型,你可以做var firstColType = reader.GetFieldType(0);

15

你可以得到所有與此相關的元數據:

var metaDataList = new List<IDictionary<String, Object>>(); 

using (SqlDataReader reader = cmd.ExecuteReader()) 
{ 
    var hasRows = reader.HasRows; 
    while (reader.Read()) 
    { 
     for (int i = 0; i < reader.FieldCount; i++) 
     { 
      dynamic fieldMetaData = new ExpandoObject(); 
      var columnName = reader.GetName(i); 
      var value = reader[i]; 
      var dotNetType = reader.GetFieldType(i); 
      var sqlType = reader.GetDataTypeName(i); 
      var specificType = reader.GetProviderSpecificFieldType(i); 
      fieldMetaData.columnName = columnName; 
      fieldMetaData.value = value; 
      fieldMetaData.dotNetType = dotNetType; 
      fieldMetaData.sqlType = sqlType; 
      fieldMetaData.specificType = specificType; 
      metaDataList.Add(fieldMetaData); 
     } 
    } 
} 

這是略有矯枉過正,但我無法想象你需要更多的類型信息。 您也可以在if語句或異常處理中使用hasRows變量。