1

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

4

4 回答 4

4

DataTable.Columns属性是 a DataColumnCollection,可以通过列名索引得到 a DataColumn,它有一个DataType属性。

于 2012-06-13T17:02:37.273 回答
1

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

SELECT data_type, character_maximum_length
FROM information_schema.columns
WHERE table_name = 'tableName' AND column_name = 'columnName'
于 2013-01-15T15:00:52.967 回答
0

如果不从值中推断类型,我看不出这是怎么可能的。如果您有来自视图的结果和代码中的列名,则有关视图使用的表的信息此时会丢失。

如果你知道它的名字,你当然可以得到关于这个表的信息;这可以使用这样的简单查询来完成:

SELECT TOP 0 * FROM <<tableName>>

或使用 DMV:

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

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

于 2012-06-13T16:59:20.363 回答
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"];  

礼貌:堆栈溢出

于 2012-06-13T17:15:36.203 回答