Transacciones e vstudio 2005

27/09/2006 - 06:06 por Juan Melas | Informe spam
Estoy empezando con visual studio 2005 y estoy viendo un ejemplo de
actualización de 2 tablas dentro de una transacción, arme los tableadapters
con el diseñador , en que parte del código debería efectuar las
modificaciones para que el update de las 2 tablas se efectue dentro de la
transacción y no de cada tabla en forma individual, yo lo tenía resuelta en
Vs2003 todo por código en 3 capas sin usar los diseñadores pero me gustaría
hacer uso de las nuevas características de ado.net. 2.0,si alguien tiene
algún ejemplo.

Gracias

Preguntas similare

Leer las respuestas

#1 Jesús López
27/09/2006 - 11:12 | Informe spam
Los tableadapters, tal y como son generados automáticamente, no soportan
transacciones. Para hacer que un tableadapter soporte transacciones es
necesario extenderlo.

Supongamos que tenemos un dataset con tipo llamado DataSetProducts con los
datatables Categories y Products y sus correspondientes tableadapters
CategoriesTableAdapter y ProductsTableAdapters. Vamos a añadirle a los dos
tableadapters una propiedad Transaction. Para ello, seleccionamos
DataSetProducts.xsd en el Solution Explorer, pulsamos con el botón derecho
del ratón y seleccionamos "View Code". Se nos muestra DataSetProducts.vb con
un código similar a este:

Partial Class DataSetProducts
Partial Class CategoriesDataTable
End Class

Partial Class ProductsDataTable
End Class

End Class

Modificamos DataSetProducts.vb para que tenga el siguiente código

Imports System.Data.SqlClient

Partial Class DataSetProducts
Partial Class CategoriesDataTable
End Class

Partial Class ProductsDataTable
End Class
End Class

Namespace DataSetProductsTableAdapters
Partial Class CategoriesTableAdapter
Public Property Transaction() As SqlTransaction
Get
Return Me.Adapter.InsertCommand.Transaction
End Get
Set(ByVal value As SqlTransaction)
Me.Adapter.InsertCommand.Transaction = value
Me.Adapter.UpdateCommand.Transaction = value
Me.Adapter.DeleteCommand.Transaction = value
End Set
End Property
End Class

Partial Class ProductsTableAdapter
Public Property Transaction() As SqlTransaction
Get
Return Me.Adapter.InsertCommand.Transaction
End Get
Set(ByVal value As SqlTransaction)
Me.Adapter.InsertCommand.Transaction = value
Me.Adapter.UpdateCommand.Transaction = value
Me.Adapter.DeleteCommand.Transaction = value
End Set
End Property
End Class

End Namespace


Una vez hecho esto. Desde cualquier parte del programa podremos hacer que la
actualización de las dos tablas se produzca en una única transacción. Por
ejemplo


Public Sub SaveProducts(ByVal ds As DataSetProducts)
Using cn As New SqlConnection("Data Source=(local);Integrated
Security=SSPI;Initial Catalog=Northwind"), _
CategoriesAdapter As New
DataSetProductsTableAdapters.CategoriesTableAdapter(), _
ProductsAdapter As New
DataSetProductsTableAdapters.ProductsTableAdapter()

cn.Open()
Using tx As SqlTransaction = cn.BeginTransaction()
CategoriesAdapter.Connection = cn
CategoriesAdapter.Transaction = tx
ProductsAdapter.Connection = cn
ProductsAdapter.Transaction = tx

ProductsAdapter.Update(ds.Products.Select(String.Empty,
String.Empty, DataViewRowState.Deleted))
CategoriesAdapter.Update(ds.Categories.Select(String.Empty,
String.Empty, DataViewRowState.Deleted))

CategoriesAdapter.Update(ds.Categories.Select(String.Empty,
String.Empty, DataViewRowState.ModifiedCurrent))
ProductsAdapter.Update(ds.Products.Select(String.Empty,
String.Empty, DataViewRowState.ModifiedCurrent))

CategoriesAdapter.Update(ds.Categories.Select(String.Empty,
String.Empty, DataViewRowState.Added))
ProductsAdapter.Update(ds.Products.Select(String.Empty,
String.Empty, DataViewRowState.Added))

tx.Commit()
End Using
End Using
End Sub

Observa que la actualización se produce en un orden determinado para evitar
violar las claves externas.


Por otra parte, si en vez de usar transacciones locales clásicas de ADO.NET,
usamos las transacciones de System.Transactions, no es necesario extender los
tableadapters y el código resulta más sencillo. Añadimos una referencia al
ensamblado System.Transactions.dll y escribimos un código como este:

Imports System.Transactions


Public Sub SaveProducts(ByVal ds As DataSetProducts)
Using ts As New TransactionScope(), _
CategoriesAdapter As New
DataSetProductsTableAdapters.CategoriesTableAdapter(), _
ProductsAdapter As New
DataSetProductsTableAdapters.ProductsTableAdapter()

ProductsAdapter.Update(ds.Products.Select(String.Empty,
String.Empty, DataViewRowState.Deleted))
CategoriesAdapter.Update(ds.Categories.Select(String.Empty,
String.Empty, DataViewRowState.Deleted))

CategoriesAdapter.Update(ds.Categories.Select(String.Empty,
String.Empty, DataViewRowState.ModifiedCurrent))
ProductsAdapter.Update(ds.Products.Select(String.Empty,
String.Empty, DataViewRowState.ModifiedCurrent))

CategoriesAdapter.Update(ds.Categories.Select(String.Empty,
String.Empty, DataViewRowState.Added))
ProductsAdapter.Update(ds.Products.Select(String.Empty,
String.Empty, DataViewRowState.Added))

ts.Complete()

End Using
End Sub




Saludos:

Jesús López
Solid Quality Mentors
www.solidqualitylearning.com



"Juan Melas" wrote:

Estoy empezando con visual studio 2005 y estoy viendo un ejemplo de
actualización de 2 tablas dentro de una transacción, arme los tableadapters
con el diseñador , en que parte del código debería efectuar las
modificaciones para que el update de las 2 tablas se efectue dentro de la
transacción y no de cada tabla en forma individual, yo lo tenía resuelta en
Vs2003 todo por código en 3 capas sin usar los diseñadores pero me gustaría
hacer uso de las nuevas características de ado.net. 2.0,si alguien tiene
algún ejemplo.

Gracias



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida