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

C# 在NHibernate中为表名使用命名参数,c#,sql,nhibernate,C#,Sql,Nhibernate,我需要对一个名为myTable的表进行简单的截断。所以我写了这篇文章,它很有效: statelessSession .CreateSQLQuery("TRUNCATE TABLE myTable") .ExecuteUpdate(); 因为我会将表名存储在App.config中,所以我会参数化查询。我会避免使用String.Format,所以我尝试了如下方法 statelessSession .CreateSQLQuery("TRUNCATE TABLE :tabNam

我需要对一个名为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]
我还尝试在参数名周围使用大括号,但效果不太好


我哪里错了?

这里解释了作为参数的表格

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

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

statelessSession
    .CreateSQLQuery("TRUNCATE TABLE " + SysCfg.ConfigurationManager.AppSettings["tabName"])
    .ExecuteUpdate();

这里解释了作为参数的表

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

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

statelessSession
    .CreateSQLQuery("TRUNCATE TABLE " + SysCfg.ConfigurationManager.AppSettings["tabName"])
    .ExecuteUpdate();

NHibernate不允许您做任何超出基础数据库的事情。 在AFAICT中,没有数据库支持表名的参数

例如,你不能写这样的脚本:

CREATE TABLE @tableName (etc etc)...
如果您在哪里绑定到SQL,您将求助于动态SQL

鉴于您使用的是NHibernate,String.Format才是您真正想要的。
像往常一样,检查参数值并确保没有恶意参数插入到查询中。

NHibernate不允许您执行任何超出基础数据库的操作。 在AFAICT中,没有数据库支持表名的参数

例如,你不能写这样的脚本:

CREATE TABLE @tableName (etc etc)...
如果您在哪里绑定到SQL,您将求助于动态SQL

鉴于您使用的是NHibernate,String.Format才是您真正想要的。 和往常一样,检查参数值并确保没有恶意参数插入到查询中