sql >> Database >  >> RDS >> Sqlserver

Dapper gebruiken met SQL Spatial Types als parameter

De sleutel tot het implementeren van rare en prachtige DB-specifieke parameters komt allemaal neer op SqlMapper.IDynamicParameters

Deze eenvoudige interface heeft één eindpunt:

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

Dapper heeft al een generieke DB-implementatie van deze interface genaamd:DynamicParameters waarmee u uitvoer- en retourwaarden kunt verwerken.

Om dit ruimtelijke spul na te bootsen zou ik zoiets proberen als:

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
       });
    }
}

Gebruik:

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

Deze eenvoudige implementatie van de interface verwerkt slechts een enkele parameter, maar kan eenvoudig worden uitgebreid om meerdere parameters te verwerken, hetzij door de constructor door te geven of door een hulpmethode AddParameter toe te voegen.



  1. Het opslaan van de uitvoer van een dynamische query die refcursor gebruikt in een tabel

  2. Hoe java.sql.SQLException te overwinnen:uitzondering voor te veel verbindingen?

  3. Geparametriseerde query in Oracle-problemen

  4. Mysql/InnoDB werken niet meer op Linode Server