【问题标题】:PL/SQL NVL and OracleParameter doesn't work in C#PL/SQL NVL 和 OracleParameter 在 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 标签信息)。

标签: c# plsql


【解决方案1】:

':CaseLocalId'literal ':CaseLocalId' - 即由冒号、C、a 等组成的字符串...不是参数的值;你可能的意思是:

 nvl(:CaseLocalId,'%')

'{CaseLocalId}'在接近ADO.NET层之前在C#中进行字符串注入,并且不使用参数;这是一个 SQL 注入漏洞 - 避免。

作为一般规则:C# 中与 SQL 相关的文字应该从不$ 前缀,但 @ 前缀是正常、健康和良好的。

请注意,您可能还需要添加:

cmd.BindByName = true;

【讨论】:

  • 谢谢,需要删除'并添加BindByName
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多