2011-03-20 33 views
0

以下是來自開源項目Funnelweb。我正在將其從SQL Express轉換爲SQL CE 4.0。發送到數據庫的SQL包含邏輯OR(||)。這會導致SQL錯誤。 anyboy可以解釋爲什麼會發生這種情況嗎?Nhibernate爲基本查詢創建不尋常的SQL

FLuenbt Nhibernate的映射

public class TagMapping : ClassMap<Tag> 
    { 
     public TagMapping() 
     { 
      Id(x => x.Id); 
      Map(x => x.Name); 
      HasManyToMany(x => x.Entries) 
       .Table("TagItem") 
       .ParentKeyColumn("TagId") 
       .ChildKeyColumn("EntryId") 
       .AsSet() 
       .Inverse() 
       .LazyLoad(); 
     } 
    } 


public IQueryable<Tag> GetTags(string tagName) 
     { 
      tagName = tagName ?? string.Empty; 

      return from tag in session.Query<Tag>() 
        where tag.Name.Contains(tagName) 
        select tag; 

     } 

SQL它發送到查詢數據庫

select tag0_.Id as Id7_, tag0_.Name as Name7_ from "Tag" tag0_ where tag0_.Name like ('%'||@p0||'%') 

堆棧跟蹤

NHibernate.Exceptions.GenericADOException was unhandled by user code 
    Message=could not execute query 
[ select tag0_.Id as Id7_, tag0_.Name as Name7_ from "Tag" tag0_ where tag0_.Name like ('%'||@p0||'%') ] 
    Name:p1 - Value: 
[SQL: select tag0_.Id as Id7_, tag0_.Name as Name7_ from "Tag" tag0_ where tag0_.Name like ('%'||@p0||'%')] 
    Source=NHibernate 
    SqlString=select tag0_.Id as Id7_, tag0_.Name as Name7_ from "Tag" tag0_ where tag0_.Name like ('%'||@p0||'%') 
    StackTrace: 
     at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) 
     at NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters) 
     at NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes) 
     at NHibernate.Hql.Ast.ANTLR.Loader.QueryLoader.List(ISessionImplementor session, QueryParameters queryParameters) 
     at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.List(ISessionImplementor session, QueryParameters queryParameters) 
     at NHibernate.Engine.Query.HQLQueryPlan.PerformList(QueryParameters queryParameters, ISessionImplementor session, IList results) 
     at NHibernate.Impl.SessionImpl.List(IQueryExpression queryExpression, QueryParameters queryParameters, IList results) 
     at NHibernate.Impl.SessionImpl.List(IQueryExpression queryExpression, QueryParameters parameters) 
     at NHibernate.Impl.ExpressionQueryImpl.List() 
     at NHibernate.Linq.NhQueryProvider.ExecuteQuery(NhLinqExpression nhLinqExpression, IQuery query, NhLinqExpression nhQuery) 
     at NHibernate.Linq.NhQueryProvider.Execute(Expression expression) 
     at NHibernate.Linq.NhQueryProvider.Execute[TResult](Expression expression) 
     at Remotion.Data.Linq.QueryableBase`1.GetEnumerator() 
     at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
     at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
     at FunnelWeb.Web.Areas.Admin.Views.WikiAdmin.EditModel..ctor(PageName page, Int32 originalEntryId, IEnumerable`1 tags) in C:\Projects\oss\funnelweb\src\FunnelWeb.Web\Areas\Admin\Views\WikiAdmin\EditModel.cs:line 24 
     at FunnelWeb.Web.Areas.Admin.Controllers.WikiAdminController.Edit(PageName page, Nullable`1 revertToRevision) in C:\Projects\oss\funnelweb\src\FunnelWeb.Web\Areas\Admin\Controllers\WikiAdminController.cs:line 52 
     at lambda_method(Closure , ControllerBase , Object[]) 
     at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) 
     at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) 
     at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) 
     at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() 
     at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) 
    InnerException: System.Data.SqlServerCe.SqlCeException 
     Message=There was an error parsing the query. [ Token line number = 1,Token line offset = 91,Token in error = | ] 
     Source=SQL Server Compact ADO.NET Data Provider 
     ErrorCode=-2147467259 
     HResult=-2147217900 
     NativeError=25501 
     StackTrace: 
      at System.Data.SqlServerCe.SqlCeCommand.ProcessResults(Int32 hr) 
      at System.Data.SqlServerCe.SqlCeCommand.CompileQueryPlan() 
      at System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(CommandBehavior behavior, String method, ResultSetOptions options) 
      at System.Data.SqlServerCe.SqlCeCommand.ExecuteReader(CommandBehavior behavior) 
      at System.Data.SqlServerCe.SqlCeCommand.ExecuteDbDataReader(CommandBehavior behavior) 
      at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader() 
      at NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd) 
      at NHibernate.Loader.Loader.GetResultSet(IDbCommand st, Boolean autoDiscoverTypes, Boolean callable, RowSelection selection, ISessionImplementor session) 
      at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) 
      at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) 
      at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) 
     InnerException: 
+0

你在用什麼方言? – 2011-03-21 00:33:12

+0

MsSqlCeDialect和MsSqlCe40Dialect都在做同樣的事情 – 2011-03-21 02:06:29

回答

3

嘗試子類MsSqlCe [40]方言和添加構造函數中的以下行:

RegisterFunction("concat", 
       new VarArgsSQLFunction(NHibernateUtil.String, "(", "+", ")")); 

如果一切正常,請打開吉拉票(http://jira.nhforge.org)用它作爲一個補丁MsSqlCeDialect。

+0

Jira Ticket已經打開:http://216.121.112.228/browse/NH-2590 – 2011-03-21 22:26:35

+0

謝謝迭戈。作品一種享受 – 2011-03-22 09:16:18