我正在尝试使用 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}, {1}, 4326) where userid={2};
@p0 将是一个 SQL 变量。不幸的是,我找不到任何有关转义冒号的文档,因此它们不被视为命名参数。
如果存在转义字符(我快速浏览 NHibernate 源代码没有找到转义字符;如果您想花更多时间搜索,则命名参数在 NHibernate.Engine.Query.ParameterParser 中处理),那么您可以使用它。
其他解决方案:
- 在源中添加转义字符。然后您可以使用 NHibernate 的修改版本。如果您这样做,您应该将补丁提交给团队,以便它可以包含在真实的东西中,并且您不必维护源代码的修改版本(没有乐趣)。
- 在数据库中创建一个返回 geography::Point 的用户定义函数,然后调用您的函数而不是标准 SQL 函数。这似乎是最快/最简单的启动和运行方法,但也感觉有点像创可贴。
- 看看里面有没有东西NHibernate 空间这将允许您以编程方式添加 geography::Point() [或编辑该项目的代码以添加一个并将补丁提交给该团队]。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)