2017-02-14 4 views
2

NHibernate IQueryselectステートメントへの結合で使用されるIDのコレクション(テーブル値のパラメータを介して)を渡したい: ネイティブSQLでは、これを行うことができます(以下のSQLSelectData)。 SqlCommand SQLには:paramはありません注意してください:SqlDbType.a:paramなしで選択するためにNHibernateでテーブル値のパラメータを渡すように構造化されていますか?

public static bool SQLSelectData() 
{ 
    string conACME = System.Configuration.ConfigurationManager 
          .AppSettings["conACME"].ToString(); 
    DataTable tblBusUnit = new DataTable(); 
    tblBusUnit.Columns.Add("VALUE", typeof(int)); 
    DataRow dRow = tblBusUnit.NewRow(); 
    dRow["Value"] = 1; 
    tblBusUnit.Rows.Add(dRow); 
    dRow = tblBusUnit.NewRow(); 
    dRow["Value"] = 6; 
    tblBusUnit.Rows.Add(dRow); 
    using (SqlConnection con = new SqlConnection(conACME)) 
    { 
     con.Open(); 

     SqlDataReader rdr; 
     SqlCommand cmd = new SqlCommand(
     "select bus_unit_id, BusUnit " + 
     "from BusUnit b " + 
     "join @tvpBusUnit s on s.value = b.BUS_UNIT_ID;", 
     con); 
     cmd.Parameters.Add(
     new SqlParameter() 
     { 
      ParameterName = "@tvpBusUnit", 
      SqlDbType = SqlDbType.Structured, 
      TypeName = "dbo.[DLTableTypeInt]", 
      Value = tblBusUnit 
     }); 
     rdr = cmd.ExecuteReader(); 
     while (rdr.Read()) 
     { 
      string stBusUnitId = rdr["bus_unit_id"].ToString(); 
      string strBusUnit = rdr["BusUnit"].ToString(); 
      Console.WriteLine("Bus Unit:" + strBusUnit); 
     } 
    } 
    return true; 
} 

がどのように私はNHibernateのでこれを行うのですか?Sql2008StructuredStructured2008Extensionsのクラスを使用して、this questionの受け入れられた解決策を試しました。その下の

を参照してくださいコードはSetStructured()を呼び出します。

public void SQLSelectTVP<T>() 
{ 
    objNSession = NHibernateHelper.GetCurrentSession(strConn); 
    DataTable tblBusUnit = new DataTable(); 
    tblBusUnit.Columns.Add("VALUE", typeof(int)); 
    DataRow dRow = tblBusUnit.NewRow(); 
    dRow["Value"] = 1; 
    tblBusUnit.Rows.Add(dRow); 
    dRow = tblBusUnit.NewRow(); 
    dRow["Value"] = 6; 
    tblBusUnit.Rows.Add(dRow); 
    StringBuilder sbSQL = new StringBuilder(); 
    sbSQL.Length = 0; 
    sbSQL.Append("select bus_unit_id, Business_Unit " + 
       "from tblBUSINESS_UNIT b " + 
       "join @tvpBusUnit s on s.value = b.BUS_UNIT_ID"); 
    IQuery sqlQuery = objNSession.CreateSQLQuery(sbSQL.ToString()); 
    sqlQuery.SetStructured("tvpBusUnit", tblBusUnit); 
    var lstQR = sqlQuery.List<T>(); 

} 

しかし、エラーSQLには:paramがないので:

はパラメータtvpBusUnitを選択し、[中という名前のパラメータとして存在しませんbus_unit_id、tblBUSINESS_UNITからBusiness_Unit bは@ tvpBusUnitのs.value = b.BUS_UNIT_IDに接続します。

どうすれば修正できますか?

+0

あなたは何をしようとしていますか?私はあなたが何を意味するのか分からない "sqlcommand sqlのparamはありません。" –

+0

以下の太字のエラーメッセージを見てください。 – Remy

+0

'@'を 'sqlQuery.SetStructured(" tvpBusUnit "、tblBusUnit);に入れてみましたか? SQL文に 'inner join'を入れることを意味しましたか? –

答えて

0

投稿したリンクから、構造化変数にアクセスする方法が間違っていると思います。あなたのコードは、:tvpBusUnitある:id一部を、使用しない

s.CreateSQLQuery("EXEC some_sp @id = :id, @par1 = :par1") 
.SetStructured("id", dt) 

また、TableTypeTypeName)は、DBに事前に作成する必要があります。これが必要かどうか確認してください。あなたのコードから:

TypeName = "dbo.[DLTableTypeInt]", 

通過テーブル値パラメータのいくつかの議論がここで提供されるが、NHibernateのは、このような種類作成しなくても、更新があります Passing table valued parameters to NHibernateを。しかし、これにはプルリクエストが必要な場合があります。あなたが参照した別の投稿で提供されている回答では、TableTypeごとに1つずつタイプを作成することができます。

+0

nhibernateにSQLクエリ(ストアドプロシージャではありません)に渡されます。ストレートSQLを使用する最初の例は '@ tvpBusUnit'のデータを渡します。この状態に渡すためにsetStructuredコードをmofidyする方法はありますか? – Remy

+0

@Remy、はい私はSQLクエリのためにそれを意味しました。 **:X **形式を使用しないストアドプロシージャ用です。生のSQLクエリの場合は、**:X **形式が必要です。遅れて返信して申し訳ありません...これが役立つことを願っています。 sqlの内部にテーブル値パラメータを作成して、それを:X形式で割り当てることをお勧めします。私はこのように、 '.SetParameter(" Ids "、sb.ToString()、NHibernateUtilのようなXMLパラメータを渡しました。'Set @IdsXml =:Ids;' –

+0

@Remy、ストアドプロシージャの場合、入力パラメータはストアドプロシージャの定義からはっきりしていますが、未処理のSQLクエリの場合はあります入力値を提供する標準的な方法はありません。 NHibernateは:X形式を使ってこれを許可しているようです。これは私の理解であり、どこかでこれを読まなかった。 –

関連する問題