【问题标题】:Get DataType from Column Name从列名获取数据类型
【发布时间】:2012-06-16 16:41:18
【问题描述】:

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

【问题讨论】:

    标签: c# datatable sqldatatypes sql-view


    【解决方案1】:

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

    【讨论】:

    • 这是否适用于在 SqlDataReader 对象上使用 GetSchemaTable() 收集的 DataTable?
    • 好吧,模式表似乎不包含 sql 表的列名。每行代表sql表的一列,列是属性(如列名和数据类型),所以这种方法似乎不起作用。
    • 如果您知道该列的索引(您要确定的类型),那么您可以通过对 Columns 集合进行数字索引来获取 DataColumn:msdn.microsoft.com/en-us/library/tb313x8d 如果您不知道该索引,然后遍历所有列并打印它们的 DataType:foreach (var c in t.Columns) Console.WriteLine(c.DataType.FullName);
    • 是的。我认为这是我使用这种方法的唯一选择。我最终可能会重新组织这段代码。在我的情况下,每次迭代都会减慢速度。谢谢!
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      SELECT TOP 0 * FROM <<tableName>>
      

      或使用 DMV:

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

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

      【讨论】:

      • 我可以很好地获取表的架构,我只需要通过列名知道该表中列的数据类型。例如,我有一个包含姓名、出生日期、年龄列的表格。我想知道名为 Birthdate 的列的数据类型。但我只有表架构和列名。
      • 这是一个 DataTable C# 对象,在 SqlDataReader 对象上使用 GetSchemaTable() 获得。
      【解决方案4】:

      如果您使用的是 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-01
        • 1970-01-01
        • 2018-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-02
        相关资源
        最近更新 更多