web-dev-qa-db-ja.com

結果のないNHibernateからストアドプロシージャを呼び出すにはどうすればよいですか?

一部のデータをログに記録するストアドプロシージャがあります。これをNHibernateで呼び出すにはどうすればよいですか?

これまでのところ:

ISession session = ....
IQuery query = session.CreateQuery("exec LogData @Time=:time @Data=:data");
query.SetDateTime("time", time);
query.SetString("data", data);
query.?????;

メソッド??????または、もっと根本的に悪いことをしていますか?

31
thatismatt

NHibernate Documentation から、これはNHibernateの制限のようです:

プロシージャは結果セットを返す必要があります。 NHibernateはIDbCommand.ExecuteReader()を使用して結果を取得します。

14
thatismatt

SQLクエリのExecuteUpdateが役立ちます。

サンプル:

ISession session = ....
IQuery query = session.CreateSQLQuery("exec LogData @Time=:time, @Data=:data");
query.SetDateTime("time", time);
query.SetString("data", data);
query.ExecuteUpdate();
54
Sathish Naga

NHibernateを使用すると、オブジェクト指向プログラミングを実行でき、バックグラウンドでオブジェクトをデータベースからフェッチしたり、データベースに保存したりできます。

NHibernateは、ストアドプロシージャを簡単に実行するための簡単なAPIを提供していません。これは、オブジェクトをフェッチする場合でも保存する場合でも、オブジェクト指向プログラミングとはほとんど関係がないためです。

したがって、NHibernateを直接使用して非常に手続き型のコードを実行しようとすると、何か基本的に間違っていることになります。 NHibernateを使用する場合は、このストアドプロシージャをバックグラウンドで実行すると、データベースからオブジェクトをフェッチしたり、データベースにオブジェクトを保存したりするのに魔法のように役立つことを伝える必要があります。

あなたはできる:

  • 直接ADO.NETを使用して、新しいIDbConnectionを開くか、ISessionの接続を取得し、IDbCommandを作成します。などを実行します。手順。
  • NHibernateリスナーを作成し、Configurationで構成して、他の特定のイベントがNHibernateパイプライン経由で送信されたときにこのストアドプロシージャを実行します。これを行うのは、このストアドプロシージャを実際に毎回実行する必要があり、これらのイベントが発生した場合のみにしてください。
12
yfeldblum

UniqueResultを使用して、何も返さないストアドプロシージャを実行できます。 ASP.NET MVCサイトに現在ログインしているユーザーを追跡するために、レコードを挿入または更新するストアドプロシージャを呼び出すために次を使用しています。

IQuery query = session.GetNamedQuery("UserSession_Save");
query.SetInt32("UserID", userID);
query.SetString("CookieID", cookieID);
query.SetString("Controller", controller);
query.SetString("Action", action);

query.UniqueResult();
9
Pete Nelson

次の解決策を実行してください。

public void Test(TestEntity TestEntity)
        {           
  IQuery query = NHSession.CreateSQLQuery("exec LogData :Time, :Data");
            query.SetParameter("Time", TestEntity.Time);
            query.SetParameter("Data", TestEntity.Data);
            object obj = query.UniqueResult();
        }
0
Ankush Band

一般に、他のいくつかの雑用を行い、最後に結果セットを返すプロシージャを呼び出すことは、SELECTクエリを作成することと同じです。したがって、上記の回答では、最後のステップでクエリを実行するときに、呼び出す必要があります

query.List<T>();

ここで、Tは、コードで定義されているPOCOオブジェクトです。

0
katrash