2011-12-09 28 views
3

我正在將NHibernate 3引入到ASP.NET MVC Web應用程序的數據訪問層中。NHibernate將地理類型傳遞給名稱查詢SetParameter()

內的SQL Server 2008 R2數據庫,geography數據類型用於經/緯座標存儲在映射到應用程序中的實體表(稱之爲EntityA)。

我已經建立了流暢的映射到數據類型的屬性映射成功地對GisSharpBlog.NetTopologySuite.Geometries.PointEntityA,與它映射到派生MsSql2008GeographyType自定義映射約定。

上述所有似乎都工作正常,但仍有一些存儲過程仍在使用,期望一個參數的類型爲geography。我已經將存儲過程映射爲命名查詢,但似乎無法確定類型geography的參數類型。發生查詢呼叫的方法需要經緯度爲double,經度爲double。在舊的存儲過程調用映射與

private static SqlGeography GetPoint(double latitude, double longitude) 
{ 
    var geographyBuilder = new SqlGeographyBuilder(); 
    geographyBuilder.SetSrid(4326); 
    geographyBuilder.BeginGeography(OpenGisGeographyType.Point); 
    geographyBuilder.BeginFigure(latitude, longitude); 
    geographyBuilder.EndFigure(); 
    geographyBuilder.EndGeography(); 
    return geographyBuilder.ConstructedGeography; 
} 

var point = GetPoint(latitude, longitude); 

command.Parameters.Add(
    new SqlParameter("@Location", point) { UdtTypeName = "Geography" }); 

運行SQL事件探查器完成,下面的命令被執行

declare @p3 sys.geography 
set @p3=convert(sys.geography,0xE6100000010CAD4D637B2DBA49400BEE77280AB404C0) 
exec my-sproc-name @[email protected] 

當我嘗試用下面的

var query = Session.GetNamedQuery("my-sproc-name"); 

var point = 
    new GisSharpBlog.NetTopologySuite.Geometries.Point(longitude, latitude); 
query.SetParameter("Location", point); 

我得到映射一個SqlException與Error converting data type varbinary to geography

[SqlException(0x80131904):將數據類型varbinary轉換爲 地理位置時出錯。誤差數據類型VARBINARY轉換爲地理。]
System.Data.SqlClient.SqlConnection.OnError(SqlException異常, 布爾breakConnection)2073502
System.Data.SqlClient.SqlInternalConnection.OnError(SQLEXCEPTION 例外,布爾breakConnection)+ 5064460
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()234
System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, 的SqlCommand cmdHandler,SqlDataReader的數據流, BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj)2275
System.Data.SqlClie nt.SqlDataReader.ConsumeMetaData()33
System.Data.SqlClient.SqlDataReader.get_MetaData()86
System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader的DS, RunBehavior runBehavior,字符串resetOptionsString)311
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(的CommandBehavior cmdBehavior,RunBehavior runBehavior,布爾returnStream,布爾 異步)987
System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior cmdBehavior,RunBehavior runBehavior,布爾returnStream,字符串 方法,DbAsyncResult結果)+162
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String method)+32
System.Data.SqlClient.SqlCommand。的ExecuteReader(的CommandBehavior 行爲,字符串方法)141
System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(的CommandBehavior 行爲)12
System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader() + 12 NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand的CMD)356 NHibernate.Driver.BatcherDataReaderWrapper..ctor(IBatcher配料,IDbCommand的命令)183
NHibernate.Driver.BasicResultSetsCommand.GetReader(Nullable`1 的CommandTimeout)432的NHibernate .Impl.MultiQueryImpl.DoList()683

潤寧SQL事件探查器,下面的命令被執行

exec sp_executesql N'exec my-sproc-name @p0' @p0=0x0001000000FFFFFFFF01000000000000000C02000000574E6574546F706F6C6F677953756974652C2056657273696F6E3D312E372E332E31373239382C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D663538306130353031366562616461310C030000004947656F4150492C2056657273696F6E3D312E312E302E302C2043756C747572653D6E65757472616C2C205075626C69634B6579546F6B656E3D6131613064613764656634363536373805010000002E4769735368617270426C6F672E4E6574546F706F6C6F677953756974652E47656F6D6574726965732E506F696E74090000000B636F6F7264696E6174657308656E76656C6F70651047656F6D657472792B666163746F72791147656F6D657472792B75736572446174611147656F6D657472792B656E76656C6F70650D47656F6D657472792B737269641247656F6D657472792B64696D656E73696F6E1147656F6D657472792B626F756E646172791A47656F6D657472792B626F756E6461727944696D656E73696F6E040404020400040404404769735368617270426C6F672E4E6574546F706F6C6F677953756974652E47656F6D6574726965732E436F6F7264696E617465417272617953657175656E6365020000001B47656F4150492E47656F6D6574726965732E49456E76656C6F706503000000384769735368617270426C6F672E4E6574546F706F6C6F677953756974652E47656F6D6574726965732E47656F6D65747279466163746F7279020000001B47656F4150492E47656F6D6574726965732E49456E76656C6F706503000000081C47656F4150492E47656F6D6574726965732E44696D656E73696F6E73030000001B47656F4150492E47656F6D6574726965732E4947656F6D65747279030000001C47656F4150492E47656F6D6574726965732E44696D656E73696F6E73030000000200000009040000000A09050000000A0A0000000005FAFFFFFF1C47656F4150492E47656F6D6574726965732E44696D656E73696F6E73010000000776616C75655F5F000803000000000000000A01F9FFFFFFFAFFFFFF000000000504000000404769735368617270426C6F672E4E6574546F706F6C6F677953756974652E47656F6D6574726965732E436F6F7264696E617465417272617953657175656E6365010000000B636F6F7264696E61746573041F47656F4150492E47656F6D6574726965732E49436F6F7264696E6174655B5D030000000200000009080000000505000000384769735368617270426C6F672E4E6574546F706F6C6F677953756974652E47656F6D6574726965732E47656F6D65747279466163746F7279030000000E707265636973696F6E4D6F64656C19636F6F7264696E61746553657175656E6365466163746F72790473726964040400374769735368617270426C6F672E4E6574546F706F6C6F677953756974652E47656F6D6574726965732E507265636973696F6E4D6F64656C02000000474769735368617270426C6F672E4E6574546F706F6C6F677953756974652E47656F6D6574726965732E436F6F7264696E617465417272617953657175656E6365466163746F72790200000008020000000909000000090A000000000000000708000000000100000001000000041D47656F4150492E47656F6D6574726965732E49436F6F7264696E61746503000000090B0000000509000000374769735368617270426C6F672E4E6574546F706F6C6F677953756974652E47656F6D6574726965732E507265636973696F6E4D6F64656C02000000096D6F64656C54797065057363616C6504002147656F4150492E47656F6D6574726965732E507265636973696F6E4D6F64656C7303000000060200000005F4FFFFFF2147656F4150492E47656F6D6574726965732E507265636973696F6E4D6F64656C73010000000776616C75655F5F000803000000000000000000000000000000050A000000474769735368617270426C6F672E4E6574546F706F6C6F677953756974652E47656F6D6574726965732E436F6F7264696E617465417272617953657175656E6365466163746F72790000000002000000050B000000334769735368617270426C6F672E4E6574546F706F6C6F677953756974652E47656F6D6574726965732E436F6F7264696E6174650300000001780179017A000000060606020000000BEE77280AB404C0AD4D637B2DBA4940000000000000F8FF0B 

可以看出,從什麼已經傳給SetParameter()並在命令通過確定的值是不同的。

是否可以傳遞一個類型到一個命名查詢來做我想要的?

回答

3

在檢查作爲第三個參數SetParameter()的具體類型後,我想通了。以下作品

private static SqlGeography GetPoint(double latitude, double longitude) 
{ 
    var geographyBuilder = new SqlGeographyBuilder(); 
    geographyBuilder.SetSrid(4326); 
    geographyBuilder.BeginGeography(OpenGisGeographyType.Point); 
    geographyBuilder.BeginFigure(latitude, longitude); 
    geographyBuilder.EndFigure(); 
    geographyBuilder.EndGeography(); 
    return geographyBuilder.ConstructedGeography; 
} 

var query = Session.GetNamedQuery("my-sproc-name"); 

var point = GetPoint(latitude, longitude); 
query.SetParameter(
    "Location", 
    point, 
    new NHibernate.Spatial.Type.SqlGeographyType()); 

// my-sproc-name is mapped to return a collection of EntityA types 
query.List<EntityA>(); 

NHibernate.Spatial.Type.SqlGeographyType類型可以在NHibernate.Spatial.dll組裝找到。

相關問題