【问题标题】:GenericADOException was unhandeled using Nhibernate CreateSQLQuery() method使用 Nhibernate CreateSQLQuery() 方法未处理 GenericADOException
【发布时间】:2012-06-24 20:35:56
【问题描述】:

下面的代码有什么问题?

public IList<T> GetPostsByUser(object UserId)
    {
        using (var session = sessionFactory.OpenSession())
        {
            using (var transaction = session.BeginTransaction())
            {
                var queryString = string.Format("SELECT C FROM {0} AS C WHERE UserId=:UserId", typeof(T));
                return session.CreateSQLQuery(queryString).SetParameter("UserId", UserId).List<T>();
                //return session.QueryOver<T>().List<T>().IsLike(UserId).List();
            }
        }
    }

注意:UserId 被强制转换为对象,但其来源来自 System.GUID

例外:

无法执行查询 [从 FNHRepository.Entites.Post AS C 中选择 C,其中 UserId=@p0] 名称:用户 ID - 值:3010cd36-539c-4b32-a0fb-976bca58ad38 [SQL: SELECT C FROM FNHRepository.Entites.Post AS C WHERE UserId=@p0]

【问题讨论】:

  • @p0 的值应该用单引号括起来,例如:'3010cd36-539c-4b32-a0fb-976bca58ad38'。如果您使用.SetGuid() 方法而不是.SetParameter(),它将被正确添加。如果您知道UserId 将始终为Guid,不知道为什么要坚持使用对象参数。
  • 是的,我建议你必须写这个 cmets 作为答案。
  • Baz1nga 已经提供了类似的答案。你可以接受他的回答。

标签: nhibernate c#-4.0 nhibernate-criteria queryover


【解决方案1】:

注意我明确表示参数将是 String 类型,这将确保 Nhibernate 将字符串包裹在单引号 ('') 中,这是查询所期望的。如果您想使用 SetParameter 那么您的查询需要设置单引号,即您的查询应该是

string.Format("SELECT C FROM {0} AS C WHERE UserId=':UserId'", typeof(T));

因此使用这个:

var queryString = string.Format("SELECT C FROM {0} AS C WHERE UserId=:UserId", typeof(T)); // you can use SetGuid too, which will again wrap it with quotes
return session.CreateSQLQuery(queryString).SetString("UserId", UserId).List<T>();

var queryString = string.Format("SELECT C FROM {0} AS C WHERE UserId=':UserId'", typeof(T));
return session.CreateSQLQuery(queryString).SetParameter("UserId", UserId).List<T>();

另外我建议您使用typeof(T).Name 而不是使用完全限定名称。

【讨论】:

  • 使用字符串作为参数不起作用。请参阅以下错误。 Parameter UserId does not exist as a named parameter in [FROM FNHRepository.Entites.Property C WHERE UserId=':UserId'],米罗斯拉夫·波波维奇的回答是终极的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多