【问题标题】:Use named parameters for table name in NHibernate在 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]

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

我哪里错了?

【问题讨论】:

    标签: c# sql nhibernate


    【解决方案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 是您真正追求的。 与往常一样,检查参数值并确保没有恶意参数插入到您的查询中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-11
        • 2022-01-16
        • 2014-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多