asp.net - studio - Consulta parametrizada en problemas de Oracle
oracle dot net (6)
Estoy usando Oracle.DataAccess
lugar del obsoleto System.Data.OracleClient
y parece que tengo problemas para pasar varios parámetros a mi consulta de actualización
Esto funciona
OracleCommand.CommandText = "UPDATE db SET column1 = :param1 WHERE column2 = ''Y''"
OracleCommand.Parameters.Add(New OracleParameter("param1", "1234"))
Pero quiero poder pasar múltiples parámetros.
Aquí está mi código completo
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()
Mi consulta SELECT
parece funcionar cuando se pasan varios parámetros pero no la actualización
Aquí está el tipo de estructura que suelo usar (lo siento, es de memoria):
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();
}
}
La diferencia clave es el uso de AddWithValue: no recuerdo por qué terminé usando eso, pero sí recuerdo haber tenido problemas con algunas de las otras formas de hacerlo.
Aunque no puedo ver nada malo en tu ejemplo, me pregunto si estás siendo golpeado por el viejo problema BindByName
. De forma predeterminada, ODP.NET enlaza los parámetros a la consulta en el orden en que se agregan a la colección, en lugar de basarse en el nombre que desee. Intente establecer BindByName
en true
en su objeto OracleCommand
y vea si eso soluciona el problema.
He tenido este problema tantas veces que uso mi propio método de fábrica para crear comandos que automáticamente establecen esta propiedad en true
para mí.
Documentación clásica inútil de Oracle here
El primer bloque de código es correcto: use dos puntos delante del nombre del parámetro, pero no en el primer argumento de OracleParameter.
Si no se producen errores, es posible que la ACTUALIZACIÓN se ejecute correctamente, simplemente no actualiza ningún registro basado en la cláusula WHERE y su valor de parámetro sustituido. Intente hacerlo en una tabla de prueba sin una cláusula WHERE en la ACTUALIZACIÓN para asegurarse de que haga algo.
Intenta esto, espero que funcione. Se compila.
No estoy seguro si también tienes que enviar un commit ...
Siempre hago este tipo de cosas a través de un procedimiento almacenado, por lo que tengo una confirmación después de la instrucción de actualización en el procedimiento almacenado.
Harvey Sather
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();
Intente actualizar su OracleParameter con el tipo especificado. Establezca el valor del objeto antes de agregarlo a la lista de parámetros.
var param1 = new OracleParameter( "param1", OracleType.Int32 );
param1.Value = "1234";
OracleCommand.Parameters.Add( param1 );
Para emular el comportamiento predeterminado de System.Data.OracleClient, debe configurar OracleCommand para enlazar por nombre.
OracleCommand.BindByName = True