在 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 中设置?
NHibernate - 如何使用参数值记录命名参数化查询?
在没有 .hbm 或 xml 文件的 NHibernate Fluent 映射中定义命名查询