Foros del Web » Programación para mayores de 30 ;) » .NET »

Error de pila

Estas en el tema de Error de pila en el foro de .NET en Foros del Web. Hola tengo un problema con las conexiones a la base de datos. Hago muchas consultas a la base de datos y tengo que mantenerlas abiertas ...
  #1 (permalink)  
Antiguo 11/07/2005, 00:35
 
Fecha de Ingreso: marzo-2005
Mensajes: 122
Antigüedad: 19 años, 2 meses
Puntos: 0
Pregunta Error de pila

Hola tengo un problema con las conexiones a la base de datos.
Hago muchas consultas a la base de datos y tengo que mantenerlas abiertas para trabajar con ellas y tengo varias dudas.

¿Por cada consulta que quiero hacer a la base de datos tengo que abrir una conexion? Es que cuando llevo ciertas conexiones me da error de pila. Es como si se llenara el buffer y hasta que se vacie no vuelve funcionar ninguna consulta a la base de datos.

Me aseguro de que en cada procedimiento cierro las conexiones y libero memoria haciendo esto.

¿Por que me da este error de pila? Como libero del buffer las conexiones?



If conn.State = ConnectionState.Open Then
conn.Close()
End If
cmdselect = Nothing
dremp = Nothing

Código:

strsql = "SELECT * FROM Hoteles "

conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ruta
        conn.Open()
        Dim cmdselect As New OleDb.OleDbCommand(strsql, conn)
        Dim dremp As OleDb.OleDbDataReader
        dremp = cmdselect.ExecuteReader()



Código:
Error de servidor en la aplicación '/'.
--------------------------------------------------------------------------------

Error no especificado 
Descripción: Excepción no controlada al ejecutar la solicitud Web actual. Revise el seguimiento de la pila para obtener más información acerca del error y dónde se originó en el código. 

Detalles de la excepción: System.Data.OleDb.OleDbException: Error no especificado

Error de código fuente: 

Se ha generado una excepción no controlada durante la ejecución de la solicitud Web actual. La información sobre el origen y la ubicación de la excepción pueden identificarse utilizando la excepción del seguimiento de la pila siguiente.  

Seguimiento de la pila: 


[OleDbException (0x80004005): Error no especificado]
   System.Data.OleDb.OleDbConnection.ProcessResults(Int32 hr) +20
   System.Data.OleDb.OleDbConnection.InitializeProvider() +57
   System.Data.OleDb.OleDbConnection.Open() +203
   baluma.Resultados.busca() in C:\Inetpub\wwwroot\baluma\Resultados.aspx.vb:3077
   baluma.Resultados.Page_Load(Object sender, EventArgs e) in C:\Inetpub\wwwroot\baluma\Resultados.aspx.vb:112
   System.Web.UI.Control.OnLoad(EventArgs e) +67
   System.Web.UI.Control.LoadRecursive() +35
   System.Web.UI.Page.ProcessRequestMain() +750

 


--------------------------------------------------------------------------------
Información de versión: Versión de Microsoft .NET Framework:1.1.4322.2032; Versión de ASP.NET:1.1.4322.2032
  #2 (permalink)  
Antiguo 11/07/2005, 02:26
 
Fecha de Ingreso: mayo-2005
Mensajes: 122
Antigüedad: 19 años
Puntos: 0
Respuesta ...

A ver, está claro, que por cada consulta que hagas a la base de datos tienes que abrir una conexión. Lo que pasa es que luego también tienes que cerrarla, porqué si no dará problemas con tantas conexiones abiertas. Yo lo que hago es lo siguiente. Tengo una rutina general en un modulo, declarada así:

Public Sub Abrir_Conexion_Sql(ByRef Conn as SqlClient.SqlConnection)

conn.connectionstring = <cadena de conexión>
conn.open()

End Sub

Y tengo otra así ...

Public Sub Cerrar_Conexion_Sql(ByRef Conn as SqlClient.SqlConnection)

conn.close
conn=nothing

End Sub

Cada vez que hago una consulta primero llamo a la de arriba, pasando una variable del tipo SqlConnection por referencia, ya que la vamos a modificar, y luego cuando quiero cerrar la conexión, hago lo mismo pero en cerrar conexión, y de esta manera me aseguro, que cierro la conexión con el .close
y que además borro el objeto con = nothing.

A mi nunca me ha dado problemas haciéndolo así. Y en vez de tener conexiones abiertas lo que puedes hacer es leer los datos y meterlos en un dataset y cerrar la conexión a la base de datos. De esta manera tienes los datos pero no tienes la base de datos abierta.

OK?? Bueno ya dirás como te va,
  #3 (permalink)  
Antiguo 11/07/2005, 02:55
 
Fecha de Ingreso: marzo-2005
Mensajes: 122
Antigüedad: 19 años, 2 meses
Puntos: 0
Pregunta error de pila

Gracias por tu respuesta.

Lo de cerrar la conexion ya lo hago, pero me da error de pila igual.

por cada conexion que abro cojo un fichero nuevo de conexion. Esto no se si está bien echo. y al final de la funcion cierro todas las conexiones.
Código:
conn.connectionstring = <cadena de conexión>
conn.open()

conn2.connectionstring = <cadena de conexión>
conn2.open()

conn3.connectionstring = <cadena de conexión>
conn3.open()

Me puedes poner un ejemplo del dataset. Igual me resultaría más ligero y no me daría problemas de tantas conexiones.

Me interesaría llenar un dataset con una tabla o varias y estando desconectado hacer consultas sobre el dataset. o tambien poder recorrerlo
do until eof por ejemplo.

Como sería en código?
  #4 (permalink)  
Antiguo 11/07/2005, 04:29
 
Fecha de Ingreso: mayo-2005
Mensajes: 122
Antigüedad: 19 años
Puntos: 0
Respuesta ...

El código sería tal que así:

Dim da As SqlClient.SqlDataAdapter

sql = "SELECT * FROM TABLA"

da = New SqlClient.SqlDataAdapter(sql, conn)
da.Fill(ds, "Prueba")
da = Nothing

Fíjate, que haces un .Fill, esto lo que hace es ponerte la estructura y los datos que hayas obtenido con el sql de arriba en la tabla del dataset "Prueba". Si luego quisieras añadir mas tablas en este dataset pues vuelves a hacer .Fill en el mismo dataset ...

Y luego puedes ir recorriendo las filas del dataset así:

dim fila as datarow
for i = 0 to ds.tables("Prueba").rows.count - 1

fila = ds.tables("Prueba").rows(i)

Entonces ahora en fila tienes los datos correspondientes a la fila i de esta tabla y puedes ir jugando con los nombres de los campos, por ejemplo:

if fila("Id")="1" then
.....

next

Puedes hacer este bucle con todas las tablas que tengas cargadas, bueno espero que te sirva.
  #5 (permalink)  
Antiguo 11/07/2005, 05:02
 
Fecha de Ingreso: mayo-2005
Mensajes: 122
Antigüedad: 19 años
Puntos: 0
El código sería tal que así:

Dim da As SqlClient.SqlDataAdapter

sql = "SELECT * FROM TABLA"

da = New SqlClient.SqlDataAdapter(sql, conn)
da.Fill(ds, "Prueba")
da = Nothing

Fíjate, que haces un .Fill, esto lo que hace es ponerte la estructura y los datos que hayas obtenido con el sql de arriba en la tabla del dataset "Prueba". Si luego quisieras añadir mas tablas en este dataset pues vuelves a hacer .Fill en el mismo dataset ...

Y luego puedes ir recorriendo las filas del dataset así:

dim fila as datarow
for i = 0 to ds.tables("Prueba").rows.count - 1

fila = ds.tables("Prueba").rows(i)

Entonces ahora en fila tienes los datos correspondientes a la fila i de esta tabla y puedes ir jugando con los nombres de los campos, por ejemplo:

if fila("Id")="1" then
.....

next

Puedes hacer este bucle con todas las tablas que tengas cargadas, bueno espero que te sirva.
  #6 (permalink)  
Antiguo 11/07/2005, 05:11
 
Fecha de Ingreso: marzo-2005
Mensajes: 122
Antigüedad: 19 años, 2 meses
Puntos: 0
Pregunta error de pila

Una cosilla más. si ahora quisiera meter otra consulta en el dataset ...

¿tendría que crear otra conexion a la base de datos?

Por que si es así me va a pasar igual que me pasaba que se saturan las conexiones en el buffer aunque las cierre no se por que.
Hago muchas consultas a la base de datos y recorro algunas de ellas y dentro de ellas hago más consultas entonces busco un método para que no me pase lo de la pila.


¿como haría para hacer una consulta en ese dataset en la tabla pruebas y meter el resultado en otro dataset "me imagino", o actualizar ese dataset con la nueva consulta. ¿como sería?



Gracias
  #7 (permalink)  
Antiguo 11/07/2005, 05:43
 
Fecha de Ingreso: mayo-2005
Mensajes: 122
Antigüedad: 19 años
Puntos: 0
Mas ...

Me comentas en la respuesta a mi solución, que vas abriendo varias conexiones según te vayan haciendo falta, no te estrañe que sea esto lo que te está saturando la base de datos, y alomejor te da ese error. Porqué cuenta que lo de la pila te puede dar con cualquier otro error en .net, mira una vez que tienes los datos cargados en el dataset, para seleccionar solamente unos datos de esas tablas, se hace lo que se dice un dataview, de esta forma:

Dim dvPruebas As DataView
Dim Fila As DataRowView

dvPruebas = New DataView(ds.Tables("Pruebas"))
dvPruebas.RowFilter = "Id='1'"

for i=0 to dvPruebas.Count -1

Fila = dvPruebas.Item(0)

Identificacion = Fila("Id")

next

El RowFilter viene a ser como un SELECT ... en este ejemplo que te he puesto solo he puesto Id='1' pero podrías poner:

dvPruebas.RowFilter = "Id='1' And Nombre = 'Pepe'" ..... etc

Esto lo podrás hacer con todas las tablas que tengas en el mismo dataset, siempre y cuando, claro está, cambiando el nombre de la tabla, jeje.

Mira a ver si te sirve, si no me dices algo.
  #8 (permalink)  
Antiguo 11/07/2005, 05:47
 
Fecha de Ingreso: mayo-2005
Mensajes: 122
Antigüedad: 19 años
Puntos: 0
Se me olvidaba ...

Evidentemente todas las filas que te devuelva el rowfilter puedes añadirlas a otro dataset ...
  #9 (permalink)  
Antiguo 11/07/2005, 05:51
 
Fecha de Ingreso: marzo-2005
Mensajes: 122
Antigüedad: 19 años, 2 meses
Puntos: 0
Pregunta error de pila

Gracias por tus claras respuestas.

Y sabes como puedo hacer con lo de las conexiones? es que tengo que abrir muchas. Como puedo ir limpiando el buffer. Yo cierro las conexiones y a los datareaders les paso nothing. pero con esto no limpia el buffer.


Un Saludo
  #10 (permalink)  
Antiguo 11/07/2005, 06:04
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 4 meses
Puntos: 9
En mi opinion, si vas a usar la misma conexion para tus consultas, debes ir abriendo y cerrando el mismo objeto connection.
Después de la última, haces un Dispose(): conn.dispose()
Con esto, pasas el objeto a la garbage collection. Ella se encargará de limpiar el objeto.

Saludos!
__________________
..:: moNTeZIon ::..

Última edición por moNTeZIon; 11/07/2005 a las 08:01
  #11 (permalink)  
Antiguo 11/07/2005, 06:19
 
Fecha de Ingreso: marzo-2005
Mensajes: 122
Antigüedad: 19 años, 2 meses
Puntos: 0
pila

Ok. Muchas gracias x tu tiempo.

Voy probar todo esto y cambiar mi método de trabajo

Un Saludo.

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 00:10.