从列名称获取DataType

时间:2012-06-13 16:56:23

标签: c# datatable sqldatatypes sql-view

我需要使用列名获取列的数据类型。我在C#编码。情况是我有一个视图,它将一些日期转换为varchar,所以我可以更好地显示它们(没有时间准确)。但是,这意味着列的数据类型现在不正确。我想要做的是使用列名从DataTable模式中查找列,然后获取该列的数据类型。我将从主表中收集实际数据类型,而不是在这种情况下从视图中收集。想法?

4 个答案:

答案 0 :(得分:4)

答案 1 :(得分:1)

information_schema.columns 表为您提供了比 sys.columns 表更清晰的信息。 您可以尝试以下方法:

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

答案 2 :(得分:0)

如果不从值中推断出类型,我看不出这是怎么回事。如果您拥有代码中的视图和列名称的结果,则该点将丢失有关该视图使用的表的信息。

当然,如果您知道它的名字,您可以获得有关该表的信息;这可以使用像这样的简单查询来完成:

SELECT TOP 0 * FROM <<tableName>>

或使用DMV:

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

在第一种情况下,您在IDataReader上使用GetSchemaTable并迭代行以按名称查找列;在第二种情况下,您可以迭代结果集本身并以这种方式查找列。

答案 3 :(得分: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