我想将一组ID(通过表值参数)传递给NHibernate IQuery
select
语句,以便在连接中使用:
在本机SQL中,我可以这样做(下面是SQLSelectData)。请注意:param
sql:
SqlCommand
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不存在作为[select bus_unit_id中的命名参数,来自tblBUSINESS_UNIT的Business_Unit b在s.value = b.BUS_UNIT_ID上加入@tvpBusUnit]
我该如何解决这个问题?
答案 0 :(得分:0)
根据您发布的链接,我认为您访问结构化变量的方式不正确。
s.CreateSQLQuery("EXEC some_sp @id = :id, @par1 = :par1")
.SetStructured("id", dt)
您的代码不使用:id
部分,即:tvpBusUnit
。
另请注意,可能必须事先在数据库上创建TableType
(在TypeName
中)。请检查是否需要。从你的代码:
TypeName = "dbo.[DLTableTypeInt]",
这里提供了关于传递表值参数的一些讨论,但是NHibernate有一个更新,而不必像这样创建类型:
Passing table valued parameters to NHibernate。但这可能需要一个拉动请求。您引用的其他帖子中提供的答案允许您创建此类型,每个TableType
一个。