代码之家  ›  专栏  ›  技术社区  ›  D T

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

  •  0
  • D T  · 技术社区  · 8 年前

    这是我在数据库中的表:

    create table public.test
    (
    id integer不为空默认nextval(“test_id_seq”::regclass),
    HC字符变化(30)
    “hc”字符变化(30),
    “hc”字符变化(30),
    f字符变化(30),
    “f”字符变化(30),
    F1字符变化(30),
    TE数值(2,2)
    约束测试密钥主键(ID)
    )
    < /代码> 
    
    

    如果我从vb.net得到一个由npgsql定义的表:

    select*from test where null=null
    < /代码> 
    
    

    结果:部分色谱柱更名: 例如:hc=>hc1,hc=>hc2

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

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

    select * from test where null = null
    

    结果:部分色谱柱更名: 例如:hc=>hc1,hc=>hc2 enter image description here

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   martin_joerg    7 年前

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

    如果在填充 数据表,它使用 模式“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
    
    推荐文章