我需要对名为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]
我也试过围绕参数名称的花括号,但这也不起作用。
我错在哪里?
答案 0 :(得分:2)
此处解释了表格作为参数
如果查询是静态的,则表名和列名必须是静态的。对于动态表或列名,您应该动态生成完整的SQL,
因此,您应该将其构建为纯字符串
skipLocationChange: true
答案 1 :(得分:2)
NHibernate不允许您做任何比基础数据库更多的事情。 AFAICT,no db支持表名称的参数。
E.g。你不能写这样的剧本:
CREATE TABLE @tableName (etc etc)...
如果你绑定到SQL,你将使用动态SQL。
鉴于您正在使用NHibernate,String.Format
就是您真正追求的目标。
与往常一样,检查参数值并确保没有恶意参数插入到您的查询中。