在NHibernate中为表名使用命名参数

时间:2016-04-28 09:31:12

标签: c# sql nhibernate

我需要对名为myTable的表执行简单的截断。所以我写了这个并且它有效:

statelessSession
    .CreateSQLQuery("TRUNCATE TABLE myTable")
    .ExecuteUpdate();

由于我将表名存储在App.config中,我会"参数化"查询。我会避免String.Format,所以我尝试了类似

的东西
statelessSession
    .CreateSQLQuery("TRUNCATE TABLE :tabName")
    .SetParameter("tabName", SysCfg.ConfigurationManager.AppSettings["tabName"])
    .ExecuteUpdate();

但是当我运行这段代码时,我得到了:

Additional information: could not execute native bulk manipulation query:
   TRUNCATE TABLE :seedTableName[SQL: TRUNCATE TABLE @p0]

我也试过围绕参数名称的花括号,但这也不起作用。

我错在哪里?

2 个答案:

答案 0 :(得分:2)

此处解释了表格作为参数

Table name as variable

  

如果查询是静态的,则表名和列名必须是静态的。对于动态表或列名,您应该动态生成完整的SQL,

因此,您应该将其构建为纯字符串

skipLocationChange: true

答案 1 :(得分:2)

NHibernate不允许您做任何比基础数据库更多的事情。 AFAICT,no db支持表名称的参数

E.g。你不能写这样的剧本:

CREATE TABLE @tableName (etc etc)...

如果你绑定到SQL,你将使用动态SQL。

鉴于您正在使用NHibernate,String.Format就是您真正追求的目标。 与往常一样,检查参数值并确保没有恶意参数插入到您的查询中。