【问题标题】:Usage of Oracle binding variables with LIKE in C#在 C# 中使用带有 LIKE 的 Oracle 绑定变量
【发布时间】:2011-04-16 23:12:50
【问题描述】:

为了停止使用动态 SQL 生成并鼓励使用绑定变量,我遇到了一些问题。

我正在使用 Oracle Data Providers for .NET 从 ASP.NET 页面查询 Oracle 9i 数据库

查询是

sql = "SELECT somedata FROM sometable WHERE machine = :machineName ";

我定义Oracle参数如下

OracleParameter parameter = new OracleParameter();
parameter.ParameterName = "machineName";
parameter.OracleDbType = OracleDbType.Varchar2;
parameter.Value = machine; //machine is a variable of type string
parameterList.Add(parameter);

这适用于“=”运算符。但我似乎无法让它与“LIKE”一起使用。我不知道如何格式化查询以使其接受“%”通配符的使用。

我试过了:

sql = "SELECT somedata FROM sometable WHERE machine LIKE :machineName% ";
sql = "SELECT somedata FROM sometable WHERE machine LIKE ':machineName%' ";
sql = "SELECT somedata FROM sometable WHERE machine LIKE :machineName||% ";

还有:

parameter.Value = machine+'%';

但我得到的只是 ORA-00911(非法字符)和 ORA-01036(非法名称/值)异常。

我做错了什么?

【问题讨论】:

标签: c# asp.net oracle odp.net ora-01036


【解决方案1】:

试试:

sql = "SELECT somedata FROM sometable WHERE machine LIKE :machineName || '%' ";

由于有 BIND 变量,因此不需要在其周围加上单引号。但是 % 不是,所以我希望它需要被封装。

【讨论】:

  • 您说得对。这确实是最后一个选择,我错过的那个。谢谢!
  • 非常感谢您的回答!我正在使用 oracle 数据库驱动程序开发一个节点项目,并且遇到了同样的问题。只是出于好奇,为什么我需要在通配符运算符(%)之前的两个管道(||)?
  • @DaveCooper ||连接'%',它是一个连接命令。
  • @EdgarRochaCarvalho 谢谢!不知道这一点 - 它也解释了为什么我尝试使用 + 运算符时总是失败!
  • 这帮助我解决了我们项目中的相同问题。谢谢!
【解决方案2】:

这是一个完整的查询示例:

string commandText = "SELECT LastName, FirstName FROM PEOPLE WHERE UPPER(LastName) LIKE '%' || :lastName || '%' AND UPPER(FirstName) LIKE '%' || :firstName || '%'";

string oradb = "yourDatabaseConnectionStringHere"; // Might want to add Using statement for this code and try catch

OracleConnection conn = new OracleConnection(oradb); // C#
conn.Open();
OracleCommand cmd = new OracleCommand
{
     Connection = conn,
     CommandText = commandText,
     CommandType = CommandType.Text
};

/*IMPORTANT: adding parameters must be in order how they are in order in the SQL statement*/
cmd.Parameters.Add(new OracleParameter("lastName", model.LastName.Trim().ToUpper()));
cmd.Parameters.Add(new OracleParameter("firstName", model.FirstName.Trim().ToUpper()));

OracleDataReader dr = cmd.ExecuteReader();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-22
    • 2020-03-17
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 2017-06-30
    相关资源
    最近更新 更多