sql - 如何使用 Npgsql 从数据库中获取正确的列名?
问题描述
这是我在数据库中的表:
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 从数据库中获取正确的列名?
解决方案
如果需要,您似乎(直接或间接)使用DbDataAdapter.Fill
which 重命名列如下:
如果 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
推荐阅读
- python - Matplotlib 流图不同颜色
- angular - 值不会在视图中更新
- cypress - 赛普拉斯:等待不可预知的组件从专有集合中渲染?
- android - 如何在多行 TextView 的末尾添加可点击的 ImageView?
- bytecode - CPU如何执行解释语言代码?
- graphql - 数据未合并,Apollo 3 分页与字段策略
- python - Matplotlib 动画
- android - 在喷气背包导航中处理 backstack
- android - Android Webview 中的密码管理器
- thingsboard - postgreSQL-12:有没有办法启用 FIFO 来限制数据库表的存储容量?