C# 转换为TVP的数据表中的SqlGeometry参数错误

C# 转换为TVP的数据表中的SqlGeometry参数错误,c#,sql,parameters,datatable,sqlgeometry,C#,Sql,Parameters,Datatable,Sqlgeometry,我试图传入一个包含几何多边形的TVP数据表。由于某些原因,在运行查询之前,我的几何体对象被拒绝,并出现以下错误:System.ArgumentException:不支持列“坐标”的类型。类型为“SqlGeometry” 我使用的TVP如下所示: CREATE TYPE [prop].[ShapeTableType] AS TABLE( [Coordinates] [geometry] NULL, [Inclusive] [bit] NULL, [Radius] [deci

我试图传入一个包含几何多边形的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
填充它的代码如下所示:

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");
            }
        }
从lat/long列表中提取地理对象的方法:

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;
        }
静态SqlGeometryBuilder GetGeometryBuilder(IEnumerable点)
{
SqlGeometryBuilder=新SqlGeometryBuilder();
建造商:Setstrid(4326);
builder.BeginGeometry(OpenGisGeometryType.Polygon);
var firstPoint=points.First();
builder.beginigure(firstPoint.X,firstPoint.Y);
foreach(点F点中的点)
{
//检查是否有任何点与第一个点相等。如果是,请不要添加它们,因为我们将在最后手动添加
//以确保多边形正确闭合。
如果(点!=第一点)
{
建筑商添加线(点X,点Y);
}
}
builder.AddLine(firstPoint.X,firstPoint.Y);
builder.EndFigure();
EndGeometry();
返回生成器;
}
我开始担心DataTable对象中不允许使用“SqlGeometry”类型,但我还没有找到任何明确说明这一点的文档