Skip to content

STIsValid returning incorrect result for parameterized query #85

@mark-oppedahl

Description

@mark-oppedahl

I'm trying to work around the lack of a STIsValid() method on SqlGeometry by handing the geometry to SQL to evaluate. But for an invalid self-intersecting polygon, the result comes back as valid if I try to pass the geometry in as a parameter. In the following, isValid1 and isValid2 should match, but they don't. Am I missing something? The SQL connection string can point to any SQL Server instance you want. Using the 1.5.0 version for System.Data.SqlClient compatibility.

using Microsoft.SqlServer.Types;
...
var wkt = "POLYGON ((90.0219727 43.0729006, 91.4282227 42.0207329, 89.9395752 42.0859935, 91.5490723 43.0648747, 90.0219727 43.0729006))";
var geo = SqlGeography.STGeomFromText(new SqlChars(new SqlString(wkt)), 4326);

using (var conn = new SqlConnection("Integrated Security=SSPI;Initial Catalog=UnitTest;Data Source=(localdb)\\MSSQLLocalDB;"))
{
    conn.Open();
    using (var cmd = conn.CreateCommand())
    {
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "SELECT @1.STIsValid(), geography::STGeomFromText(@2, 4326).STIsValid()";

        var param = cmd.CreateParameter();
        param.ParameterName = "@1";
        param.Value = geo;
        param.SqlDbType = SqlDbType.Udt;
        param.UdtTypeName = "Geography";
        cmd.Parameters.Add(param);

        param = cmd.CreateParameter();
        param.ParameterName = "@2";
        param.Value = wkt;
        cmd.Parameters.Add(param);

        using(var reader = cmd.ExecuteReader())
        {
            reader.Read();
            var isValid1 = reader.GetBoolean(0);
            var isValid2 = reader.GetBoolean(1);
        }
    }
} 

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workinghelp wantedExtra attention is needed

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions