This is my table in database:
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)
)
If i get a Table Definition by Npgsql from vb.net:
select * from test where null = null
Result: some colums had changed name:
Ex: Hc => Hc1,HC => HC2
How can get correct Column Name from Database with Npgsql?
答案 0 :(得分:1)
您似乎(直接或间接)使用DbDataAdapter.Fill
,如果需要,它会按以下方式重命名列:
如果DbDataAdapter在填充a时遇到重复的列 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