Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MS SQL Server
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-06-2012
4PS_MultiPass 4PS_MultiPass is offline
Registrado
 
Registrado: may 2008
Posts: 5
Poder: 0
4PS_MultiPass Va por buen camino
SQL Server 2005 Express y las transacciones anidadas

Hola a todos en el foro.

Si no es la primera vez que escribo, probablemente sea la segunda y es para pediros ayuda...

Tengo dos bases de datos creadas dentro de un servidor MS SQL server 2005 Express.

Tanto en la base de datos A como en la B existen las mismas tablas. La base de datos A es para los "dato de trabajo" y la base de datos B es para hacer las labores de "Histórico".

Lo que quiero implementar es el traspaso de información de la base de datos A a la base de datos B. Más específicamente, mover un registro de la base de datos A a la B.

Esto lo llevaría a cabo copiando el contenido de un registro de la tabla T1 de la base de datos A a la tabla T1 de la base de datos B y a continuación eliminando dicho registro de la tabla T1 de la base de datos A.

Además, para mí es muy importante hacerlo dentro de transacciones para asegurarme que si falla el copiado no ejecute el borrado, o que si falla el borrado que deshaga el copiado.

dbHistorico y dbDatos son dos TADOConnection

El trozo de código es el siguiente...
Código:
        cSentenciaHistorico := 'INSERT INTO T1 (campo)  values  ('valor');

        //Comienzo la primera transacción que controla la inserción del registro en el histórico.
        dbHistorico.BeginTrans;
        try
          dbHistorico.Execute(cSentenciaHistorico);
          // Comienza la segunda transaccion (anidada) que controla el borrado del registro en la base de datos "de diario".
          dbDatos.BeginTrans;
          try
            cSentenciaDatos := 'DELETE ' + cTabla + ' WHERE ' + cClave + ' = ' + TSQL.FieldByName( cClave ).AsString + ';';
            dbDatos.Execute(cSentenciaDatos);
            // si todo ha ido bien, hago un commit de las dos transacciones.
            dbDatos.CommitTrans;
            dbHistorico.CommitTrans;
          except
            // si falló el borrado, lo anulo.
            dbDatos.RollbackTrans;
            // reactivo la excepción para que también se deshaga la insercion.
            raise;
          end;
        except
          // si algo fué mal, que se deshaga el insert.. 
          dbHistorico.RollbackTrans;
        end;
Mi problema es que cuando el programa llega a la línea en donde se intenta abrir la segunda transacción, me salta una excepción con el siguiente mensaje "No se puede crear una nueva transacción, se excedió la capacidad".

No soy capaz de hayar una solución.

¿Vosotros veis si me estoy equivocando en algo?

¿Se os ocurre alguna otra forma de mover los registros de una db a otra de forma segura?

Perdonad por el tocho, pero es que no me sé explicar mejor.

Muchas gracias por adelantado.
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Delphi 7 + SQL Server 2005 Express lsedr Conexión con bases de datos 6 19-08-2011 22:14:45
¡¡¡Ayuda con sql server express 2005!!! manrock44 SQL 6 02-09-2010 16:33:34
Sql Server Express 2005 dvlt SQL 1 10-03-2008 14:51:05
SQL Server 2005 Express Iceman MS SQL Server 2 04-12-2006 23:19:57
Sql Server Express 2005 problemas... Nelson Polanco MS SQL Server 2 08-05-2006 23:57:58


La franja horaria es GMT +2. Ahora son las 11:29:36.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi