es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

OleDbCommand, comandos múltiples

Tengo una tabla de acceso que estoy utilizando para realizar un seguimiento de un número que incrementa cada vez que se produce una exportación de otros datos. En el siguiente código:

using (OleDbConnection con = new OleDbConnection(DatabaseProvider + DatabaseFilePath))
{
      con.Open();
      using (OleDbCommand cmd = con.CreateCommand())
      {
           cmd.CommandText = "DELETE FROM IncrementingNumberTable WHERE [Num]=" + curr + ";";
           cmd.Connection = con;
           cmd.ExecuteNonQuery();
      }
      curr++;
      using (OleDbCommand cmd = con.CreateCommand())
      {
           cmd.CommandText = "INSERT INTO IncrementingNumberTable ([Num])VALUES(" + curr + ");";
           cmd.Connection = con;
           cmd.ExecuteNonQuery();
      }
}

El código funciona como se pretende, pero es posible, aunque poco probable, que ocurra un error de conexión en el segundo comando, lo que significa que se perderá mi número incrementado. Esto ocurrió durante la depuración y no sería bueno si sucediera en un sistema en vivo.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para evitar que el número incrementado se pierda en caso de un error de conexión, puede utilizar una transacción. Una transacción asegura que una serie de operaciones de base de datos sean atómicas, lo que significa que todas las operaciones se completan con éxito o ninguna se completa.

    Para utilizar una transacción, modifique el código de la siguiente manera:

    using (OleDbConnection con = new OleDbConnection(DatabaseProvider + DatabaseFilePath))
    {
        con.Open();
        using (OleDbTransaction tran = con.BeginTransaction())
        {
            try
            {
                using (OleDbCommand cmd = con.CreateCommand())
                {
                    cmd.Transaction = tran;
                    cmd.CommandText = "DELETE FROM IncrementingNumberTable WHERE [Num]=" + curr + ";";
                    cmd.ExecuteNonQuery();
                }
                curr++;
                using (OleDbCommand cmd = con.CreateCommand())
                {
                    cmd.Transaction = tran;
                    cmd.CommandText = "INSERT INTO IncrementingNumberTable ([Num])VALUES(" + curr + ");";
                    cmd.ExecuteNonQuery();
                }
                tran.Commit();
            }
            catch (Exception ex)
            {
                tran.Rollback();
                // Manejar la excepción aquí
            }
        }
    }
    

    Con esta modificación, las dos operaciones de base de datos (eliminar e insertar) se ejecutan dentro de una transacción. Si alguna de las operaciones falla, la transacción se revierte, asegurando que el número incrementado no se guarde. Tenga en cuenta que el código en el bloque catch debe manejar cualquier excepción que ocurra durante la transacción.

Comments are closed.