Npgsql 3.0.5 与编写器.写入几何类型

本文关键字:何类型 类型 Npgsql | 更新日期: 2023-09-27 18:32:23

我已经从Npgsql 2.7.0升级到3.0.5,COPY(批量数据传输)正在更改我已经看过这个文档并尝试使用新的 COPY 方法。

在我的代码案例中使用"NpgsqlCopyIn"的Npgsql 2.7.0"几何"很好。

现在使用 3.0.5 :写入器错误。关闭()

{"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);

不成功!请帮忙

建议将不胜感激,

亲切问候。

Npgsql 3.0.5 与编写器.写入几何类型

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

特别是关于几何 - 我假设你指的是 PostGIS。在Npgsql 3.0中尚不存在对PostGIS的二进制支持,因此不幸的是,不可能对这些类型进行二进制复制。Npgsql 3.1 包含对大多数(但不是全部)几何类型的支持,但它仍处于 alpha 阶段。一个好的解决方法是通过文本导入几何值,在这种情况下,您需要负责提供正确格式的值文本表示形式(有关更多详细信息,请参阅 COPY 文档)。

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)