Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Używanie Dappera z SQL Spatial Types jako parametrem

Klucz do implementacji dziwnych i wspaniałych parametrów specyficznych dla bazy danych sprowadza się do SqlMapper.IDynamicParameters

Ten prosty interfejs ma jeden punkt końcowy:

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

Dapper ma już ogólną implementację tego interfejsu w bazie danych o nazwie:DynamicParameters co pozwala na obsługę wartości wyjściowych i zwracanych.

Aby naśladować te przestrzenne rzeczy, spróbowałbym czegoś takiego:

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

Użycie:

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

Ta prosta implementacja interfejsu obsługuje tylko jeden parametr, ale można ją łatwo rozszerzyć do obsługi wielu parametrów, poprzez przekazanie z konstruktora lub dodanie pomocniczej metody AddParameter.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy mogę mieć opcjonalny parametr WYJŚCIOWY w procedurze składowanej?

  2. Usuń wszystkie widoki z serwera SQL

  3. Połącz więcej niż dwie tabele poziomo w SQL Server

  4. SQL Server - gdzie jest sys.functions?

  5. Wskazówki dotyczące naprawiania fragmentacji indeksu SQL Server