带有WellKnownText空间数据列的SqlBulkCopy DataTable

mor*_*are 8 .net c# sql-server sqlbulkcopy sqlgeometry

我正在尝试批量复制DataTable包含以下列的内容:

  • "ID" - System.Int32
  • "Geom" - System.String

使用以下列进入SQL数据库:

  • "ID" - int
  • "形状" - geometry

谁能建议最好的方法来做到这一点?

一些测试代码,如果它有帮助......

DataTable dataTable = new DataTable();
dataTable.Columns.Add("ID", typeof(Int32));
dataTable.Columns.Add("Geom", typeof(String));

dataTable.Rows.Add(1, "POINT('20,20')");
dataTable.Rows.Add(1, "POINT('40,25')");
dataTable.Rows.Add(1, "POINT('60,30')");

SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(connection);
sqlBulkCopy.DestinationTableName = "MySpatialDataTable";
sqlBulkCopy.WriteToServer(dataTable);
Run Code Online (Sandbox Code Playgroud)

我的原始帖子未能解释执行上述操作会导致抛出以下异常.

InvalidOperationException:数据源中String类型的给定值无法转换为指定目标列的类型udt.

我假设从这里SqlBulkCopy不知道geometry列类型,因此不知道如何从a转换为它string.谁能证实这一点?

Dav*_*vre 11

您的"Geom"列需要是type SqlGeometry,而不是字符串.Sql Server将期望插入的几何列的用户定义类型(UDT).这是我会用的:

DataTable dataTable = new DataTable();
dataTable.Columns.Add("ID", typeof(Int32));
dataTable.Columns.Add("Geom", typeof(SqlGeometry));

dataTable.Rows.Add(1, SqlGeometry.STGeomFromText("POINT('20,20')"));
dataTable.Rows.Add(2, SqlGeometry.STGeomFromText("POINT('40,25')"));
dataTable.Rows.Add(3, SqlGeometry.STGeomFromText("POINT('60,30')"));

SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(connection);
sqlBulkCopy.DestinationTableName = "MySpatialDataTable";
sqlBulkCopy.WriteToServer(dataTable);
Run Code Online (Sandbox Code Playgroud)

请注意,我们从您的字符串构造实际的SqlGeometry类型.批量插入将负责将其转换为SqlServer将识别的二进制格式.

另外,我不确定为什么要插入具有相同ID的多个记录(样本中的所有ID都是1).

祝好运!