2012-06-13 206 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'