简体   繁体   English

NHibernate拦截器中未设置参数

[英]Parameters are not set inside NHibernate interceptor

I am trying to use interceptor to add WITH (NO LOCK) for some queries (not for all queries, so ReadUncommitted is not a choice). 我正在尝试使用拦截器为某些查询添加WITH(NO LOCK)(并非针对所有查询,因此ReadUncommitted并不是一种选择)。 Code looks like this: 代码如下:

var rawSql = sql.ToString();
if (!rawSql.Contains(IQueryOverExtensions.QueryHintNoLockString))
    return sql;

var noWhere = rawSql.Substring(0, rawSql.IndexOf(WhereKeyword, StringComparison.InvariantCulture));
var from = noWhere.Substring(noWhere.IndexOf(FromKeyword, StringComparison.InvariantCulture));
var fromWithNoLock = from.Replace("_ ", $"_ {WithNoLock} ");

var sqlWithNoLock = rawSql.Replace(from, fromWithNoLock);

return base.OnPrepareStatement(new SqlString(sqlWithNoLock));

Here, I take part form FROM clause to WHERE clause and to each alias add WITH (NO LOCK) 在这里,我将FROM子句的形式添加到WHERE子句中,并将每个别名添加WITH(NO LOCK)

The issue is, that the final SQL's parameters are all "?" 问题是,最终的SQL参数都是“?” and exception is thrown that SQL is not valid. 并抛出SQL无效的异常。 Why parameters are not filled in and how to fix it? 为什么不填写参数以及如何解决? Thanks in advance 提前致谢

Finally I got it. 终于我明白了。 I had to get number of parameters by calling sql.GetParameterCount() and then replace all question marks with @p0, @p1, @p2, etc. 我必须通过调用sql.GetParameterCount()来获取参数数量,然后用@ p0,@ p1,@ p2等替换所有问号。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM