Как создать файл сопоставления для хранимой процедуры вставки с помощью NHibernate 2.1 - PullRequest
1 голос
/ 21 августа 2009

Я ищу способ отобразить простую хранимую процедуру вставки, используя NHibernate 2.1

Большинство примеров, которые я нахожу, относятся к получению данных от sproc, но я пытаюсь вставить запись типа аудита с использованием хранимой процедуры. Но я бы предпочел создать файл сопоставления для этого

Также - чтобы было ясно, я не собираюсь создавать файл сущности + сопоставления, как показано ниже. Вместо этого я хотел посмотреть, могу ли я просто отобразить параметры в одном 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>

1 Ответ

2 голосов
/ 22 августа 2009

Как следует из названия, CreateSQLQuery предназначен для запросов, а не для вставки / обновления / удаления. Вызов типа sproc, который вы описываете, возможен, но не AFAIK через какой-либо механизм запросов, поддерживаемый NHibernate.

Сам sproc может быть включен в файл отображения через тег <database-object>. Следующий пример для 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>

Ваш код может затем вызвать sproc. Для этого нужно заставить NHibernate создать для вас IDbCommand, заполнить его параметрами и вызвать его метод ExecuteNonQuery обычным способом ADO.NET:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...