none
Error al Cargar datos con ADO en Visual .net 2005 RRS feed

  • 问题

  • Hola, les pido ayuda con esta porcion de codigo. Lo hice en Visual .net 2005. Tengo un archivo de excel en el que guardo un registro que se llama "Mayoristas". Puedo leerlo sin problemas pero cuando trato de cargar informacion en un campo me da el error:

    El Recordset actual no admite actualizaciones. Puede ser una limitación del proveedor o del tipo de bloqueo seleccionado.

    Espero puedan ayudarme, se que por defecto el archivo se abre como solo lectura pero no se donde es que se especifica que sea modificable.

    Gracias

    Ahi va el código:

    Dim strquery As String
    Dim cn As ADODB.Connection
    cn = New ADODB.Connection
    With cn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Data Source=D:\archivo.xls;" & _
    "Extended Properties=Excel 8.0;"
    .Open()
    End With

    strquery = "SELECT * FROM [Hoja1$]"
    rs = cn.Execute(strquery)

    rs.MoveFirst()
    rs.addnew ' AQUI ES DONDE DA EL ERROR
    rs.Fields("mayoristas").Value = "prueba"
    2011年7月13日 1:28

答案

  • "Diego_2011" escribió:

    > Puedo leerlo sin problemas pero cuando trato de cargar
    > informacion en un campo me da el error:
    >
    > El Recordset actual no admite actualizaciones. Puede ser una
    > limitación del proveedor o del tipo de bloqueo seleccionado.
    >
    > rs = cn.Execute(strquery)

    Porque el tipo de Recordset que has abierto es de SÓLO LECTURA, es decir, el valor de su propiedad LockType es adLockReadOnly.

    Para que sea actualizable, tienes que abrir el objeto Recordset de la siguiente manera:

           Dim cn As ADODB.Connection = New ADODB.Connection
            With cn
                .CursorLocation = ADODB.CursorLocationEnum.adUseClient
                .Provider = "Microsoft.Jet.OLEDB.4.0"
                .ConnectionString = "Data Source=D:\archivo.xls;" & _
                                    "Extended Properties=Excel 8.0;"
                .Open()
            End With

            Dim strquery As String = "SELECT * FROM [Hoja1$]"

            Dim rs As New ADODB.Recordset

            rs.Open(strquery, cn, ADODB.CursorTypeEnum.adOpenStatic, _
                    ADODB.LockTypeEnum.adLockOptimistic, ADODB.CommandTypeEnum.adCmdText)

            rs.MoveFirst()
            rs.addnew()
            rs.Fields("mayoristas").Value = "prueba"

            rs.Update()
            rs.Close()
            cn.Close()

            rs = Nothing
            cn = Nothing

    Pero mejor será que utilices los objetos de ADO .NET.


    Un saludo


    Enrique Martínez
      [MS MVP - VB]


    • 已标记为答案 Diego_2011 2011年7月14日 13:52
    2011年7月13日 16:32
    版主

全部回复

  • pero porque usas ADODB

    porque no usas ADO.NET  para conectarte a excel y actualizar

     

    Cómo usar ADO.NET para recuperar y modificar registros en un libro de Excel con Visual Basic .NET

    Reading and Writing Excel Spreadsheets Using ADO.NET C# DbProviderFactory

    Leer un fichero Excel desde ASP.NET con ADO.NET

     

    Connection strings for Excel

    Connection strings for Excel 2007

     

    Read Data from Excel using OLEDB in VB.NET 2005

    como veras para actualziar podrias ahcer un UPDATE de sql para aplciar la operacion

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    2011年7月13日 1:40
  • "Diego_2011" escribió:

    > Puedo leerlo sin problemas pero cuando trato de cargar
    > informacion en un campo me da el error:
    >
    > El Recordset actual no admite actualizaciones. Puede ser una
    > limitación del proveedor o del tipo de bloqueo seleccionado.
    >
    > rs = cn.Execute(strquery)

    Porque el tipo de Recordset que has abierto es de SÓLO LECTURA, es decir, el valor de su propiedad LockType es adLockReadOnly.

    Para que sea actualizable, tienes que abrir el objeto Recordset de la siguiente manera:

           Dim cn As ADODB.Connection = New ADODB.Connection
            With cn
                .CursorLocation = ADODB.CursorLocationEnum.adUseClient
                .Provider = "Microsoft.Jet.OLEDB.4.0"
                .ConnectionString = "Data Source=D:\archivo.xls;" & _
                                    "Extended Properties=Excel 8.0;"
                .Open()
            End With

            Dim strquery As String = "SELECT * FROM [Hoja1$]"

            Dim rs As New ADODB.Recordset

            rs.Open(strquery, cn, ADODB.CursorTypeEnum.adOpenStatic, _
                    ADODB.LockTypeEnum.adLockOptimistic, ADODB.CommandTypeEnum.adCmdText)

            rs.MoveFirst()
            rs.addnew()
            rs.Fields("mayoristas").Value = "prueba"

            rs.Update()
            rs.Close()
            cn.Close()

            rs = Nothing
            cn = Nothing

    Pero mejor será que utilices los objetos de ADO .NET.


    Un saludo


    Enrique Martínez
      [MS MVP - VB]


    • 已标记为答案 Diego_2011 2011年7月14日 13:52
    2011年7月13日 16:32
    版主
  • Funcionó perfecto!. Te agradezco muchisimo la ayuda!.  Voy a tener en cuenta tu consejo y el de  Leandro con respecto a usar ADO.NET. Pero necesitaba resolver esto rapido

     

    Muchas Gracias nuevamente, un saludo!!

    2011年7月14日 0:30
  • "Diego_2011" escribió:

    > Funcionó perfecto!. Te agradezco muchisimo la ayuda!

    Me alegro. Pero si la respuesta te ha sido útil, no olvides marcarla como satisfactoria. ¿De acuerdo?

     


    Enrique Martínez
      [MS MVP - VB]

    2011年7月14日 6:31
    版主
  • Me podrías ayudar con este por favor, me genera el mismo error

    Dim conn As ADODB.Connection
        Dim MiConexion
        Dim Rs As ADODB.Recordset
        Dim MiBase As String
        
        MiBase = "Produccion.accdb"
        
        Set conn = New ADODB.Connection
        MiConexion = Application.ThisWorkbook.Path & Application.PathSeparator & MiBase
        
        With conn
        
            .Provider = "Microsoft.ACE.OLEDB.12.0"
            .Open MiConexion
        
        End With
        
        Set Rs = New ADODB.Recordset
        Rs.CursorLocation = adUseServer
            Rs.Open Source:="Permisos", _
            ActiveConnection:=conn, _
            CursorType:=adOpenDynamic, _
            LockType:=adLockOptimistic, _
            Options:=adCmdTable

    2022年9月1日 21:49