【发布时间】:2021-11-20 05:22:15
【问题描述】:
在 CSV 文件中有数据 解析 CSV 文件以将数据插入 Postgres DB。列数据类型之一是“地理”
数据采用这种形式"0101000020BB100000FCA776FD9E256240F2EBF2AD0F0D43C0"
g = "0101000020BB100000FCA776FD9E256240F2EBF2AD0F0D43C0"
使用ST_GeomFromText(@g).. 插入此数据但会引发此错误
Npgsql.PostgresException:XX000:解析错误 - 无效几何数据: 严重性:错误 InvariantSeverity:错误 SqlState:XX000
MessageText:解析错误 - 无效几何提示:“01” 例程:pg_parser_errhint
代码
insert into testtable values (@s1,@s2,@s3,@s4,@s5,@s6,@s7,@s8,@s9,@s10,@s11,@s12,@s13,@s14,@s15,@s16,@s17,@s18,@s19,@s20,@s21,@s22,@s23,@s24,@s25,@s26,@s27,ST_GeomFromWKB(@s28))
【问题讨论】:
-
您发布的内容看起来像十六进制形式的二进制,而不是 WKT。文字是
MULTIPOINT ((10 40), (40 30), (20 20), (30 10))。您必须先将该十六进制字符串转换为字节,然后使用`ST_GeomFromWKB`。或use NetTopologySuite with NpgSql 将强类型几何值发送到服务器,而不是让服务器解析它们 -
使用插入语句..用c# Npgsql插入数据
-
无论如何,请发布您的实际代码和表架构。如果你使用
new NpgsqlCommand("INSERT INTO data (geom) VALUES (@p)", conn)和Point值,你就不会遇到这样的问题。您将无法将COPY与ST_GeomFromText一起使用。显然你在做别的事情。 -
将您的代码添加到问题本身。添加 C# 和 SQL 代码。这里的问题是因为 C# 代码发送的是十六进制字符串而不是字节数组。如果您使用 WKBReader 类,则可以避免解析。它的
HexToBytes会将十六进制字符串转换为byte[],其Read方法会将byte[]转换为IGeometry值,可以直接用作参数 -
@user3676367 你试过
@s28::geography吗?另外,您能否添加发送到数据库的INSERT语句的样子?
标签: c# postgresql postgis