none
Error: El proveedor 'Microsoft.ACE.OLEDB.12.0' no está registrado en el equipo local RRS feed

  • Pregunta

  • Buenos días, tengo un problema, estaba trabajando bien con un ambiente Visual Studio 2012 y Office 2010, tengo instalado el Access Database 2010, se me ocurrió la genial idea de migrar el office a 2013, y ahora el ambiente de desarrollo me da el siguiente error: Error: El proveedor 'Microsoft.ACE.OLEDB.12.0' no esta registrado en el equipo local.

    Mi ambiente de trabajo es asp.net y el código generado en vb.net.

            Dim m_sConn1 As String = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
           "Data Source=" & directorio & "\" & txtcor.Text & ".xlsx;" & _
           "Extended Properties=""Excel 12.0;HDR=NO;IMEX=1;"""

    Alguna ayuda?

    jueves, 6 de agosto de 2015 18:05

Respuestas

  • hola

    >>tenia office 2010 y me funcionaba bien, fue al cambiar a office 2013

    podrias probar de volver a 2010

    o sino no usar ado.net o las librerias COM de office sino pasar a librerias basadas en open xml como ser

    ClosedXML - The easy way to OpenXML

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Javier - GT viernes, 7 de agosto de 2015 17:49
    viernes, 7 de agosto de 2015 14:18
  • Listo problema solucionado, te dejo la rutina de pasar de Excel a Dataset ya que todo lo que se encuentra es al contrario de Dataset a Excel.

    Gracias Leandro por tu apoyo.

            Dim wb As XLWorkbook = New XLWorkbook(directorio & "\" & txtcor.Text & ".xlsx")
            Dim ws As IXLWorksheet = wb.Worksheet("InventoryNei")

            Dim firstRowUsed As Integer = ws.FirstCellUsed().Address.RowNumber

            Dim lastRowUsed As Integer = ws.LastCellUsed().Address.RowNumber

            Dim lastColumnUsed As Integer = ws.LastColumnUsed().ColumnNumber

            Dim i, j As Integer

            ds.Clear()
            Dim invTable As DataTable = ds.Tables.Add("Inventory")
            For i = 1 To lastColumnUsed
                invTable.Columns.Add("F" & i, Type.GetType("System.String"))
            Next
            Dim invRow As DataRow
            For i = 2 To lastRowUsed
                invRow = ds.Tables("Inventory").NewRow()
                For j = 1 To lastColumnUsed
                    invRow("F" & j) = ws.Cell(i, j).Value
                Next
                ds.Tables("Inventory").Rows.Add(invRow)
            Next

            Dim total As Integer = ds.Tables(0).Rows.Count()

    • Marcado como respuesta Javier - GT viernes, 7 de agosto de 2015 17:47
    viernes, 7 de agosto de 2015 17:47

Todas las respuestas

  • hola

    de casualidad tu pc es de 64bits ? si es asi alli esta el problema

    aqui

    [ADO.NET] Ms Access y arquitectura 64bit

    explico como solucionarlo

    ----

    ademas recuerda que al publicar en el IIS debes habilitarlos 32 bits

    imagen

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    jueves, 6 de agosto de 2015 19:50
  • Gracias Leandro te comento si es de 64 bits mi PC, en producción no hay problema, el programa trabaja bien, solo es en ambiente de desarrollo que da el error.
    • Editado Javier - GT jueves, 6 de agosto de 2015 20:14
    jueves, 6 de agosto de 2015 20:11
  • Dentro de lo que había buscado para solucionarlo ya había visto tu post pero recuerda que en ambiente asp.net 2012 esta opción no esta disponible, eso solo funciona para winform.

    jueves, 6 de agosto de 2015 20:13
  • esto que comente aplica a web y desktop

    solo que en web debes tener en cuanta el comentario final que realizo sobre el IIS

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 6 de agosto de 2015 21:00
  • Amigo Leandro, mil gracias ya me leí todo tu post y por ningún lado observo la referencia al IIS solo hablas de crear un servicio WEB pero creo que eso va a dar el mismo resultado.
    jueves, 6 de agosto de 2015 21:24
  • >>por ningún lado observo la referencia al IIS

    eso no esta en el articulo, eso lo comente en mi primer respuesta, se ve que no la lieste completa

    analiza el segundo link que pongo como imagen,alli es donde cambias en el iis para habilitar los 32bits en un entorno web

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 6 de agosto de 2015 21:49
  • Tienes razón lo estaba buscando en el foro no había abierto el segundo link, te comento eso serviría cuando mi entorno de desarrollo lo pruebo desde un server con IIS, pero el emulador del visual studio no encuentro por donde configurar estas opciones, lo único que me muestra es la pantalla que esta corriendo el emulador del compilador.

    jueves, 6 de agosto de 2015 22:26
  • hola

    >>pero el emulador del visual studio no encuentro por donde configurar estas opciones,

    desde el VS deberia bastar con cambiar el Platform Target a x86 desde las propeidades de los proyectos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 6 de agosto de 2015 22:33
  • A ver Leandro, las propiedades de un sitio web son diferentes a las propiedades cuando estas trabajado con un proyecto, en 2012 cuando abro un proyecto si puedo ver esa opción que tu dices, pero cuando abro las propiedades del proyecto web aparecen diferente porque como tu dices esas se configuran a nivel del IIS, pero como el emulador es un depurador propio no tiene forma de configurarse.
    jueves, 6 de agosto de 2015 23:04
  • vuando ingresas a esta opcion

    imagen

    no te deja ingresar a las demas solapas ?

    si es asi si ingresas a la de Build o a la de Application no ubicas alli la opcion para cambiar el platform target

    -----

    sino puedes por ese lado te doy un consejo pasate a una base de datos de verdad y usa Sql Server

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 7 de agosto de 2015 2:08
  • Hola Leandro muy buenos días si lees el post inicial mi problema no es de base de datos con bases de datos trabaja excelente, mi problema es al leer un archivo excel, tenia office 2010 y me funcionaba bien, fue al cambiar a office 2013 que empezo el error, en ambiente de producción no hay inconvenientes solo es en ambiente de desarrollo.

            Dim m_sConn1 As String = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
           "Data Source=" & directorio & "\" & txtcor.Text & ".xlsx;" & _
           "Extended Properties=""Excel 12.0;HDR=NO;IMEX=1;"""

            Dim conn2 As New OleDbConnection(m_sConn1)
            Dim da As New OleDbDataAdapter("Select * From [InventoryNei$]", conn2)
            ds.Clear()
            Try
                da.Fill(ds, "XLData")    '--> Error aparece al llenar el Dataset con la nueva version de office.
            Catch ex As Exception
                lblerror.Visible = True
                lblerror.ForeColor = Drawing.Color.Red
                'lblerror.Text = "Error: File not vaild, Sheet [InventoryNei] not exist!!!"
                lblerror.Text = "Error: " + ex.Message
                conn2.Close()
                Return
            End Try

    viernes, 7 de agosto de 2015 13:58
  • hola

    >>tenia office 2010 y me funcionaba bien, fue al cambiar a office 2013

    podrias probar de volver a 2010

    o sino no usar ado.net o las librerias COM de office sino pasar a librerias basadas en open xml como ser

    ClosedXML - The easy way to OpenXML

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Javier - GT viernes, 7 de agosto de 2015 17:49
    viernes, 7 de agosto de 2015 14:18
  • Listo problema solucionado, te dejo la rutina de pasar de Excel a Dataset ya que todo lo que se encuentra es al contrario de Dataset a Excel.

    Gracias Leandro por tu apoyo.

            Dim wb As XLWorkbook = New XLWorkbook(directorio & "\" & txtcor.Text & ".xlsx")
            Dim ws As IXLWorksheet = wb.Worksheet("InventoryNei")

            Dim firstRowUsed As Integer = ws.FirstCellUsed().Address.RowNumber

            Dim lastRowUsed As Integer = ws.LastCellUsed().Address.RowNumber

            Dim lastColumnUsed As Integer = ws.LastColumnUsed().ColumnNumber

            Dim i, j As Integer

            ds.Clear()
            Dim invTable As DataTable = ds.Tables.Add("Inventory")
            For i = 1 To lastColumnUsed
                invTable.Columns.Add("F" & i, Type.GetType("System.String"))
            Next
            Dim invRow As DataRow
            For i = 2 To lastRowUsed
                invRow = ds.Tables("Inventory").NewRow()
                For j = 1 To lastColumnUsed
                    invRow("F" & j) = ws.Cell(i, j).Value
                Next
                ds.Tables("Inventory").Rows.Add(invRow)
            Next

            Dim total As Integer = ds.Tables(0).Rows.Count()

    • Marcado como respuesta Javier - GT viernes, 7 de agosto de 2015 17:47
    viernes, 7 de agosto de 2015 17:47