PL/SQL NVL 和 OracleParameter 在 C# 中不起作用



我正在尝试一些基本的东西,发现 OracleParameter 似乎没有像 C# 中那样绑定

在我的示例中使用 OracleParameterCaseLocalId参数似乎没有绑定。查询将运行,但不会返回任何行。但是当使用辅助选项时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,                        
    };
}

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

 nvl(:CaseLocalId,'%')

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

作为一般规则:C# 中与 SQL 相关的文本不应具有 $ 前缀,但@前缀是正常的、正常的和正常的。

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

cmd.BindByName = true;

最新更新