Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: MandingoPC en 27 Abril 2012, 16:38 pm



Título: Error 3251 - Recordset en Red
Publicado por: MandingoPC en 27 Abril 2012, 16:38 pm
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?


Título: Re: Error 3251 - Recordset en Red
Publicado por: HdM en 27 Abril 2012, 16:53 pm
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.


Título: Re: Error 3251 - Recordset en Red
Publicado por: MandingoPC en 28 Abril 2012, 04:22 am
Hola gracias por responder. Mira con esto abro la base de datos en el modulo:

Public cn As ADODB.Connection


Código:
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:

----------------------------------------------

Código:
    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.


Título: Re: Error 3251 - Recordset en Red
Publicado por: HdM en 28 Abril 2012, 10:15 am
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.


Título: Re: Error 3251 - Recordset en Red
Publicado por: MandingoPC en 2 Mayo 2012, 00:04 am
Modulo:

Código:
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:

Código:
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:

Código:
 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


Título: Re: Error 3251 - Recordset en Red
Publicado por: s00rk en 4 Mayo 2012, 01:14 am
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.


Título: Re: Error 3251 - Recordset en Red
Publicado por: HdM en 5 Mayo 2012, 15:00 pm
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.


Título: Re: Error 3251 - Recordset en Red
Publicado por: BlackZeroX 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.

Dulces Lunas!¡.


Título: Re: Error 3251 - Recordset en Red
Publicado por: HdM en 7 Mayo 2012, 19:04 pm
Buenas.

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.


Título: Re: Error 3251 - Recordset en Red
Publicado por: BlackZeroX en 8 Mayo 2012, 05:22 am
access no es viable para estos casos...

Jamas dije que NO se puede, hay que aprender a leer!¡.

Dulces Lunas!¡.


Título: Re: Error 3251 - Recordset en Red
Publicado por: HdM en 8 Mayo 2012, 09:11 am
Buenas.

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.

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.


Título: Re: Error 3251 - Recordset en Red
Publicado por: BlackZeroX en 8 Mayo 2012, 10:01 am
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!¡.


Título: Re: Error 3251 - Recordset en Red
Publicado por: HdM en 8 Mayo 2012, 10:49 am
Buenas.

¿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.


Título: Re: Error 3251 - Recordset en Red
Publicado por: seba123neo en 10 Mayo 2012, 07:06 am
¿ 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.