首页 > 解决方案 > 读入 DataTable 时的列类型

问题描述

通过 Load 将全部内容读入 DataTable 后,所有列的类型Rows.ItemArray始终为“对象”。尽管在运行时,读者应该知道正确的类型。由于某些原因,我需要一个 DataTable 演示文稿。

using (var cmd = new NpgsqlCommand(sql, conn)) 
{
    var reader = cmd.ExecuteReader();
    int fieldCount = reader.FieldCount;
    workTable = new DataTable(DateTime.Now.ToString());
    workTable.Load(reader);
    return workTable;
}

这是因为我需要在内存中对我的查询进行完整的数据表示。因此,要求迫使我定义如下:

public IDictionary Pair(string key1, string key2)
{
    var r = from DataRow r1 in workTable.Rows
            from DataRow r2 in workTable.Rows
            select new { rk1 = r1[key1], rk2 = r2[key2] };

    Dictionary<Object, Object> result = r.ToDictionary(x => x.rk1, x => x.rk2);

    return result;
}

它有效,但我是 c# 的新手,我认为也许有一些可能性可以更精确地处理数据类型。

标签: c#npgsql

解决方案


如果您需要识别 DataTable 的列的数据类型。您可以访问 DataTable.Columns 集合。举个例子。

如果您有以下表结构。

CREATE TABLE table01 (
  id      int NOT NULL,
  field1  varchar(30),
  field2  timestamp);

您可以执行以下代码段

string sql = "Select * from table01";
using (var conn = new NpgsqlConnection(cs))
{
    conn.Open();
    using (var cmd = new NpgsqlCommand(sql, conn))
    {
        var reader = cmd.ExecuteReader();
        int fieldCount = reader.FieldCount;
        var workTable = new DataTable(DateTime.Now.ToString());
        workTable.Load(reader);

        for (int i = 0; i < workTable.Columns.Count; i++)
        {
            Console.WriteLine($"field: {workTable.Columns[i].ColumnName} is of type {workTable.Columns[i].DataType.ToString()}");

        }

    }
}

将输出以下内容。

field: id is of type System.Int32
field: field1 is of type System.String
field: field2 is of type System.DateTime

-HTH


推荐阅读