SqlDbType.Structured传递NHibernate中的表值参数,选择没有:param?

时间:2017-02-14 14:05:46

标签: sql sql-server-2008 nhibernate table-valued-parameters

我想将一组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中执行此操作?我使用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不存在作为[select bus_unit_id中的命名参数,来自tblBUSINESS_UNIT的Business_Unit b在s.value = b.BUS_UNIT_ID上加入@tvpBusUnit]

我该如何解决这个问题?

1 个答案:

答案 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一个。