一部のデータをログに記録するストアドプロシージャがあります。これをNHibernateで呼び出すにはどうすればよいですか?
これまでのところ:
ISession session = ....
IQuery query = session.CreateQuery("exec LogData @Time=:time @Data=:data");
query.SetDateTime("time", time);
query.SetString("data", data);
query.?????;
メソッド?????
?または、もっと根本的に悪いことをしていますか?
NHibernate Documentation から、これはNHibernateの制限のようです:
プロシージャは結果セットを返す必要があります。 NHibernateはIDbCommand.ExecuteReader()を使用して結果を取得します。
SQLクエリのExecuteUpdateが役立ちます。
サンプル:
ISession session = ....
IQuery query = session.CreateSQLQuery("exec LogData @Time=:time, @Data=:data");
query.SetDateTime("time", time);
query.SetString("data", data);
query.ExecuteUpdate();
NHibernateを使用すると、オブジェクト指向プログラミングを実行でき、バックグラウンドでオブジェクトをデータベースからフェッチしたり、データベースに保存したりできます。
NHibernateは、ストアドプロシージャを簡単に実行するための簡単なAPIを提供していません。これは、オブジェクトをフェッチする場合でも保存する場合でも、オブジェクト指向プログラミングとはほとんど関係がないためです。
したがって、NHibernateを直接使用して非常に手続き型のコードを実行しようとすると、何か基本的に間違っていることになります。 NHibernateを使用する場合は、このストアドプロシージャをバックグラウンドで実行すると、データベースからオブジェクトをフェッチしたり、データベースにオブジェクトを保存したりするのに魔法のように役立つことを伝える必要があります。
あなたはできる:
IDbConnection
を開くか、ISession
の接続を取得し、IDbCommand
を作成します。などを実行します。手順。Configuration
で構成して、他の特定のイベントがNHibernateパイプライン経由で送信されたときにこのストアドプロシージャを実行します。これを行うのは、このストアドプロシージャを実際に毎回実行する必要があり、これらのイベントが発生した場合のみにしてください。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();
次の解決策を実行してください。
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();
}
一般に、他のいくつかの雑用を行い、最後に結果セットを返すプロシージャを呼び出すことは、SELECT
クエリを作成することと同じです。したがって、上記の回答では、最後のステップでクエリを実行するときに、呼び出す必要があります
query.List<T>();
ここで、T
は、コードで定義されているPOCOオブジェクトです。