Oracle中的参数化查询出了问题

时间:2011-05-12 15:39:43

标签: asp.net oracle

我正在使用Oracle.DataAccess而不是过时的System.Data.OracleClient,我似乎无法将多个参数传递给我的更新查询

这有效

OracleCommand.CommandText = "UPDATE db SET column1 = :param1 WHERE column2 = 'Y'"
OracleCommand.Parameters.Add(New OracleParameter("param1", "1234"))

但我希望能够传递多个参数

这是我的完整代码

    OracleConn.Open()
    OracleCommand = OracleConn.CreateCommand()
    OracleCommand.CommandText = "UPDATE db SET column1 = :param1 WHERE column2 = :param2"
    OracleCommand.CommandType = CommandType.Text
    OracleCommand.Parameters.Add(New OracleParameter("param1", "1234"))
    OracleCommand.Parameters.Add(New OracleParameter("param2", "Y"))
    OracleCommand.ExecuteNonQuery()

我的SELECT查询似乎在传递多个参数时有效,但不是更新一个

6 个答案:

答案 0 :(得分:30)

虽然我看不出你的例子有什么问题,但我想知道你是否被旧的BindByName问题所困扰。默认情况下,ODP.NET按照将查询添加到集合的顺序将参数绑定到查询,而不是根据您的名称根据其名称绑定查询。尝试在BindByName对象上设置trueOracleCommand,看看是否能解决问题。

我遇到过这个问题很多次,我使用自己的工厂方法创建命令,自动将此属性设置为true

经典无用的Oracle文档here

答案 1 :(得分:4)

要模拟System.Data.OracleClient的默认行为,您应该将OracleCommand设置为按名称绑定。

OracleCommand.BindByName = True

答案 2 :(得分:2)

尝试使用指定的类型新建OracleParameter。在将对象添加到参数列表之前设置对象的值。

var param1 = new OracleParameter( "param1", OracleType.Int32 );
param1.Value = "1234";

OracleCommand.Parameters.Add( param1 );

答案 3 :(得分:1)

试试这个,希望它有效。它确实编译。
不确定你是否还要发送提交...
我总是通过存储过程执行此类操作,因此我在存储过程中的update语句之后进行了提交。

哈维萨瑟

        OracleConnection ora_conn = new OracleConnection("connection string");

        OracleCommand ora_cmd = new OracleCommand("UPDATE db SET column1 = :param1 WHERE column2 = :param2", ora_conn);
        ora_cmd.CommandType = CommandType.Text;
        ora_cmd.BindByName = true;

        ora_cmd.Parameters.Add(":param1", OracleDbType.Varchar2, "1234", ParameterDirection.Input);
        ora_cmd.Parameters.Add(":param2", OracleDbType.Varchar2, "Y", ParameterDirection.Input);

        ora_cmd.ExecuteNonQuery();                

答案 4 :(得分:0)

第一个代码块是正确的:在参数名称前面使用冒号,但在OracleParameter的第一个参数中没有。

如果没有抛出错误,可能是UPDATE成功运行,它不会根据WHERE子句及其替换参数值更新任何记录。尝试在UPDATE中没有WHERE子句的测试表上执行此操作,以确保它能够执行某些操作。

答案 5 :(得分:0)

这是我经常使用的结构类型(抱歉,这是来自内存):

int rows = 0;
using ( OracleConnection conn = new OracleConnection(connectionString) ) {
  using ( OracleCommand cmd = conn.CreateCommand() ) {
    cmd.CommandText = "UPDATE table SET column1 = ':p1 WHERE column2 = :p2";
    cmd.CommandType = CommandType.Text;
    cmd.Parameters.AddWithValue(":p1", p1Val);
    cmd.Parameters.AddWithValue(":p2", p2Val);
    rows = cmd.ExecuteNonQuery();
  }
}

关键的区别在于AddWithValue的使用 - 我不记得为什么我最终使用它,但是要记住在使用其他一些方法时遇到问题。