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 的二进制导入 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)