【问题标题】:How can get correct Column Name from Database with Npgsql?如何使用 Npgsql 从数据库中获取正确的列名?
【发布时间】:2018-07-25 04:48:13
【问题描述】:

这是我在数据库中的表:

CREATE TABLE public.test
(
  id integer NOT NULL DEFAULT nextval('test_id_seq'::regclass),
  hc character varying(30),
  "Hc" character varying(30),
  "HC" character varying(30),
  f character varying(30),
  "F" character varying(30),
  f1 character varying(30),
  te numeric(2,2),
  CONSTRAINT test_pkey PRIMARY KEY (id)
)

如果我从 vb.net 获得 Npgsql 的表定义:

select * from test where null = null

结果:一些列已更改名称: 例如:Hc => Hc1,HC => HC2

如何使用 Npgsql 从数据库中获取正确的列名?

【问题讨论】:

  • 您能否发布一些代码来准确显示您在做什么?使用NpgsqlDataReader.GetName() 获取字段名称会显示正确的名称。

标签: sql .net vb.net npgsql


【解决方案1】:

您似乎(直接或间接)使用DbDataAdapter.Fill,如有必要,它将列重命名如下:

如果 DbDataAdapter 在填充 DataTable,它为后续列生成名称,使用 模式“columnname1”、“columnname2”、“columnname3”等等。

显然,此重复数据删除过程以不区分大小写的方式处理列名,这就是为什么在您的示例中列也被重命名的原因。无法直接关闭此行为(请参阅AdapterUtil.cs,2402)。

解决方法是使用额外的SqlCommand 并使用SqlDataReader.GetName 来获取确切的列名,然后相应地更改DataTable 的列。这可以按如下方式完成:

Dim query = "select * from test where null = null"

' setup connection
Dim connection As New NpgsqlConnection(
    String.Format("Server={0};Port={1};Database={2};User Id={3};Password={4};",
                  host, port, database, user, password))
connection.Open()

' fill data table from query
Dim table As New DataTable
Using adapter = New NpgsqlDataAdapter(query, connection)
    adapter.Fill(table)
End Using

' correct column names
Using command = New NpgsqlCommand(query, connection)
    Using reader = command.ExecuteReader()
        For i = 0 To table.Columns.Count - 1
            table.Columns(i).ColumnName = reader.GetName(i)
        Next
    End Using
End Using

' display table in DataGridView
view.DataSource = table

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 2015-11-29
    相关资源
    最近更新 更多