我试图用nHibernate(2.0.1GA)发出一个SQL更新语句,如下所示:
sqlstring = string.Format("set nocount on;update myusers set geo=geography::Point({0},{1},4326) where userid={2};",mlat,mlong,userid); _session.CreateSQLQuery(sqlstring).ExecuteUpdate();
但是我收到以下错误:’geography @ p0’不是公认的内置函数名称.
我认为CreateSQLQuery只会传递我给它的SQL并执行它…猜不是.关于如何在nHibernate的上下文中做到这一点的任何想法?
解决方法
我很确定我可以告诉你发生了什么,但我不知道是否有解决方法.
我认为问题是NHibernate使用’:’字符来创建命名参数.您的表达式将更改为:
set nocount on;update myusers set geo=geography@p0({0},4326) where userid={2};
@ p0将成为SQL变量.遗憾的是,我找不到任何有关转义冒号的文档,因此它们不会被视为命名参数.
如果存在转义字符(我快速浏览NHibernate源代码没有找到;如果你想花一点时间搜索,则命名参数在NHibernate.Engine.Query.ParameterParser中处理),那么你可以使用它.
其他方案:
>向源添加转义字符.然后,您可以使用NHibernate的修改版本.如果你这样做,你应该把你的补丁提交给团队,这样它就可以包含在真实的东西中,你不必维护源的修改版本(没有乐趣).
>在数据库中创建一个返回geography :: Point的用户定义函数,然后调用函数而不是标准SQL函数.这似乎是最快/最简单的起床和跑步方式,但也有点像创可贴.
>查看NHibernate Spatial中是否有某些内容可以让您以编程方式添加geography :: Point()[或编辑该项目的代码以添加一个并将补丁提交给该团队].