【发布时间】:2015-08-15 07:07:44
【问题描述】:
我正在尝试在 SQL 2000 的休眠中使用 Take 方法。这样做时,它给了我错误:Dialect does not support variable limits.
在四处搜索中,我找到了一种方法来覆盖对变量限制支持的检查并将我的代码设置如下:
return Fluently.Configure()
.Database(PersistenceConfigurer("####"))
.Mappings(m => m.HbmMappings.AddFromAssembly(Assembly.Load("####")))
.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.Load("####")))
.CurrentSessionContext<WebSessionContext>()
.BuildSessionFactory();
}
private static IPersistenceConfigurer PersistenceConfigurer(string connection)
{
var provider = MsSqlConfiguration.MsSql2000.ConnectionString(connection);
provider.Dialect<FixedDialect>();
return provider;
}
}
public class FixedDialect : NHibernate.Dialect.MsSql2000Dialect
{
public override bool SupportsVariableLimit
{
get
{
return true;
}
}
}
这似乎生成了正确的语法。它创建语句
[ select top @p0 order0_.field1 as field1_, order0_.field2 as field2_ from db.table order0_ where order0_.field3=@p1 ]
Name:p1 - Value:LY02 Name:p2 - Value:10
但它没有为@p0 设置值,所以它回退了Line 1: Incorrect syntax near '@p0'.
我能做些什么来解决这个问题吗?为什么这个方言不支持top函数?
【问题讨论】:
-
我不认为
TOP可以处理参数。我没有关于如何解决它的答案,所以我没有发布作为答案。 -
我认为 @DavidCrowell 是对的,除非您使用 2005 或更新版本,否则您无法参数化
TOP值 -
@AndrewWhitaker 这是真的吗?我只是直接使用 sql 命令创建了一个小测试应用程序,它按我的预期工作。也适用于 SSMS。
标签: c# nhibernate sql-server-2000