sql >> Databasteknik >  >> RDS >> Sqlserver

Använda Dapper med SQL Spatial Types som parameter

Nyckeln till att implementera konstiga och underbara DB-specifika parametrar handlar om SqlMapper.IDynamicParameters

Detta enkla gränssnitt har en enda slutpunkt:

public interface IDynamicParameters
{
    void AddParameters(IDbCommand command);
}

Dapper har redan en DB-generisk implementering av detta gränssnitt som heter:DynamicParameters som låter dig hantera ut- och returvärden.

För att efterlikna dessa rumsliga saker skulle jag prova något i stil med:

public class SpatialParam : SqlMapper.IDynamicParameters
{
    string name; 
    object val;

    public SpatialParam(string name, object val)
    {
       this.name = name; 
       this.val = val;
    }

    public void AddParameters(IDbCommand command, SqlMapper.Identity identity)
    {
       var sqlCommand = (SqlCommand)command;
       sqlCommand.Parameters.Add(new SqlParameter
       {
          UdtTypeName = "geometry",
          Value = val,
          ParameterName = name
       });
    }
}

Användning:

cnn.Query("SELECT * FROM MyTable WHERE @parameter.STIntersects(MyGeometryColumn)",
  new SpatialParam("@parameter", builder.ConstructedGeometry));

Den här enkla implementeringen av gränssnittet hanterar bara en enda param, men den kan enkelt utökas till att hantera flera parametrar, antingen genom att skicka in från konstruktorn eller lägga till en hjälparmetod AddParameter.



  1. Hur LENGTH() fungerar i MariaDB

  2. SYSDATETIME() vs GETDATE() i SQL Server:Vad är skillnaden?

  3. Att lägga till en kolumn som en främmande nyckel ger ERROR kolumn som refereras i främmande nyckel begränsning existerar inte

  4. Hur man går igenom session array i php