【发布时间】:2012-06-16 16:41:18
【问题描述】:
我需要使用列名获取列的数据类型。我正在用 C# 编码。情况是我有一个将一些日期转换为 varchar 的视图,以便我可以更好地显示它们(准确地说没有时间)。但是,这意味着列的数据类型现在不正确。我想做的是使用列名从 DataTable 模式中查找列,然后获取该列的数据类型。在这种情况下,我将从主表而不是视图中收集实际数据类型。想法?
【问题讨论】:
标签: c# datatable sqldatatypes sql-view
我需要使用列名获取列的数据类型。我正在用 C# 编码。情况是我有一个将一些日期转换为 varchar 的视图,以便我可以更好地显示它们(准确地说没有时间)。但是,这意味着列的数据类型现在不正确。我想做的是使用列名从 DataTable 模式中查找列,然后获取该列的数据类型。在这种情况下,我将从主表而不是视图中收集实际数据类型。想法?
【问题讨论】:
标签: c# datatable sqldatatypes sql-view
DataTable.Columns 属性是一个DataColumnCollection,它可以是indexed by column name 得到一个DataColumn,它有一个DataType 属性。
【讨论】:
information_schema.columns 表比 sys.columns 表为您提供更清晰的信息。 您可以尝试以下方法:
SELECT data_type, character_maximum_length
FROM information_schema.columns
WHERE table_name = 'tableName' AND column_name = 'columnName'
【讨论】:
如果不从值中推断类型,我看不出这怎么可能。如果您有来自视图的结果和代码中的列名,则有关视图使用的表的信息此时将丢失。
如果您知道表的名称,当然可以获取有关表的信息;可以使用这样的简单查询来完成:
SELECT TOP 0 * FROM <<tableName>>
或使用 DMV:
SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('<<tableName>>')
在第一种情况下,您在 IDataReader 上使用 GetSchemaTable 并遍历行以按名称查找列;在第二种情况下,您可以遍历结果集本身并以这种方式找到您的列。
【讨论】:
如果您使用的是 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"];
【讨论】: