Problema al abrir un recordset ADO

A ver, mi problema es que tengo el Visual Basic 6.0 y he creado una aplicación que maneja recordsets ADO, los cuales me dan bastantes problemas que poco a poco he ido resolviendo menos uno. Resulta que al iniciar la aplicación, creo una conexión a una base de datos remota del tipo IBM/DB2 sobre linux, hasta aquí todo correcto (la conexión va bien), después abro un recordset con el método OPEN sobre esa conexión y me lo abre (propiedad STATE a 1) pero no lee nada (propiedad RECORDCOUNT a 0). Si abro el recordset utilizando el método execute de la cnoexión y devolviendo la select a ese recordset todavía va peor (propiedad RECORDCOUNT A -1). Estoy desesperado, he probado todos los tipos de bloqueo, cursores, etc... Y el que mejor funciona es adOpenKeySet con bloqueo optimista. Me ocurre lo mismo con ADO 2.5 y 2.7. La tabla que intento abrir solo tiene un registro y esta es la instrucción que estoy utilizando:
ModuloBD. RcEntorno. Open consulta, ModuloBD. Cnaux, adOpenKeyset, adLockBatchOptimistic, adCmdText
Y esta es la puse probando con el execute, pero que ya os digo que va peor:
Set ModuloBD.rcEntorno = ModuloBD.cnaux.Execute("SELECT * FROM ALMACEN.TBLENTORNO", , adCmdText)
Si me puedes ayudar.

10 Respuestas

Respuesta
1
Bien... que el recordcount te de 0 esta bien... lo que tienes que hacer es mover el puntero del RecordSet hasta el final de la tabla y luego volverlo al principio, así carga la cantidad de registros de la tabla.
Tablarecordset. MoveLast
Tablarecordset. MoveFirst
La que esta bien es la primera opción...
De cualquier forma ejecuta el programa en modo paso a paso y abre unna ventana de Inmediato y ahí chequea mediante código si existe ese registro que dices esta sólito
en la ventana de Inmnediato debes escribir algo así:
? Tabla! Campo
Prueba y comentame
Gracias, eso ya lo probé y no funcionaba. De todas formas he conseguido arreglarlo poniendo la propiedad "CursorLocation" de la conexión con valor "adUseClient". Aún así agradezco tu colaboración y te pongo un 4.
Respuesta
1
Honestamente, no tengo idea.
Tu instrucción esta bien, yo la he probado con una BD hecha en Access y otra en SQL y funcionan.
No uso linux, pero le envíe el código a un amigo que si usa linux y sabe más de eso.
Y me dice que también le funciona... lo único que le cambio fue el nombre de la bd, user, password y nombre de la tabla...
Pero que si le funciono, la verdad no sabría decirte que es...
Sorry.
Gracias, lo he resuelto poniendo la propiedad "CursorLocation" de la conexión con valor "adUseClient" antes de hacer el open de la propia conexión. Aún así agradezco tu colaboración y re pongo un 5. Gracias.
Respuesta
1
Yo uso lo siguiente:
'en un modulo
Global Conn As ADODB.Connection
' la conexsion con dsn
Conn.ConnectionString = "DSN=nombredsn"
' la conexsion con access
Conn.ConnectionString = "PROVIDER=Microsoft.Jet.OLEDB.4.0;PERSIST SECURITY INFO=FALSE;Data Source=" & App.Path & "\base de datos\mibase.mdb"
' la conexsion con sql
Conn.ConnectionString = "Provider=SQLOLEDB.1;" & _
"Persist Security Info=False;" & _
"User ID=sa;Initial Catalog=MiBaseenSql;" & _
"Data Source=SERVIDOR1"
' en fin la que uses, y la abrimos
Conn.Open
' uso este procedimiento para conseguir los recordset
Public Sub Consigue_Rs(RSLOCAL As ADODB.Recordset, RsiLocal As String)
If RSLOCAL.State = 1 Then
RSLOCAL.Close
End If
Set RSLOCAL.ActiveConnection = Conn
RSLOCAL.CursorLocation = adUseClient
RSLOCAL.LockType = adLockOptimistic
RSLOCAL.Source = RsiLocal
RSLOCAL.Open
End Sub
' en mi formulario
Dim MiRs As new adodb.Recordset
dim rsi as string
rsi = "SELECT * FROM TABLA"
consigue_rs MiRs, rsi
'me funciona de maravilla ya que todos los recordsets los abres en un solo sitio
'creo que debes tener cuidado con conn.cursorlocation
'pruebalo y ya me diras
'
Respuesta
1
Antes de entrar en temas más complejos intenta a hacer lo mismo desde un adodc, esos que tienen representación gráfica en pantalla, no con un recordset creado en ejecución.
Adodc1.connectionstring = cnaux
adodc1.recordsource = consulta
adodc1.refresh
msgbox Trim(Adodc1.Recordset.Recordcount)
SI esto no funciona tendrás que hacer un "Select Count(*) form Almacen.Tblentorno" y con eso te devolverá el numero de registros en el field(0) del recordset
Gracias por responder tan rápido pero creo que no has captado lo que quería preguntarte. Lo que necesito es abrir el recordset y recorrer el primer y único registro que tiene para leer sus datos. Lo de la propriedad recordcount la he utilizado para saber si lo había abierto bien o no. De hecho si hago un MoveFirst, no me funciona porque no recupera nada. Gracias.
A veces la propiedad recordcount de un recordset ADO creado en tiempo de ejecución no devuelve lo que se espera, generalmente devuelve -1 pero eso no quiere decir que el recordset no tenga nada cargado para saber si tiene algo deberías hacer un rcEntorno. Movefirst y luego msgbox rcEntorno. Fields(0)
Si da error o si devuelve null es que no hay registros.
Por eso te dije lo del adodc, ya que la propiedad recordcount del Adodc funciona bastante mejor que la del adodb. Recordset
Las tres formas que yo conozco de cargar un ado son las dos que tu explicas más la que te puse yo en la respuesta anterior, si aun así no te funciona, entonces deberías revisar la cadena de conexión, los permisos sobre las tablas, la consulta SQL y demás parametrizaciones o incluso la conexión odbc que usas. Instala el ultimo MDAC. Si revisando esto no encuentras el error mandame el código fuente pa ver si le encuentro algo.
Respuesta
1
La verdad es que me has intrigado, este fallo que te esta dando me pasaba a mi hace tiempo, sin embargo con el tipo de bloqueo y de cursor que me dices la verdad es que debería de ir bien, solo se me ocurre que mires a ver donde esta el cursor, es decir si la propiedad CursorLocation de tu objeto Command esta "adUseClient" o a "adUseServer", cambia esta propiedad a ver que pasa, lo normal es que sea "adUseServer", es decir que el cursor este en memoria del servidor. Bueno espero que te sirva de algo.
Gracias, la verdad es que era eso, pero lo resolví hace tiempo. Solo tuve que poner la propiedad "CursorLocation" de la conexión con valor "adUseClient" antes de hacer el "Open" y todo iba a las mil maravillas. Eres uno de los pocos que ha sabido acertar je je, te lo agradezco con un 5 e incluyéndote en mi lista de favoritos. Gracias de nuevo.
Respuesta
1
Siento no poder serte de utilidad pero lo he mirado y no se cual es tu problema, aunque lo único que te puedo decir es que cuando hago una "select" en vez de poner el "adCmdText", pongo "adCmdUnknown", mira a ver si te funciona, a mi si.
De nuevo siento no poder ayudarte mejor.
Respuesta
1
Que son los objetos ModuloBD y rcEntorno, ModuloBD. ¿Cnaux?
Parece que creaste una clase de conexión o algo así.
¿Cómo te estas conectando a la base de datos?, ¿Con ODBC?
Nunca he trabajado con DB2 ni con LINUX, he trabajado con Microsoft SQL Server y con Access.
Te envío un ejemplo de una conexión con Access y un recordset, cambiando el ConnectionString a la base de datos en LINUX y dejando lo demás igual no tiene por que fallar.
dim cnn As New ADODB.Connection
dim rs as New ADODB.Recordset
cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\mibase.mdb"
cnn.CursorLocation = adUseClient
Cnn. Open
Rs. Open "SELECT * FROM MITABLA", cnn, adOpenStatic, adLockOptimistic, adCmdText
Otra prueba que puedes hacer es cambiar solo tu string de conexión a una base access o SQL Server y ver que pasa.
Respuesta
1
Bueno no sé que decirte. Para que una consulta funcione correctamente pocas cosas hacen falta, comprobar el nombre de la base de datos, el nombre de la tabla y el del campo. Eso si yo normalmente antes de comenzar a utilizar la conexión y sobre todo si voy a utilizar la propiedad RECORDCOUNT, lleno el recordset moviéndome hasta el último registro (aunque solo tengas 1). Lo siento, es lo único que se me ocurre, tendrás que buscar soluciones por otro lado.
Gracias, de todas formas lo he podido solucionar poniendo la propiedad "CursorLocation" de la conexión con valor "adUseClient" antes de abrirla. Aún así agradezco tu colaboración y te pongo un 4. Gracias.
Respuesta
1
¿Bufff qué complicado te lo haces no?, aver primero el recordcount no funciona, empecemos por ahí, así que no te fie de lo que te diga la propiedad esta
A ver lo que yo haría
¿Tienes la conexión vale?, le llamamos con
Pues en un botón pondría
Dim rs as new adodb.recordset
Dim sqlx as string
Sqlx="select * ...."
rs.open sqlx,con
If not rs.eof
while not rs.eof
Debug. Print rs("campo")
rs.movenext
Wend
end if
Prueba y si no me dices algo
Gracias. Lo he resuelto poniendo sencillamente la propiedad "CursorLocation" de la conexión con el valor adUseClient y me ha funcionado. De todas formas te agradezco mucho tu colaboración y te pongo un 4. Gracias de nuevo.
Respuesta
1
La verdad es que no suelo trabajar en entornos linux y mucho menos con bd. Pero intenta con el modo adOpenForwardOnly que es el que menos problemas suele dar y evita el execute trátalo mejor con open y close
Gracias. Lo he podido resolver poniendo la propiedad "CursorLocation" de la conexión con valor "adUseClient". Aún así te agradezco tu colaboración y te pongo un 4. Gracias.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas