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# 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL编程(函数包变量)

创建一个PL/SQL块,计算一年的补偿金额。

Oracle

Oracle decode函数

Oracle Function 之 Decode

SQL 和 PL/SQL 的区别