2012-06-13 207 views
1

我需要使用列名稱獲取列的數據類型。我在C#中編寫代碼。情況是我有一個視圖,它將某些日期轉換爲varchar,所以我可以更好地顯示它們(沒有時間精確)。但是,這意味着列的數據類型現在不正確。我想要做的是使用列名從DataTable模式中查找列,然後獲取該列的數據類型。我會從主表中收集實際的數據類型,而不是在這種情況下的視圖。想法?從列名稱獲取數據類型

回答

4

DataTable.Columns屬性是DataColumnCollection,它可以是indexed by column name得到DataColumn,具有DataType屬性。

+0

在SqlDataReader對象上使用GetSchemaTable()收集的DataTable上的這項工作? – steventnorris

+0

GetSchemaTable返回一個DataTable,所以它應該工作。 – kol

+0

那麼它似乎架構表不包含sql表的列名稱。每行表示sql表的一列,列是屬性(如列名和數據類型),所以這種方法似乎不起作用。 – steventnorris

0

我不明白如何從數值中推斷出類型。如果代碼中包含視圖和列名稱的結果,那麼視圖使用的表的信息將在此時丟失。

當然,如果你知道它的名字,你可以得到有關表格的信息;

SELECT TOP 0 * FROM <<tableName>> 

或使用動態管理視圖:可以使用這樣一個簡單的查詢完成,也可

SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('<<tableName>>') 

在第一種情況下,使用GetSchemaTable上的IDataReader和迭代行找到你的專欄按名字;在第二種情況下,您可以遍歷結果集本身並以這種方式找到您的列。

+0

我可以得到表的模式很好,我只需要知道該表中的列的列名的數據類型。舉例來說,我有一個包含姓名,出生日期,年齡欄的表格。我想知道名爲Birthdate的列的數據類型。但我擁有的是表架構和列名稱。 – steventnorris

+0

你有什麼格式的表格模式? –

+0

它是一個使用SqlDataReader對象上的GetSchemaTable()獲取的DataTable C#對象。 – steventnorris

0

如果您使用SQL Server,則可以使用SET FMTONLY。它僅向客戶端返回元數據。它可以用來測試響應的格式而不需要實際運行查詢。

SqlCommand cmd = connection.CreateCommand(); 
cmd.CommandText = "SET FMTONLY ON; select column from table; SET FMTONLY OFF"; 
SqlDataReader reader = cmd.ExecuteReader(); 
SqlDbType type = (SqlDbType)(int)reader.GetSchemaTable().Rows[0]["ProviderType"]; 

禮貌:StackOverflow

1

INFORMATION_SCHEMA.COLUMNS表提供了你需要比SYS.COLUMNS表什麼更明確的信息。 你可以嘗試以下方法:

SELECT data_type, character_maximum_length 
FROM information_schema.columns 
WHERE table_name = 'tableName' AND column_name = 'columnName'