Visual Basic Foro
Programación => Bases de Datos => Mensaje iniciado por: YAcosta en Septiembre 01, 2013, 03:03:52 am
-
No pude crear un titulo coherente me parece. Explico
Tengo una BD MySQL alojada en "la nube". Desde un aplicativo VB6 que consta de un solo formulario me conecto a ella insertando datos y leyéndolos.
A esta BD la atacamos desde 2 o 3 puntos diferentes, por tanto cambia. Estos cambios los vemos reflejados en un formulario que hace la consulta a la BD cada segundo. Hasta aquí todo bien.
Como era de esperarse un usuario (en este caso el dueño) se le ocurrió mover el formulario y este se colgaba naturalmente en la parte donde el aplicativo hace la consulta a la BD y de alli se le ocurrio que no desea que se cuelgue porque ademas el quiere interactuar con otros controles dentro de ese formulario.
Pregunta ¿Es posible que la consulta a la BD se realice como "en segundo plano" para que el formulario no se cuelgue?.
Agrego ademas que la tabla es apenas de un par de registros y 10 campos y esos 2 registros se actualizan constantemente, no estamos hablando de datos voluminosos.
Saludos
-
creo que por ahi hay un ejemplo de como hacer un thread en VB6 y meter un proceso para que no se cuelgue.
aca te dejo un ejemplo de una api basica que se usa para eso, pero no se si te sirve.
el ejemplo hace un bucle infinito, que sin esa api, el formulario no se podria mover.
Private Declare Function GetQueueStatus Lib "user32" (ByVal qsFlags As Long) As Long
Private Sub NewDoEvents()
If GetQueueStatus(255) <> 0 Then DoEvents
End Sub
Private Sub Command1_Click()
Dim i As Long
Do While 1 = 1
i = i + 1
NewDoEvents
Loop
End Sub
saludos.
-
A ver a ver, voy a probar, gracias Sebas.
EDITO: El código efectivamente funciona, se comprueba colgando sin el NewDoEvents, pero cuando lo aplico a mi proyecto no funca ya que igual se cuelga por un par de segundos, quizá no se pueda aplicar este tema a datos. He colocado el NewDoEvents en varios lugares, antes de la consulta, después de la consulta y efectivamente no participa de la orden que provoca el cuelgue, ej: cn.open, no hay forma de "meterlo dentro". ¿no habrá algo a nivel de ADO?
Ahora, como es una consulta a una BD alojada en un host al cual me conecto y desconecto por cada consulta. Por probar hice la conexión una sola vez (como lo hago normalmente en BDs locales) y en la parte cn.Open es donde el cuelgue es mayor (hasta 2 segundos), luego en cada "rs.Open "SELECT * FROM TABLA", db, 1, 1" sigue el cuelgue pero dura menos (medio segundo digamos) pero es igual de molesto. Por tanto al no ser una solución preferi hacer la conexión por cada consulta.
La única forma que se me ocurre para resolver esto es que sea otro el aplicativo que lea al host y ese otro aplicativo llene una BD local y leer desde ella... un tema en la sincronización de las consultas pero bueno no se me ocurre otra.
-
Hola en ADO, hay un parametro para los Open de las conexiones o Recordset. que se llama adAsyncExecute, no se si investigaste por ese lado.
Alguna vez jugue con eso, y cuando llamas al Open o Execute, inmediatamente sigue la ejecucion del programa, sin bloquearlo
Te paso un ejemplo del Help de Ado que supongo que puede servirte
Ejemplo de la propiedad State
Este ejemplo utiliza la propiedad State para mostrar un mensaje al mismo tiempo que se abren conexiones asíncronas y se ejecutan comandos asíncronos.
Public Sub StateX()
Dim cnn1 As ADODB.Connection
Dim cnn2 As ADODB.Connection
Dim cmdChange As ADODB.Command
Dim cmdRestore As ADODB.Command
Dim strCnn As String
'Abre dos conexiones asíncronas que muestran
'un mensaje mientras se conectan.
Set cnn1 = New ADODB.Connection
Set cnn2 = New ADODB.Connection
strCnn = "Provider=sqloledb;" & _
"Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
cnn1.Open strCnn, , , adAsyncConnect
While (cnn1.State = adStateConnecting)
Debug.Print "Abriendo la primera conexión..."
Wend
cnn2.Open strCnn, , , adAsyncConnect
While (cnn2.State = adStateConnecting)
Debug.Print "Abriendo la segunda conexión..."
Wend
'Crea dos objetos Command.
Set cmdChange = New ADODB.Command
cmdChange.ActiveConnection = cnn1
cmdChange.CommandText = "UPDATE títulos SET tipo = 'auto_ayuda' " & _
"WHERE tipo = 'psicología'"
Set cmdRestore = New ADODB.Command
cmdRestore.ActiveConnection = cnn2
cmdRestore.CommandText = "UPDATE títulos SET tipo = 'psicología' " & _
"WHERE tipo = 'auto_ayuda'"
'Ejecuta los comandos y muestra un mensaje al mismo tiempo.
cmdChange.Execute , , adAsyncExecute
While (cmdChange.State = adStateExecuting)
Debug.Print "Cambiando el comando en ejecución..."
Wend
cmdRestore.Execute , , adAsyncExecute
While (cmdRestore.State = adStateExecuting)
Debug.Print "Restaurando el comando en ejecución..."
Wend
cnn1.Close
cnn2.Close
End Sub
-
Excelente Waldo, gracias por el aporte. Voy a probarlo. Saludos
-
Excelente Waldo, gracias por el aporte. Voy a probarlo. Saludos
Si necesitas una respuesta al terminar la consulta, no te servirá...! Más sin embargo, si deseas ejecutar unas instrucciones SQL y continuar trabajando normal, esta es la mejor opción...!
Saludos
-
Excelente Waldo, gracias por el aporte. Voy a probarlo. Saludos
Si necesitas una respuesta al terminar la consulta, no te servirá...! Más sin embargo, si deseas ejecutar unas instrucciones SQL y continuar trabajando normal, esta es la mejor opción...!
Saludos
Asi es, no la necesito, solo necesito insertar desde el aplicativo nada mas y es desde web hacer la consulta, esa solucion va perfecto.
-
Si declaras el objeto with events hay un par de eventos, si mal no recuerdo hay un ExecuteComplete, que puede servir para saber cuando termino