NHibernate 查询参数解析器在 '/*[1]/@type' 表达式上抛出错误
NHibernate query parameter parser throws an error on '/*[1]/@type' expression
我在数据库中有一个 table,其中一列包含 xml,存储为 nvarchar。我需要编写查询并根据存储在该列中的数据获取信息。
所以我最终使用 NHibernate 编写了以下本机 sql 查询:
string sql = @"SELECT a.id as s
FROM [DBT].[dbo].[tb_myTable] a
where (cast (a.vchExtendedInfo as XML)).value('/*[1]/@type','NVARCHAR(MAX)')='deal'"
ISQLQuery sqlQuery = HibernateUtil.GetCurrentSession().CreateSQLQuery(sql)
并抛出错误:'ArgumentOutOfRangeException' - 长度不能小于 zero.Parameter 名称:长度。
经过一些测试后我发现,NHibernate 正在尝试解析我的查询,而 '/*[1]/@type'
行可能就是原因。 (这实际上是一个简化的示例,如果我删除这个,所有其他条件都可以很好地工作)。
那么,我如何 escape/fix 我的查询才能使其生效?
我想这是因为查询中的“@”。
您是否尝试过使用参数?
string sql = @"SELECT a.id as s
FROM [DBT].[dbo].[tb_myTable] a
where (cast (a.vchExtendedInfo as XML)).value(:type,'NVARCHAR(MAX)')=:value"
ISQLQuery sqlQuery = HibernateUtil.GetCurrentSession()
.CreateSQLQuery(sql)
.SetAnsiString("type", "/*[1]/@type")
.SetAnsiString("value", "deal");
我在数据库中有一个 table,其中一列包含 xml,存储为 nvarchar。我需要编写查询并根据存储在该列中的数据获取信息。
所以我最终使用 NHibernate 编写了以下本机 sql 查询:
string sql = @"SELECT a.id as s
FROM [DBT].[dbo].[tb_myTable] a
where (cast (a.vchExtendedInfo as XML)).value('/*[1]/@type','NVARCHAR(MAX)')='deal'"
ISQLQuery sqlQuery = HibernateUtil.GetCurrentSession().CreateSQLQuery(sql)
并抛出错误:'ArgumentOutOfRangeException' - 长度不能小于 zero.Parameter 名称:长度。
经过一些测试后我发现,NHibernate 正在尝试解析我的查询,而 '/*[1]/@type'
行可能就是原因。 (这实际上是一个简化的示例,如果我删除这个,所有其他条件都可以很好地工作)。
那么,我如何 escape/fix 我的查询才能使其生效?
我想这是因为查询中的“@”。
您是否尝试过使用参数?
string sql = @"SELECT a.id as s
FROM [DBT].[dbo].[tb_myTable] a
where (cast (a.vchExtendedInfo as XML)).value(:type,'NVARCHAR(MAX)')=:value"
ISQLQuery sqlQuery = HibernateUtil.GetCurrentSession()
.CreateSQLQuery(sql)
.SetAnsiString("type", "/*[1]/@type")
.SetAnsiString("value", "deal");