Problema con ADO
Saludos.
Tengo un problema persistente en una aplicación en el momento de volver a generar índices en las tablas.
Estoy trabajando con VB 6.0 y tablas FOXPRO
Para la conexión utilizo :
Public Function AbrirConexion_I(ByRef cnn As ADODB.Connection)
With cnn
.ConnectionString = "DRIVER={Microsoft Visual FoxPro Driver};" & _
"SERVER=;" & _
"SOURCETYPE=DBF;" & _
"SOURCEDB=" & RutaFichero & ";" & _
"UID=;" & _
"PWD=;" & _
"OPTION=" & 1 + 2 + 8 + 32 + 2048 + 163841
.Open
End With
End Function
Para el recordset :
Public Sub AbrirRecorset_F(ByRef rst As ADODB.Recordset, ssql As String)
With rst
.ActiveConnection = frmMenus.mCnn_F
.CursorLocation = adUseServer
.CursorType = adOpenStatic
.LockType = adLockPessimistic
.Open ssql
End With
End Sub
(donde ssql es la cadena "SELECT * FROM TABLA WHERE ... ORDER BY ... ")
Para re-indexar las tablas utilizo DAO, ya que no he encontrado forma alguna de hacerlo con ADO :
Set mDbs_Index = OpenDatabase(RutaFichero, False, False, "Foxpro 2.6;")
Ó
Set mDbs_Index = OpenDatabase(RutaFichero, True, False, "Foxpro 2.6;")
1) primero elimino el indice existente
mDbs_Index.Execute "DROP INDEX " & Nombre_Indice_Tabla & " ON " & Tabla_Actual
2) luego lo genero de nuevo
mDbs_Index.Execute "CREATE INDEX " & Nombre_Indice_Tabla & " ON " _
& Tabla_Actual & " (" & Nombre_Indice_Tabla & ");"
El caso es que cuando la aplicación no ha abierto ningún recordset la creación de indices se efectua correctamente, pero cuando en algún momento la aplicación ha abierto algún recodset, se produce un error 3051 en tiempo ejecución. "el motor de base de datos está siendo utilizado por otro usuario o no tiene permisos"
He probado utilizar otro cursores y tipos como
adLockReadOnly
adLockOptimistic
por entender que la tabla se pudiera abrir de modo exclusivo.
También todos los tipos de cursores
adOpenForwardOnly
adOpenKeySet, etc.
También a la hora de cerrar el recordset libero de la memoria el mismo utilizando:
Public Sub CerrarRecorset(ByRef rst As ADODB.Recordset)
rst.Close
Set rst = Nothing
End Sub
y siempre la misma historia, si arranco la aplicación y voy directamente a indexar todo Ok en caso contrario el jodido error.
Cierto es que en muchas páginas se indica que cada entorno con sus tablas y que es imposible funcionar con VB y FOXPRO.
Pues bien, mi aplicación funciona correctamente exceptuando este punto y a la altura en que está me vuelvo loco de pensar que tenga que empezar de nuevo.
Ah! me dejaba, estoy funcionando con MDAC 2.81 Y en XP, también lo he probado en W98 se y W2000 y lo mismo de lo mismo.
Se puede reindexar de otra forma ?
Agradezco de antemano cualquier ayuda o indicación que se me pueda ofrecer.
Felicidades por el funcionamiento del foro.
Tengo un problema persistente en una aplicación en el momento de volver a generar índices en las tablas.
Estoy trabajando con VB 6.0 y tablas FOXPRO
Para la conexión utilizo :
Public Function AbrirConexion_I(ByRef cnn As ADODB.Connection)
With cnn
.ConnectionString = "DRIVER={Microsoft Visual FoxPro Driver};" & _
"SERVER=;" & _
"SOURCETYPE=DBF;" & _
"SOURCEDB=" & RutaFichero & ";" & _
"UID=;" & _
"PWD=;" & _
"OPTION=" & 1 + 2 + 8 + 32 + 2048 + 163841
.Open
End With
End Function
Para el recordset :
Public Sub AbrirRecorset_F(ByRef rst As ADODB.Recordset, ssql As String)
With rst
.ActiveConnection = frmMenus.mCnn_F
.CursorLocation = adUseServer
.CursorType = adOpenStatic
.LockType = adLockPessimistic
.Open ssql
End With
End Sub
(donde ssql es la cadena "SELECT * FROM TABLA WHERE ... ORDER BY ... ")
Para re-indexar las tablas utilizo DAO, ya que no he encontrado forma alguna de hacerlo con ADO :
Set mDbs_Index = OpenDatabase(RutaFichero, False, False, "Foxpro 2.6;")
Ó
Set mDbs_Index = OpenDatabase(RutaFichero, True, False, "Foxpro 2.6;")
1) primero elimino el indice existente
mDbs_Index.Execute "DROP INDEX " & Nombre_Indice_Tabla & " ON " & Tabla_Actual
2) luego lo genero de nuevo
mDbs_Index.Execute "CREATE INDEX " & Nombre_Indice_Tabla & " ON " _
& Tabla_Actual & " (" & Nombre_Indice_Tabla & ");"
El caso es que cuando la aplicación no ha abierto ningún recordset la creación de indices se efectua correctamente, pero cuando en algún momento la aplicación ha abierto algún recodset, se produce un error 3051 en tiempo ejecución. "el motor de base de datos está siendo utilizado por otro usuario o no tiene permisos"
He probado utilizar otro cursores y tipos como
adLockReadOnly
adLockOptimistic
por entender que la tabla se pudiera abrir de modo exclusivo.
También todos los tipos de cursores
adOpenForwardOnly
adOpenKeySet, etc.
También a la hora de cerrar el recordset libero de la memoria el mismo utilizando:
Public Sub CerrarRecorset(ByRef rst As ADODB.Recordset)
rst.Close
Set rst = Nothing
End Sub
y siempre la misma historia, si arranco la aplicación y voy directamente a indexar todo Ok en caso contrario el jodido error.
Cierto es que en muchas páginas se indica que cada entorno con sus tablas y que es imposible funcionar con VB y FOXPRO.
Pues bien, mi aplicación funciona correctamente exceptuando este punto y a la altura en que está me vuelvo loco de pensar que tenga que empezar de nuevo.
Ah! me dejaba, estoy funcionando con MDAC 2.81 Y en XP, también lo he probado en W98 se y W2000 y lo mismo de lo mismo.
Se puede reindexar de otra forma ?
Agradezco de antemano cualquier ayuda o indicación que se me pueda ofrecer.
Felicidades por el funcionamiento del foro.
