2010-12-20 20 views
5

Tiene un conjunto de datos tipeados con varias tablas relacionadas y relaciones definidas entre esas tablas. A medida que proceso un suministro de datos, agrego, modifico y elimino registros, luego llamo la actualización en cada tabla.Transacciones en Typed DataSets

Requests  Reapprovals  UserRole 
RequestId ----- RequestId ----- RoleId 
Reason   RoleId ----/  UserId 

La razón para utilizar un conjunto de datos con tipo es que tengo para comprobar los datos existentes para determinar si estoy añadiendo, modificando o eliminando registros ... así que necesito el volcado completo de todo lo que estoy trabajando con (la alternativa sería 10.000 consultas en contra de la base de datos mientras proceso los registros uno por uno).

Quiero soporte transaccional, pero no veo una manera de hacerlo con conjuntos de datos tipados. Por ejemplo, estoy creando una nueva solicitud cuando creo una nueva aprobación. Pero si la reaprobación no se actualiza, no quiero mantener la solicitud.

Poner las llamadas de actualización bajo TransactionScope significaría que si falla cualquier registro, todos fallan. No es lo que quiero

¿Cómo puedo confirmar o revertir las filas relacionadas en un conjunto de datos tipado?

+0

Puede ser que le interese saber que llamar a Update en un cuadro no, de hecho, enviar N consultas a la base de datos, una para cada registro va a actualizar/añadir/removiendo Por lo tanto, no está obteniendo mucho beneficio si llama a Update en una tabla o llama a Update cada vez que cambia una sola fila. (Puede haber algunos beneficios cuando se usa una opción de envío "masivo", pero no sé qué tan importante) Entonces, si bien puede usar su volcado total en memoria para determinar qué registros modificar, le sugiero que ajuste cada serie de acciones. para un registro en su propio alcance de transacción. – Pandincus

+0

Sabía que las filas se actualizaban de una en una, y consideraba actualizar las filas de una en una mientras las modifico ... lo que me molestaba era llamar a Update() en la tabla, que verifica cada fila para ver si necesita actualizarse Lo que significa que estoy iterando más de 10.000 filas más de 10.000 veces para encontrar la fila que se ha actualizado. No estaba seguro de si ese rendimiento sería enorme o insignificante. –

+0

Pandincus> Si quiere ingresar lo que dice como respuesta, lo aceptaré. Parece que mis elecciones son tomar el rendimiento al hacer lo que sugieres, o aceptar/rechazar los cambios del conjunto de datos como un todo: (Gracias! –

Respuesta

3

Puede usar transacciones regulares y también lograr la transacción como característica de TableAdapterManager como en los ejemplos a continuación.

primera aproximación a utilizar la transacción regular,

public void savewithTransacition() 
    { 
     DataSet1TableAdapters.Table1TableAdapter taTbl1 = new DataSet1TableAdapters.Table1TableAdapter(); 
     DataSet1TableAdapters.Table2TableAdapter taTbl2 = new DataSet1TableAdapters.Table2TableAdapter(); 
     SqlTransaction st = null; 
     SqlConnection sc = new SqlConnection("ur conneciton string"); 
     try 
     { 
      sc.Open(); 
      st = sc.BeginTransaction(); 

      taTbl1.Transaction = st; 
      taTbl2.Transaction = st; 
      st.Commit(); 
     } 
     catch (System.Exception ex) 
     { 
      st.Rollback(); 
      throw ex; 
     } 


    } 

Second..with gestor de adaptadores mesa ..

public void SaveWithManager() 
    { 
     DataSet1TableAdapters.TableAdapterManager mgr1 = new DataSet1TableAdapters.TableAdapterManager(); 
     DataSet1TableAdapters.Table1TableAdapter taTbl1 = new DataSet1TableAdapters.Table1TableAdapter(); 
     DataSet1TableAdapters.Table2TableAdapter taTbl2 = new DataSet1TableAdapters.Table2TableAdapter(); 

     mgr1.Table1TableAdapter = taTbl1; 
     mgr1.Table2TableAdapter = taTbl2; 
     mgr1.UpdateOrder = DataSet1TableAdapters.TableAdapterManager.UpdateOrderOption.InsertUpdateDelete; 
     mgr1.UpdateAll(this); 
    } 

Con esta opción puede crear TAManagers para el grupo de mesas de ahorrar. como si quisiera que un grupo se guarde e incluso si otro obtiene un error.

+0

Estoy explorando la información del administrador de transacciones, pero es un nivel completamente nuevo para transacciones que No estoy familiarizado con. ¿Tiene algún ejemplo de código para lo que quiere decir, o enlaces a recursos? Gracias! –

+0

Modificado con un código de muestra, puede elegir cualquiera que sea adecuado para usted. – paragy

+0

Al considerar esto, se actualizará pronto ¡Gracias! –

0

Puede utilizar ámbito de transacción con diferentes opciones de ámbito

+0

El problema es separar las actualizaciones individuales de la llamada principal .Update(), por lo que algunas pueden tener éxito, mientras que algunas fallan. –

+0

Puede utilizar el S opción de pulsación no puede? De esta manera, el código que está en el alcance de su transacción con la opción Suprimir no formará parte de su transacción principal ... – pdiddy

+0

No creo que esté entendiendo lo que estoy tratando de hacer –