Error 3251
El recorset actual no admite actualizaciones, puede ser una limtiacion del proveedor o del tipo de bloqueo seleccionado.
Resulta que quiero usar el mismo programa con la misma base de datos bajo una red, y modificar la base de datos desde 2 pcs bajo la misma red, entonces me tira ese error. Tiene solución? o ya habría que usar algo mas sofisticado que el ADO?
Buenas.
O estás abriendo el recordset en modo de sólo lectura, o bien la consulta que cargas en el recordset no permite actualizar la bd.
Saludos.
Hola gracias por responder. Mira con esto abro la base de datos en el modulo:
Public cn As ADODB.Connection
Public Function Conectar() As Boolean
Conectar = False
Dim strcon As String
strcon = "Provider = Microsoft.Jet.OLEDB.4.0;" & _
"Data source =" & App.Path & "\Base.mdb" ' Mi dirección personal de mi base de datos
On Error GoTo xd
Set cn = New ADODB.Connection
cn.Open strcon
Conectar = True
Exit Function
xd: MsgBox "Conexión fallida.", vbCritical, "CRITICAL ERROR FATAL"
End
End Function
Y con esto escribo cada vez que quiero actualizarla:
----------------------------------------------
Dim rs As ADODB.Recordset
If Not Conectar() Then Exit Sub
Set rs = New ADODB.Recordset
rs.AddNew
rs!codigo = txtCod
rs.Close
Set rs = Nothing
Desconectar
Si en una PC esta abierta la base de datos, y simultaneamente en la otar quiero escribir en la misma base, me tira el error arriba mencionado.
Buenas.
¿Podrías poner la parte de código que omites? Es decir, lo que te comenté en un principio: la apertura del recordset y la consulta a la bd con la que montas el recordset. Además de ese code que veo que falta, no estás haciendo un update, cierras el rs directamente.
Un saludo.
Modulo:
Public CNN As New ADODB.Connection
Public RST As New ADODB.Recordset
Public PRV As String, SQL1 As Variant
Function asg()
PRV = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & _
App.Path & "\Base.mdb" & ";Persist Security Info=False"
End Function
Function opDB()
If CNN.State = 0 Then
CNN.Open PRV
End If
End Function
Function openRS()
If CNN.State = 1 Then
RST.Open SQL1, CNN, adOpenStatic
End If
End Function
Function cerrar()
If CNN.State = 1 Then
CNN.Close
End If
End Function
Otro modulo:
Public cn As ADODB.Connection
Public Function Conectar() As Boolean
Conectar = False
Dim strcon As String
strcon = "Provider = Microsoft.Jet.OLEDB.4.0;" & _
"Data source =" & App.Path & "\Base.mdb" ' Mi dirección personal de mi base de datos
On Error GoTo xd
Set cn = New ADODB.Connection
cn.Open strcon
Conectar = True
Exit Function
xd: MsgBox "Conexión fallida.", vbCritical, "CRITICAL ERROR FATAL"
End
End Function
Public Sub Desconectar()
On Error Resume Next
cn.Close
End Sub
Formulario:
Dim rs As ADODB.Recordset
If Not Conectar() Then Exit Sub
Set rs = New ADODB.Recordset
rs.Open ("Articulos"), cn, adOpenKeyset, adLockOptimistic
rs.AddNew
'Base de datos / programa
rs!Codigo = txtcod
rs.Update
rs.Close
Set rs = Nothing
Pues es que no es posible es como desear abrir 2 veces el mismo archivo y modificar uno y el otro y que se guarden los cambios.
Para lograr esto ocupas que para cada cosa que desees hacer abra la conexion, hacer lo que deseas y al final cerrar la conexion, para asi este libre para luego si la otra PC quiere acceder a la DB lo logre y no obtenga ese error.
Bueno creo que esto podria ser no estoy 100% seguro ya que nunca he trabajado con un BD de ese tipo.
Buenas.
@s00rk, las BBDD deben permitir accesos concurrentes a los datos, y las ediciones de los mismos se controlan mediante bloqueos a nivel de registro o bien a nivel de bloque de registros (depende del SGBD) y eso se puede interceptar y controlar en el código de la app, para que ésta no pete.
@MandingoPC, en el otro equipo donde abres la bd, no lo estarás haciendo en modo exclusivo, ¿no?
Prueba a abrir el rs, en vez de con "adOpenKeyset", con "adOpenDynamic".
Saludos.
Para acceder a una BDD por red tendrás que migrar a otro sistema tu BDD, access no es viable para estos casos... para modificar tu BDD solo necesitas una conexión via ODBC.
Dulces Lunas!¡.
Buenas.
Cita de: BlackZeroX (Astaroth) en 7 Mayo 2012, 18:49 PM
Para acceder a una BDD por red tendrás que migrar a otro sistema tu BDD, access no es viable para estos casos... para modificar tu BDD solo necesitas una conexión via ODBC.
Permíteme que discrepe con eso que dices. Una bd en Access no es la mejor elección ni mucho menos para utilizar en un entorno de red, eso está claro. Pero de ahí a que no se pueda utilizar en red, va un mundo.
Saludos.
Cita de: BlackZeroX (Astaroth) en 7 Mayo 2012, 18:49 PM
access no es viable para estos casos...
Jamas dije que NO se puede, hay que aprender a leer!¡.
Dulces Lunas!¡.
Buenas.
Cita de: BlackZeroX (Astaroth) en 7 Mayo 2012, 18:49 PM
Para acceder a una BDD por red tendrás que migrar a otro sistema tu BDD, access no es viable para estos casos... para modificar tu BDD solo necesitas una conexión via ODBC.
Cita de: BlackZeroX (Astaroth) en 8 Mayo 2012, 05:22 AM
Jamas dije que NO se puede, hay que aprender a leer!¡.
Si con "no es viable" querías decir que es inviable, una de las acepciones de esta palabra, según la RAE, es "Que no tiene posibilidades de llevarse a cabo.", que creo que equivale a decir "NO se puede".
Tan importante es saber lo que se lee, como saber expresar correcta y explícitamente lo que se trata de transmitir.
Saludos.
Da igual, el secreto como dije esta en las ODBC (http://sestud.uv.es/manual.esp/gestion/gestion4.htm) StringConection Access 2007 (http://www.connectionstrings.com/access-2007), Access (http://www.connectionstrings.com/access), aun que yo optaría por cambiar de access a otro sistema.
Huy ya meti la pata, el problema era otro ;D jajaja.
Edit.
¿Tu tabla contiene una clave foránea?, en ocasiones me a sucedido que por el hecho de no tener una clave foránea no me actualiza mis registros.
Dulces Lunas!¡.
Buenas.
Cita de: BlackZeroX (Astaroth) en 8 Mayo 2012, 10:01 AM
¿Tu tabla contiene una clave foránea?, en ocasiones me a sucedido que por el hecho de no tener una clave foránea no me actualiza mis registros.
@BlackZeroX, ¿te refieres a que tenga una clave foránea y que tenga un valor no válido o inexistente en la tabla a la que apunta esa clave? Efectivamente podría ser otro motivo de no poder actualizar el rs, ( si se han definido relaciones entre tablas y existe integridad referencial). Pero creo que no daría ese nº de error, creo que daría el 3201.
Saludos.
¿ abris la conexion a la base y te desconectas cada ves que abris un recordset ? eso esta mal, la conexion se habre solo una ves y no se toca mas hasta que se cierra el programa.
tampoco uses "As New" , primero declara con "As" y despues con "Set", sino te puede traer problemas y aparte es malo en performance.
aprovecha la potencia de ADO y deja de usar los metodos de los recordset, usa SQL puro, o sea dejas de usar los metoods .AddNew, .Edit y .Delete y los reemlazas por instrucciones y comandos SQL (INSERT INTO, UPDATE o DELETE), para ejecutar esos comandos debes declarar una variable tipo ADODB.Command, y busca en internet sobre como usar SQL que es facil.
y como te dijeron, Access es pobre, se puede usar tranquilamente, puede tener millones de registros, eso depende el volumen de datos a manejar, pero si queres mejor performacne, MySQL o SQL Server son los candidatos.
PD: tambien puede ser un problema de permisos, fijate que el archivo .mdb de la base de access tenga permisos de escritura, sino nunca te va a dejar agregar registros.
saludos.