读入DataTable时的列类型

时间:2019-03-14 09:32:29

标签: c# npgsql

通过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#还是陌生的,我认为也许有可能使数据类型更精确。

1 个答案:

答案 0 :(得分:0)

如果需要标识数据表的列的数据类型。您可以访问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