我正在尝试一些基本的东西,发现 OracleParameter 似乎没有像 C# 中那样绑定
在我的示例中使用 OracleParameter
时CaseLocalId
参数似乎没有绑定。查询将运行,但不会返回任何行。但是当使用辅助选项时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;