gpt4 book ai didi

oracle - NHibernate CreateSQLQuery() 带有命名参数问题

转载 作者:行者123 更新时间:2023-12-02 21:44:32 28 4
gpt4 key购买 nike

在我的例子中,为什么命名或位置查询参数不能与 NHibernate 一起使用?

认为以下陈述是正确的:

On Oracle database X and Y version 11.2.0.3.0 the role "MyRole" exists identified by "MyPassword" and is granted to the user I am connected as.

这是一些代码:

public void SetRole(string roleName, string rolePassword)
{
if (HasRoleBeenSet) return;
try
{
session.CreateSQLQuery("SET ROLE ? IDENTIFIED BY ?")
.SetString(0, roleName)
.SetString(1, rolePassword)
.ExecuteUpdate();
HasRoleBeenSet = true;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}

SetRole("MyRole", "MyPassword");

抛出以下异常:

NHibernate.Exceptions.GenericADOException: could not execute native bulk manipulation query: SET ROLE ? IDENTIFIED BY ? [SQL: SET ROLE :p0 IDENTIFIED BY :p1] ---> System.Data.OracleClient.OracleException: ORA-01937: missing or invalid role name

当我使用 Toad 套件中包含的 SQLMonitor 时,发送到数据库的 SQL 看起来像这样 SET ROLE ? IDENTIFIED BY ? 并显示错误发生错误:[1937](ORA-01937:缺少或无效的角色名称)

当我查看 FNH 自己生成的带有参数的查询时,它们看起来像这样:

SchemaName.errorHandler.logError(:v0);

:1=['The error message']

但当我使用 CreateSQLQuery() 手动创建查询时,情况并非如此

好的,下一个代码示例是这样的:

...
session.CreateSQLQuery("SET ROLE :roleName IDENTIFIED BY :rolePassword")
.SetString("roleName", roleName)
.SetString("rolePassword", rolePassword)
.ExecuteUpdate();
...

输出以下错误(相同的错误):

NHibernate.Exceptions.GenericADOException: could not execute native bulk manipulation query: SET ROLE :roleName IDENTIFIED BY :rolePassword [SQL: SET ROLE :p0 IDENTIFIED BY :p1] ---> System.Data.OracleClient.OracleException: ORA-01937: missing or invalid role name

第三个代码示例:

...
session.CreateSQLQuery(string.Format("SET ROLE {0} IDENTIFIED BY {1}",
roleName,
rolePassword))
.ExecuteUpdate();
...

在 Oracle 数据库 X 上,这很有效,在 Oracle 数据库 Y 上,这效果不太好,并给出了这个错误:

NHibernate.Exceptions.GenericADOException: could not execute native bulk manipulation query: SET ROLE MyRole IDENTIFIED BY MyPassword [SQL: SET ROLE MyRole IDENTIFIED BY MyPassword] ---> System.Data.OracleClient.OracleException: ORA-00933: SQL command not properly ended

我尝试在语句末尾添加分号;,但这会产生无效字符错误。

如果我像这样在密码周围添加双引号,它突然也适用于 Oracle 数据库 Y

 ...
session.CreateSQLQuery(string.Format("SET ROLE {0} IDENTIFIED BY \"{1}\"",
roleName,
rolePassword))
.ExecuteUpdate();
...

问题是这不是一个很好的解决方案,因为 FNH 现在会在记录的异常中泄露密码。我不知道这里出了什么问题,这里没有明确的问题,因为我不知道该问其他人什么,然后尖叫寻求帮助,并希望有人能对此有所了解。

经过评论中的一些讨论,我尝试了以下操作:

 ...
session.CreateSQLQuery(string.Format("SET ROLE {0} IDENTIFIED BY :rolePassword",
roleName))
.SetString("rolePassword", rolePassword)
.ExecuteUpdate();
...

我尝试了 :named 和 ? (位置)参数,带有单引号、双引号,似乎没有任何效果。

此代码抛出著名的ORA-00933:SQL命令未正确结束错误

最佳答案

尝试使用.SetParameter() 而不是SetString()。我目前正在使用类似的东西并且它有效:

var cases = Session.CreateSQLQuery(sql)
.SetParameter("someID",thisIsMyValue)
.SetResultTransformer(NHibernate.Transform.Transformers.AliasToBean<SomeDTO>())
.List<SomeDTO>();

SQL 如下所示:

var sql = "SELECT fieldA, fieldB FROM myTable WHERE myTable.ID = :someID"

关于oracle - NHibernate CreateSQLQuery() 带有命名参数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19766968/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com