2012-05-02 56 views
1

我在我的應用程序和firebird中使用nhibernate作爲orm作爲數據庫。 目前正試圖行使membebership提供商,但我有以下錯誤消息NHibernate.Driver.FirebirdClientDriver不支持多個查詢

The driver NHibernate.Driver.FirebirdClientDriver does not support multiple queries. 

有下面的代碼

#region Test FindUserByEmail 
     [Test] 
     public void FindUserByEmail() 
     { 
      //Arrange 
      var email = "[email protected]"; 
      var recs = -1; 
      var expectedRecords = 1; 

      //Act 
      var actual = _provider.FindUsersByEmail(email, 0, 99, out recs); 
      //Assert 
      Assert.AreEqual(expectedRecords, recs); 
      Assert.AreEqual(expectedRecords, actual.Count); 
     } 
     #endregion 

我的測試方法是否有火鳥NHibernate的驅動程序接受多個查詢解決方案嗎?

更新添加FindUsersByEmail方法

public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords) 
     { 
      CheckParameter(ref emailToMatch, false, false, false, 100, "emailToMatch"); 

      if (pageIndex < 0) 
      { 
       throw new ArgumentException("The pageIndex must be greater than or equal to zero.", "PageIndex"); 
      } 
      if (pageSize < 1) 
      { 
       throw new ArgumentException("The pageSize must be greater than zero.", "pageSize"); 
      } 

      long upperBound = (long)pageIndex * pageSize + pageSize - 1; 
      if (upperBound > Int32.MaxValue) 
      { 
       throw new ArgumentException("The combination of pageIndex and pageSize cannot exceed the maximum value of System.Int32.", "pageIndex and pageSize"); 
      } 

      totalRecords = 0; 
      MembershipUserCollection users = new MembershipUserCollection(); 
      IList results; 
      using (ISession session = SessionProvider.Instance.OpenSession()) 
      { 
       using (ITransaction tran = session.BeginTransaction()) 
       { 


        results = session.CreateMultiCriteria() 
             .Add(session.CreateCriteria(typeof(User)).Add(Restrictions.Like("UpperEmail", emailToMatch.ToUpper())).SetFirstResult(pageIndex * pageSize).SetMaxResults(pageSize)) 
             .Add(session.CreateCriteria(typeof(User)).Add(Restrictions.Like("UpperEmail", emailToMatch.ToUpper())).SetProjection(Projections.RowCountInt64())) 
             .List(); 
        tran.Commit(); 
       } 
      } 
      var dbUsers = (List<User>)results[0]; 
      totalRecords = (int)results[1]; 
      foreach (User u in dbUsers) 
      { 
       users.Add(new MembershipUser(Name, 
           u.UserName, 
           u.Id, 
           u.EMail, 
           u.PasswordQuestion, 
           u.Comment, 
           u.IsApproved, 
           u.IsLockedOut, 
           u.CreationDate, 
           GetNullableDateTime(u.LastLoginDate), 
           GetNullableDateTime(u.LastActivityDate), 
           GetNullableDateTime(u.LastPasswordChangeDate), 
           GetNullableDateTime(u.LastLockedOutDate))); 
      } 
      return users; 
+0

你能顯示FindUsersByEmail()的代碼嗎? – Firo

+0

@Firo增加了FindUsersByEmail() – Grunf

回答

2

FirebirdClientDriverFirebirdDriver兩者都不支持multiqueries

如果你有多個RDBMS支持,我會建議利用期貨,而不是多標準,因爲他們全自動落回普通查詢是否支持多查詢

示例:

var userquery = session.CreateCriteria(typeof(User)) 
    .Add(Restrictions.Like("UpperEmail", emailToMatch.ToUpper())) 
    .SetFirstResult(pageIndex * pageSize) 
    .SetMaxResults(pageSize); 

var totalcountQuery = CriteriaTransformer.Clone(userquery) 
    .SetProjection(Projections.RowCountInt64())); 

IEnumerable<User> dbUsers = userquery.Future<User>(); 

IFutureValue<long> count = totalcountQuery.FutureValue<long>(); 

totalcount = count.Value; // both will be executed here 
foreach (User u in dbUsers)