Ошибка параметра SqlGeometry в DataTable, переведенная в TVP
Я пытаюсь передать данные TVP, содержащие геометрические многоугольники. По какой-то причине мои геометрические объекты отклоняются еще до того, как запрос будет выполнен со следующей ошибкой: System.ArgumentException: тип столбца "Координаты" не поддерживается. Тип "SqlGeometry"
TVP, который я использую, выглядит следующим образом:
CREATE TYPE [prop].[ShapeTableType] AS TABLE(
[Coordinates] [geometry] NULL,
[Inclusive] [bit] NULL,
[Radius] [decimal](7, 2) NULL,
[ShapeType] [varchar](16) NULL
)
GO
и код для его заполнения выглядит следующим образом:
Создать данные:
var dataTable = new DataTable();
dataTable.Columns.Add("Coordinates", typeof(SqlGeometry));
dataTable.Columns.Add("Inclusive", typeof(bool));
dataTable.Columns.Add("Radius", typeof(decimal));
dataTable.Columns.Add("ShapeType", typeof(string));
Создать SqlParameter:
var parameter = new SqlParameter(parameterName, SqlDbType.Structured)
{
TypeName = "prop.ShapeTableType",
Value = dataTable
};
_parameters.Add(parameter);
foreach (var shape in shapes)
{
var polygon = shape as Polygon;
if (polygon != null)
{
var geoPolygon = GetGeometryBuilder(polygon.Coordinates).ConstructedGeometry;
if (geoPolygon == null) continue;
dataTable.Rows.Add(geoPolygon, polygon.IsInclusive, DBNull.Value, "polygon");
}
}
Метод извлечения географического объекта из списка широт / длин:
static SqlGeometryBuilder GetGeometryBuilder(IEnumerable<PointF> points)
{
SqlGeometryBuilder builder = new SqlGeometryBuilder();
builder.SetSrid(4326);
builder.BeginGeometry(OpenGisGeometryType.Polygon);
var firstPoint = points.First();
builder.BeginFigure(firstPoint.X, firstPoint.Y);
foreach (PointF point in points)
{
// check if any of the points equal the first point. If so, do not add them as we'll do this manually at the end
// to ensure the polygon is closed properly.
if (point != firstPoint)
{
builder.AddLine(point.X, point.Y);
}
}
builder.AddLine(firstPoint.X, firstPoint.Y);
builder.EndFigure();
builder.EndGeometry();
return builder;
}
Я начинаю беспокоиться о том, что тип 'SqlGeometry' недопустим в объектах DataTable, но я не нашел никакой документации, явно заявляющей об этом.