【问题标题】:How to build a mapping file for an insert stored procedure using NHibernate 2.1如何使用 NHibernate 2.1 为插入存储过程构建映射文件
【发布时间】:2009-08-24 04:43:16
【问题描述】:

我正在寻找一种使用 NHibernate 2.1 映射简单插入存储过程的方法

我发现的大多数示例都是从存储过程中获取数据的——但我想做的是使用存储过程插入类似审计的记录。但我更愿意为此构建一个映射文件

另外 - 需要明确的是,我不希望构建如下所示的实体 + 映射文件。相反,我想看看我是否可以简单地将参数映射到单个 xml 文件中,并使用会话对象通过“CreateSQLQuery”调用它

<class name="Staff, SampleApplication.Library" table="Staff">  
    <id name="Id" column="Id" type="Int32">  
      <generator class="native" />  
    </id>  
    <property name="LastName" column="LastName" type="String" length="255"/>  
    <property name="FirstName" column="FirstName" type="String" length="255"/>  
    <property name="EmailAddress" column="EmailAddress" type="String" length="512"/>  

    <sql-insert>EXEC InsertStaff ?,?,?</sql> 
</class>

【问题讨论】:

    标签: nhibernate stored-procedures


    【解决方案1】:

    顾名思义,CreateSQLQuery 是用于查询,而不是用于插入/更新/删除。可以通过任何 NHibernate 支持的查询机制调用您描述的存储过程,但不能通过任何 NHibernate 支持的查询机制调用 AFAIK。

    存储过程本身可以通过&lt;database-object&gt; 标签包含在映射文件中。以下示例适用于 Sql Server:

    <database-object>
      <create>
        <![CDATA[
          go
          create procedure dbo.SetFooBar
            @Foo nvarchar(32)
            @Bar nvarchar(32)
          as
          begin
            ...
          end
          go
        ]]>
      </create>
      <drop>
        <![CDATA[
          if object_id (N'dbo.SetFooBar', N'P') is not null
            drop procedure dbo.SetFooBar;
          go
        ]]>
      </drop>
    </database-object>
    

    然后您的代码可以调用存储过程。这是通过让 NHibernate 为您创建一个 IDbCommand、用参数填充它并以通常的 ADO.NET 方式调用其 ExecuteNonQuery 方法来完成的:

    private void SetFooBar(ISession session, string foo, string bar)
    {
      var connection = session.Connection;
      var implementor = session.GetSessionImplementation();
      var driver = implementor.Factory.ConnectionProvider.Driver;
      var command = driver.GenerateCommand(CommandType.StoredProcedure, 
                      new global::NHibernate.SqlCommand.SqlString("SetFooBar"), 
                      new global::NHibernate.SqlTypes.SqlType[] {
                        global::NHibernate.SqlTypes.SqlTypeFactory.GetString(32),
                        global::NHibernate.SqlTypes.SqlTypeFactory.GetString(32),
                      });
    
      command.Connection = connection;
    
      SetParameter(command, 0, "@Foo", foo);
      SetParameter(command, 1, "@Bar", foo);
    
      command.ExecuteNonQuery();
    }
    
    private void SetParameter(IDbCommand cmd, int index, string name, object value)
    {
      IDataParameter param = (IDataParameter) cmd.Parameters[index];
    
      param.ParameterName = name;
      param.Value = value;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-07
      相关资源
      最近更新 更多