Foros del Web » Programando para Internet » ASPX (.net) »

Realizar Select con BeginTransaccion Activado

Estas en el tema de Realizar Select con BeginTransaccion Activado en el foro de ASPX (.net) en Foros del Web. Tengo una duda. Yo estoy trabajando con Begin Transaction, commit y rollback para una operación que estoy realizando: Lo manejo de la siguiente forma: Código: ...
  #1 (permalink)  
Antiguo 31/01/2006, 13:09
Avatar de RsOfT  
Fecha de Ingreso: marzo-2002
Ubicación: InterNET
Mensajes: 1.121
Antigüedad: 22 años, 1 mes
Puntos: 7
Realizar Select con BeginTransaccion Activado

Tengo una duda. Yo estoy trabajando con Begin Transaction, commit y rollback para una operación que estoy realizando:

Lo manejo de la siguiente forma:
Código:
Dim cnn As SqlClient.SqlConnection = New SqlClient.SqlConnection(ConfigurationSettings.AppSettings.Get("cnn").ToString)
Dim myTrans As SqlClient.SqlTransaction
Dim myCommand As SqlClient.SqlCommand = cnn.CreateCommand

If cnn.State = ConnectionState.Closed Then cnn.Open()
myTrans = cnn.BeginTransaction
myCommand.Connection = cnn
myCommand.Transaction = myTrans

myCommand.CommandText = "Comando Insert, Update o Delete"
myCommand.ExecuteNonQuery()

myCommand.CommandText = "Comando Insert, Update o Delete"
myCommand.ExecuteNonQuery()
Y para yo poder realizar un Select, hago lo siguiente:
Código:
Dim dsDataSet as DataSet = New DataSet
daDataAdapter = New SqlClient.SqlDataAdapter("Select * from Tabla", ConfigurationSettings.AppSettings.Get("cnn").ToString)
daDataAdapter.Fill(dsDataSet)
Todo bien hasta ahí. El problema está cuando realizo un select a una tabla la cual haya sido modificada y esté con un BiginTrasaction. Siempre me da TimeOut y el select no termina ya que posee un BeginTransaction iniciada. Necesto hacer el SELECT utilizando la variable MyCommand para que esté dentro de la transacción iniciada en la base de datos.

Cómo puedo realizar un select a una tabla dentro de una transacción iniciada y llenar un dataset?
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
  #2 (permalink)  
Antiguo 31/01/2006, 13:20
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
No entiendo bien... espero que no intentes hacer un select mientras exista una transaccion activa... tiene que terminar para que puedas hacer uso despues de la información...

Danos mas detalles..

Salu2
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
  #3 (permalink)  
Antiguo 31/01/2006, 14:32
Avatar de RsOfT  
Fecha de Ingreso: marzo-2002
Ubicación: InterNET
Mensajes: 1.121
Antigüedad: 22 años, 1 mes
Puntos: 7
Pues eso mismo es lo que quiero hacer, realizar un select con una transacción activa. En visual Basic 6 yo puedo hacer eso utilizando un tipo de cursor "3,3", no puede ser que .NET no se pueda.
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
  #4 (permalink)  
Antiguo 31/01/2006, 15:01
Avatar de royrojas  
Fecha de Ingreso: diciembre-2004
Mensajes: 458
Antigüedad: 19 años, 4 meses
Puntos: 3
depende de si el select lo estas haciendo dentro de otro proceso, pues no se puede.
por ejemplo.
en un procedimiento puedes hacer algo asi.

public sub NombreProcedimiento
Dim myTrans As SqlClient.SqlTransaction
try
myTrans = cnn.BeginTransaction
accion_base_datos_1

accion_base_datos_2

commit

cath
rollback
end try

mientras todo este dentro del mismo procedimiento no hay problema, pero en el procedimiento como el que esta arriba no le das commit antes de terminarlo no pudes ir a otro proceso a ejecutar alguna accion sobre esa base de tabla, por que existe una transaccion abierta.

tienes que dividir el sistema en procedimientos y funciones, y llamarlas desde algun proceso que contenga la transaccion.
para que dentro de un mismo procedimiento (Sub) o funcion (funtion) inicies o finalices la transaccion.
__________________
roy rojas
Programación en Español: DotNetcr.com
  #5 (permalink)  
Antiguo 01/02/2006, 06:11
Avatar de RsOfT  
Fecha de Ingreso: marzo-2002
Ubicación: InterNET
Mensajes: 1.121
Antigüedad: 22 años, 1 mes
Puntos: 7
royrojas, eso es lo que quiero hacer, que utilizando la misma transacción dentro del mismo procedimiento realizar un select, como lo hago?

Yo pudiera hacer esto:
Código:
myCommand.CommandText = "Select * from Tabla"
myCommand.ExecuteNonQuery()
Este select se ejecuta, pero no he podido hacer que el resultado de este select me llene un dataset.

La pregunta puntual es: ¿Cómo lleno un dataset al realizar mi select dentro de la transacción activa?
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
  #6 (permalink)  
Antiguo 01/02/2006, 10:08
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Porque si haces ExecuteNonQuery te devuelve un valor string, int ... debes hacer executeReader.
  #7 (permalink)  
Antiguo 01/02/2006, 12:14
Avatar de RsOfT  
Fecha de Ingreso: marzo-2002
Ubicación: InterNET
Mensajes: 1.121
Antigüedad: 22 años, 1 mes
Puntos: 7
El método ExecuteReader no me devuelve un dataset.
Hice lo siguiente:
dsDataSet = myCommand.ExecuteReader()

y el error que me da es: "Value of type 'System.Data.SqlClient.SqlDataReader' cannot be converted to 'System.Data.DataSet'."
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
  #8 (permalink)  
Antiguo 02/02/2006, 01:42
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Pero ExecuteNonQuery tampoco, debes cargar el Dataset leyendo el datareader o utilizar por ejemplo un DataAdapter (creo que es DataAdapter). P.ej.
Código:
dim myRow ad DataRow
dim dr as ...DataReader = myCommand.ExecuteReader()
while dr.Read
myRow= dsDataSet.Tables("nombre").NewRow()
myRow("campo") = dr("campo")
....
dsDataSet.Tables("nombre").Rows.Add(myRow)
End while
dr.close()
  #9 (permalink)  
Antiguo 02/02/2006, 06:56
Avatar de RsOfT  
Fecha de Ingreso: marzo-2002
Ubicación: InterNET
Mensajes: 1.121
Antigüedad: 22 años, 1 mes
Puntos: 7
Jose,

Llenar de dataset por medio del datareader sería más lento en caso de que fueras muchos registros, ya que tendría que hacerlo registro por registro.

¿No sería posible llenar el dataset por medio del datareader en una sola línea de código y que internamente pase los datos?
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
  #10 (permalink)  
Antiguo 02/02/2006, 07:00
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Creo que no, porque un dataset en como una base de datos (en memoria) y un datareader es una consulta de registros, una tabla solo vamos.

La otra opción, si no me equivoco, es usar como te he dicho usar un DataAdapter
  #11 (permalink)  
Antiguo 02/02/2006, 07:07
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Cita:
Llenar de dataset por medio del datareader sería más lento en caso de que fueras muchos registros, ya que tendría que hacerlo registro por registro.
Hasta donde se el metodo es el mismo, no hay magia, que si por ejemplo tuviese una funciónp para rellenarlo, dependerá de la optimización. Es más, si lo único que quieres hacer la consulta, no te recomiendo dataadapter, porque estarías consumiendo recursos inneccesarios (de inserción....), que se reserva.

Pero en fin, no se, yo es todo suposiciones y experiencia propia, deberían ser los masters los que te recomienden algo.

PD. Si existe una función para rellenar un datatable desde un datareader, que alguien la diga xq llevaría 2 años en la inopia!!!!
  #12 (permalink)  
Antiguo 02/02/2006, 09:36
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Cita:
Iniciado por Jose_minglein2
Si existe una función para rellenar un datatable desde un datareader, que alguien la diga xq llevaría 2 años en la inopia!!!!
Se puede hacer de ésta forma: (tomando como referencia la BD de NorhWind)

Cita:
DataTable dt = new DataTable(); //construyo mi datatable
//creo las columnas
dt.Columns.Add("CustomerID",typeof(string));
dt.Columns.Add("CompanyName",typeof(string));
...
...
//obtengo el datareader
...
while (dr.Read()) {
DataRow drTable = dt.NewRow();
drTable[0] = dr[0].ToString();
drTable[1] = dr[1].ToString();
dt.Rows.Add(drTable);
}
...
...
Y listo.. ya tengo toda la info que necesito en mi datatable para usarlo con algun control, o para lo que sea..

Por cierto RsOft, todavía no logro enteder que es lo que quieres hacer, porque no le veo sentido coloca en una transaccion un "SELECT" ya que las transacciones son precisamente para los updates, delete and insert no tiene nada que hacer un SELECT en una transaccion, lo que sería mas lógico es crear un solo SP con todos los updates, delete, insert que necesites y posteriormente si la transaccion fue existosa llamar a tu metodo para traerte los datos.., es una idea... pero te repito que todavía no entiendo al 100% lo que quieres hacer..


Salu2

Última edición por RootK; 02/02/2006 a las 09:43
  #13 (permalink)  
Antiguo 02/02/2006, 09:40
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Cita:
Se puede hacer de ésta forma: (tomando como referencia la BD de NorhWind)
Eso ya lo puse yo en el post 8
  #14 (permalink)  
Antiguo 02/02/2006, 10:16
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Cita:
Iniciado por Jose_minglein2
Eso ya lo puse yo en el post 8
Estoy de acuerdo, pero en el post 11 colocaste ésto:

Cita:
Iniciado por Jose_minglein2
PD. Si existe una función para rellenar un datatable desde un datareader, que alguien la diga xq llevaría 2 años en la inopia!!!!
  #15 (permalink)  
Antiguo 02/02/2006, 10:22
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Jajaja, ya ya, me refería a de forma directa, p.ej como un repeater:

myrepeater.datasource = mydr
myrepeater.dataBind()

que si existia una forma así, que alguién lo dijese xq estaba de los while hasta el moño. jeje.

Entonces para concluir RoQ no te queda otra que jalar un while con datareader para cargar tu dataset (creo).
  #16 (permalink)  
Antiguo 02/02/2006, 10:27
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Cita:
me refería a de forma directa, p.ej como un repeater:

myrepeater.datasource = mydr
myrepeater.dataBind()
De hecho así como lo estás poniendo se puede hacer...

Última edición por RootK; 02/02/2006 a las 11:03
  #17 (permalink)  
Antiguo 09/02/2006, 15:21
Avatar de RsOfT  
Fecha de Ingreso: marzo-2002
Ubicación: InterNET
Mensajes: 1.121
Antigüedad: 22 años, 1 mes
Puntos: 7
No me había dado cuenta que habían respondido.

Cita:
RootK dice:
De hecho así como lo estás poniendo se puede hacer...
RootK,
Cómo así?
Quieres decir que con un código como éste:
Código:
myrepeater.datasource = mydr
myrepeater.dataBind()
puedo llenar un dataset a partir de un dataadapter sin tener que hacer un bucle? ¿Cómo?

Cita:
RootK dice:
Por cierto RsOft, todavía no logro enteder que es lo que quieres hacer, porque no le veo sentido coloca en una transaccion un "SELECT" ya que las transacciones son precisamente para los updates, delete and insert no tiene nada que hacer un SELECT en una transaccion, lo que sería mas lógico es crear un solo SP con todos los updates, delete, insert que necesites y posteriormente si la transaccion fue existosa llamar a tu metodo para traerte los datos.., es una idea... pero te repito que todavía no entiendo al 100% lo que quieres hacer..
Te plantearé este escenario:
Tengo una tabla a la cual tengo que buscar el último ID para sumarme uno, para luego insertar un registro en la misma tabla con el nuevo ID.
El beging transaction bloquea la tabla para que otro usuario tenga que esperar a que la trasacción termine. Hacer este select me garantisa al 100% que dos usuario no leerán el mismo ID a la vez.

De todas llenaré el dataset con el while hasta que averigue como llenarlo con algún método.
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
  #18 (permalink)  
Antiguo 09/02/2006, 15:31
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 4 meses
Puntos: 7
Cita:
Iniciado por RsOfT
puedo llenar un dataset a partir de un dataadapter sin tener que hacer un bucle? ¿Cómo?
Si usas un DataAdapter, simplemente usa el método Fill (que usa internamente un DataReader), si te referías a un DataReader, la respuesta es no.

Cita:
Te plantearé este escenario:
Tengo una tabla a la cual tengo que buscar el último ID para sumarme uno, para luego insertar un registro en la misma tabla con el nuevo ID.
El beging transaction bloquea la tabla para que otro usuario tenga que esperar a que la trasacción termine. Hacer este select me garantisa al 100% que dos usuario no leerán el mismo ID a la vez.

De todas llenaré el dataset con el while hasta que averigue como llenarlo con algún método.
Y por qué no hacer eso desde un procedimiento almacenado? por qué no usar un autonumérico? etc, etc.

Personalmente, tampoco veo un sentido a lo que intentas hacer.

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño

Última edición por xknown; 09/02/2006 a las 15:37
  #19 (permalink)  
Antiguo 09/02/2006, 16:24
Avatar de RsOfT  
Fecha de Ingreso: marzo-2002
Ubicación: InterNET
Mensajes: 1.121
Antigüedad: 22 años, 1 mes
Puntos: 7
No me gusta utilizar autonumérico, me ha trancaso el juego en algunos casos especiales, no recuerdo cual, si me acuerdo te aviso.

Por otro lado, ahora mismo no tengo en la mente otro caso en donde he necesitado hacer un select dentro de una transacción, pero esas dos respuestas te la debo. Ahora mismo no recuerdo.

PD: No me gusta utilizar Storage Proceduce en aplicaciones comerciales, ya que tendría que casarme con la base de datos y mis aplicaciones pueden utilizar varias base de datos.

__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
  #20 (permalink)  
Antiguo 28/10/2008, 13:20
 
Fecha de Ingreso: octubre-2008
Mensajes: 81
Antigüedad: 15 años, 6 meses
Puntos: 3
Respuesta: Realizar Select con BeginTransaccion Activado

Hola RsOfT, supongo tal vez tu inconveniente en utilizar un autonumerico es porq lo utilizas tanto en una tabla de encabezado como en una de detalle, y en ambas debes utilizar el mismo ID, a mi me pasa lo mismo y por eso mi necesidad de utilizar select y updates del ID dentro del cuerpo de la transacción...

Alguna sugerencia?
  #21 (permalink)  
Antiguo 28/10/2008, 13:41
Avatar de RsOfT  
Fecha de Ingreso: marzo-2002
Ubicación: InterNET
Mensajes: 1.121
Antigüedad: 22 años, 1 mes
Puntos: 7
Respuesta: Realizar Select con BeginTransaccion Activado

Yo pude hacer un select dentro de un begintran utilizando datareader en vez de dataset.
__________________
.::RsOfT::.
--El que se aferra a lo conocido, nunca conocerá lo desconocido--
--Es intentando lo imposible como se realiza lo posible--
--Es de pésimo gusto contentarse con algo mediocre cuando lo excelente está a nuestro alcance--
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:51.