2011-07-14 72 views
8

我有基本上必須做這樣的查詢系統:使用小巧玲瓏與SQL空間類型作爲參數

SELECT * FROM MyTable WHERE @parameter.STIntersects(MyGeometryColumn) 

這是非常簡單的香草SQL參數時做的,你就必須在一個非典型的方式來創建你的參數(其中建設者變量是我用它來創建一個矩形一個SqlGeometryBuilder):

command.Parameters.Add(new SqlParameter 
{ 
    UdtTypeName = "geometry", 
    Value = builder.ConstructedGeometry, 
    ParameterName = "@paremeter" 
}); 

現在,當我試圖做到這一點使用短小精悍,我得到一個錯誤它無法弄清楚如何使用它作爲參數。誰有這個工作,或任何指示如何啓用此?我有一個解決方法,但涉及使用字符串表示並將其轉換爲SQL查詢中的幾何類型。我真的不想那樣。

要回答評論,我收到的錯誤是'Microsoft.SqlServer.Types.SqlGeometry類型的成員參數不能用作參數值'。換句話說,dapper不知道如何處理一個SqlGeometry對象作爲參數。

+0

你正在收到什麼錯誤? –

回答

10

來實現怪異和奇妙的DB具體PARAMS所有的關鍵歸結爲SqlMapper.IDynamicParameters

這個簡單的接口只有一個端點:

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

小巧玲瓏已經有一個DB通用實現這個接口叫: DynamicParameters它允許你處理輸出和返回值。

爲了模擬這種空間的東西,我會嘗試這樣的:

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

用法:

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

這種簡單的接口的實現只處理一個PARAM,但它可以很容易通過從構造函數傳入或添加助手AddParameter方法來擴展以處理多個參數。

+0

它完美的作品!謝謝:) –

+0

注意:當前版本的Dapper(在撰寫本評論時)有一個稍微不同的接口方法簽名,現在=>'void AddParameters(IDbCommand command,SqlMapper.Identity identity)' –

1
  • Dapper.EntityFramework 1.26有DbGeography
  • 小巧玲瓏1.32支持有SqlGeography
  • 小巧玲瓏1.33的內置支持有SqlGeometry
  • 內置支持Dapper.EntityFramework 1.33有DbGeometry
  • 小巧精緻的內置支持1.34內置支持SqlHierarchyId

所以最新的圖書館;它應該簡單地工作。