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

Posted

技术标签:

【中文标题】在 NHibernate 中使用命名参数作为表名【英文标题】:Use named parameters for table name in NHibernate 【发布时间】:2016-08-22 23:28:34 【问题描述】:

我需要对名为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]

我也尝试在参数名称周围使用花括号,但这也不起作用。

我哪里错了?

【问题讨论】:

【参考方案1】:

这里解释表作为参数

Table name as variable

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

所以,你应该把它构建成一个纯字符串

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

【讨论】:

【参考方案2】:

NHibernate 不允许您做任何比您的底层数据库更多的事情。 AFAICT,没有数据库支持表 names 的参数。

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

CREATE TABLE @tableName (etc etc)...

如果你绑定到 SQL,你会求助于动态 SQL。

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

【讨论】:

以上是关于在 NHibernate 中使用命名参数作为表名的主要内容,如果未能解决你的问题,请参考以下文章

列错误中的冒号 ':' - 并非所有命名参数都已在 Nhibernate 中设置?

XML名命空间

NHibernate - 如何使用参数值记录命名参数化查询?

在没有 .hbm 或 xml 文件的 NHibernate Fluent 映射中定义命名查询

如何在 Fluent NHibernate ClassMap 类中指定表名?

nhibernate中的命名查询错误