NHibernate IQuery
select
ステートメントへの結合で使用される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のでこれを行うのですか?Sql2008Structured
とStructured2008Extensions
のクラスを使用して、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に接続します。
どうすれば修正できますか?
あなたは何をしようとしていますか?私はあなたが何を意味するのか分からない "sqlcommand sqlのparamはありません。" –
以下の太字のエラーメッセージを見てください。 – Remy
'@'を 'sqlQuery.SetStructured(" tvpBusUnit "、tblBusUnit);に入れてみましたか? SQL文に 'inner join'を入れることを意味しましたか? –