SqlDbType.Structured для передачи табличных параметров в NHibernate для выбора без:param?

Я хочу передать коллекцию идентификаторов (с помощью табличного параметра) в NHibernate IQueryselect оператор, который будет использоваться в объединении: в нативном SQL я могу сделать это (SQLSelectData ниже). Обратите внимание, что нет :param в SqlCommand SQL:

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 классы.

Смотрите код ниже, который вызывает 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>();  

}

Тем не менее, это ошибки, потому что нет :param в SQL:

Параметр tvpBusUnit не существует в качестве именованного параметра в [select bus_unit_id, Business_Unit из tblBUSINESS_UNIT b присоединиться к @tvpBusUnit s на s.value = b.BUS_UNIT_ID]

Как я могу это исправить?

1 ответ

По ссылке, которую вы разместили, я думаю, что вы обращаетесь к структурированной переменной неверно.

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

Ваш код не использует :id часть, то есть :tvpBusUnit,

Также обратите внимание, что TableTypeTypeName) может быть необходимо создать в БД заранее. Пожалуйста, проверьте, если это требуется. Из вашего кода:

TypeName = "dbo.[DLTableTypeInt]",

Здесь представлено некоторое обсуждение передачи параметров табличных значений, но в NHibernate есть обновление без необходимости создавать типы, подобные этому: Передача табличных параметров в NHibernate. Но для этого может потребоваться пул-запрос. Ответ, приведенный в другом посте, на который вы ссылались, позволяет создавать такие типы, по одному для каждого TableType,

Другие вопросы по тегам