PL/SQL NVL 和 OracleParameter 在 C# 中不起作用
Posted
技术标签:
【中文标题】PL/SQL NVL 和 OracleParameter 在 C# 中不起作用【英文标题】:PL/SQL NVL and OracleParameter doesn't work in C# 【发布时间】:2018-03-23 11:40:35 【问题描述】:我正在尝试一些基本的东西,发现 OracleParameter 似乎没有像在 C# 中那样绑定
在我的示例CaseLocalId
中使用OracleParameter
时,参数似乎没有绑定。查询运行但不会返回任何行。但是当使用辅助选项and c.case_local_id like nvl('CaseLocalId','%')
时,事情会按预期工作。
有什么想法吗?
string CaseLocalId = null;
using (OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings["asd"].ConnectionString))
conn.Open();
OracleCommand cmd = new OracleCommand
Connection = conn,
Parameters =
// CaseLocalId
new OracleParameter
ParameterName = "CaseLocalId",
OracleDbType = OracleDbType.Varchar2,
IsNullable = true,
Value = CaseLocalId,
,
CommandText = $@"
select c.case_local_id, c.title, c.description
from asd.CC_CASE_TASK t, asd.CC_CASE c
where c.case_local_id = t.case_local_id(+)
and c.case_local_id like nvl(':CaseLocalId','%') -- doesn't work
-- and c.case_local_id like nvl('CaseLocalId','%') -- this works
",
CommandType = CommandType.Text,
;
【问题讨论】:
我没有看到任何 PL/SQL。也许应该是 Oracle SQL(参见plsql
标签信息)。
【参考方案1】:
':CaseLocalId'
是 literal ':CaseLocalId'
- 即由冒号、C、a 等组成的字符串...不是参数的值;你可能的意思是:
nvl(:CaseLocalId,'%')
'CaseLocalId'
在接近ADO.NET层之前在C#中进行字符串注入,并且不使用参数;这是一个 SQL 注入漏洞 - 避免。
作为一般规则:C# 中与 SQL 相关的文字应该从不有 $
前缀,但 @
前缀是正常、健康和良好的。
请注意,您可能还需要添加:
cmd.BindByName = true;
【讨论】:
谢谢,需要删除'
并添加BindByName
以上是关于PL/SQL NVL 和 OracleParameter 在 C# 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章