Npgsql 3.0.5 with writer.Write Geometry类型

问题描述 投票:0回答:2

我已经从Npgsql 2.7.0升级到3.0.5,COPY(批量数据传输)是改变我已经看到这个doc并尝试使用新的COPY方法。

使用Npgsql 2.7.0在我的代码中使用“NpgsqlCopyIn”情况“几何”很好。

现在3.0.5:在writer.Close()时出错

{"XX000: Invalid endian flag value encountered."}

这是我的代码......

var query = String.Format("COPY \"{0}\".\"{1}\"  ({2}) FROM STDIN BINARY;",a,b,c)
var writer = conn.BeginBinaryImport(query); 
var o = Common.IO << ...read from zip file... >>
for (int row = 0; row < o.Count; row++) 
{
   writer.StartRow();
   for (int col = 0; col < (o[row].Count - 1); col++)
   {
     switch (columns.ElementAt(col).Value)
       case "varchar":
           writer.Write(o[row][col].ToString().Replace("\0", ""));
           break;
       case "geometry"
           writer.Write<String>((String)o[row][col]);
           break;
       case "int4":
           writer.Write<Int32>(Convert.ToInt32(o[row][col]));
           break;
   }

}
writer.Close();

如果是“几何”,我试试这个;

writer.Write<String>(String.Format("ST_GeomFromText('{0}')", (String)o[row][col]));

要么

writer.Write<String>(String.Format("ST_GeomFromText('{0}')", (String)o[row][col]), NpgsqlTypes.NpgsqlDbType.Line);

不成功!请帮忙

建议将受到高度赞赏,

亲切的问候。

c# postgresql npgsql
2个回答
0
投票

Npgsql的二进制导入COPY不能像您尝试的那样工作。 Npgsql本身负责将值编码为PostgreSQL的二进制格式 - 你不应该像你一样提供二进制数据。例如,要复制一个int,你提供一个普通的,常规的CLR int而不是一个4字节的数组--Npgsql负责处理所有事情。

关于几何特定 - 我假设你指的是PostGIS。在Npgsql 3.0中还没有对PostGIS的二进制支持,所以很遗憾,不可能对这些类型进行二进制COPY。 Npgsql 3.1包含对大多数(但不是全部)几何类型的支持,但它仍然是alpha。一个好的解决方法可能是通过文本导入几何值,在这种情况下,您负责提供值的格式正确的文本表示(有关详细信息,请参阅COPY文档)。


0
投票
Dim wkt As String = g.ToString '"POINT(7 7)"
Dim udtText As New System.Data.SqlTypes.SqlChars(wkt)
Dim sqlGeometry1 As Microsoft.SqlServer.Types.SqlGeometry = Microsoft.SqlServer.Types.SqlGeometry.STGeomFromText(udtText, srid)
Dim ms As New MemoryStream()
Dim bw As New BinaryWriter(ms)
Dim WKB() As Byte = sqlGeometry1.STAsBinary().Buffer
bw.Write(WKB)
dbimporter.Write(WKB, NpgsqlTypes.NpgsqlDbType.Bytea)
© www.soinside.com 2019 - 2024. All rights reserved.