2011-04-23 15 views
5

estoy usando Oracle.DataAccess.Client para trabajar con bases de datos Oracle en mi ASP.Net aplicación. No hay documentación de ayuda en MSDN para ODP.Net y La documentación de Oracle es realmente muy mala. No puedo encontrar la respuesta a esta simple pregunta.la forma de ejecutar una instrucción de actualización utilizando Oracle ODP.Net en C#

¿No es posible ejecutar una declaración de actualización simple sin tener que crear un objeto dataset y actualizar el dataset?

la forma de ejecutar una instrucción de actualización utilizando Oracle ODP.Net en C#?

+1

ODP.Net implementa IDbCommand, IDbConnection y IDbDataAdapter por los que no puede usarlos para preparar y ejecutar su declaración de actualización. – adt

Respuesta

15

necesitaré para comprobar la sintaxis exacta, pero aquí hay un código rápido de la parte superior de mi cabeza

using (OracleConnection con = new OracleConnection(...)) 
{ 
    con.Open(); 
    OracleCommand cmd = con.CreateCommand(); 
    cmd.CommandType = CommandType.Text; 
    cmd.CommandText = "update table set col1 = :param1, col2 = :param2 where key = :keyValue"; 
    cmd.Parameters.AddWithValue("param1", 1); 
    cmd.Parameters.AddWithValue("param2", "Text data"); 
    cmd.Parameters.AddWithValue("keyValue", "1"); 
    cmd.ExecuteNonQuery(); 
} 

Lo anterior crea un objeto de comando establece el comando hasta ejecutar una instrucción SQL de actualización, en En este ejemplo, muestro una forma de configurar una consulta parametrizada, siempre debe ir con una consulta parametrizada. Una vez que el comando está configurado, simplemente llame al ExecuteNonQuery para ejecutar realmente el comando.

+1

¡Dulce! ¡Gracias! Aunque no pude encontrar "AddWithValue". ExecuteNonQuery fue la clave, lo intenté sin una consulta parametrizada y funcionó. Creo que puedo improvisar de aquí en adelante. ¡Realmente aprecio tu tiempo! –

+0

Karthik, la ventaja de utilizar una consulta parametrizada es que hace toda la protección de inyección SQL por usted. – SurfingSanta

+0

Heya! Solo cambiaría algunas cosas para agregar el control de transacción que permite a Oracle ejecutar comandos de actualización: 'código' OracleCommand cmd = con.CreateCommand(); OracleTransaction oratrans = con.BeginTransaction (IsolationLevel.ReadCommitted); cmd.Transaction = oratrans; . . . cmd.ExecuteNonQuery(); oratrans.Commit(); Atentamente, –

0

Además de la respuesta de @ Chris, aquí está la página de documentación de la clase OracleParameter que tiene código de muestra al usar OracleCommand para ejecutar Update s.

EDITAR: Aquí está el punto de entrada para ODP.net documentation.

+1

El enlace al código de muestra que ha proporcionado se refiere a cómo obtener datos utilizando OracleDataReader y no a cómo actualizar los datos (según mi pregunta inicial). Ya revisé la documentación de ODP.net y no pude encontrar una muestra de código similar para actualizar. Deseo que MSDN haya documentado esto :(. –

1

Así que después de un poco de investigación y trabajando esto por un tiempo, encontré que el método que utilicé para agregar un nuevo parámetro al comando de conexión es el siguiente. No encontré el método como se indicó en la publicación anterior. Ten en cuenta que estoy usando un objeto de consulta con el que estoy pasando los valores.

public Boolean InsertMethod(Query _query) 
    { 
     var success = false; 
     var queryString = string.Format(@"INSERT INTO TABLE(ID, OWNER, TEXT) VALUES (TABLE_SEQ.NEXTVAL,:OWNER, :TEXT)"); 
     try 
     { 
      using (OracleConnection con = new OracleConnection(ConString)) 
      { 
       con.Open(); 
       OracleCommand cmd = con.CreateCommand(); 
       cmd.CommandText = queryString; 
       cmd.Parameters.Add("OWNER", _query.Owner); 
       cmd.Parameters.Add("TEXT", _query.Text);   

       int rowsUpdated = cmd.ExecuteNonQuery(); 

       if (rowsUpdated > 0) success = true; 
      } 

      return success; 
     } 
     catch (Exception ex) 
     { 
      log.Error(ex); 
      throw; 
     } 
    } 
+0

Parece que estás insertando dos veces. Dos 'cmd.ExecuteNonQuery();' – Halter

+1

Estás en lo correcto. Gracias. Ha sido editado. – nshouppuohsn

Cuestiones relacionadas