我正在使用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
查询似乎在传递多个参数时有效,但不是更新一个
答案 0 :(得分:30)
虽然我看不出你的例子有什么问题,但我想知道你是否被旧的BindByName
问题所困扰。默认情况下,ODP.NET按照将查询添加到集合的顺序将参数绑定到查询,而不是根据您的名称根据其名称绑定查询。尝试在BindByName
对象上设置true
到OracleCommand
,看看是否能解决问题。
我遇到过这个问题很多次,我使用自己的工厂方法创建命令,自动将此属性设置为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的使用 - 我不记得为什么我最终使用它,但是要记住在使用其他一些方法时遇到问题。