none
Exportar una hoja excel xls a una tabla de SQL Server ? / vb.net 2013 RRS feed

  • Pregunta

  • saludos amigos del foro, les traigo un inconveniente, necesito exportar una hoja excel a una tabla de sql server express 2012, les dejo un codigo que encontre que lo vi en el foro:

    Imports System.Data
    Imports System.Data.SqlClient

    Public Class Form1

        Dim nue_conexion As New conexion
        Dim nue_var As New variables

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

             nue_var.consulta = "select * into cnta FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', Excel 8.0;Database=cnta.xls;HDR=YES', SELECT * FROM [Hoja1$]')"

            Try
                nue_conexion.conectar()
                nue_var.cmd = New SqlCommand(nue_var.consulta, nue_conexion.conex())
                nue_var.cmd.ExecuteNonQuery()
                nue_conexion.desconectar()
            Catch mierror As SqlException
                MsgBox("Error de Conexión a la Base de Datos: " & mierror.Message)
            End Try

        End Sub

    End Class

    yo tengo instalado el oficce 2007 y me vota error en "cerca de excel" ese es el error,

    agradecere mucho si alguien me puede ayudar por favor,

    gracias,

    rudolf heiner.




    miércoles, 27 de julio de 2016 8:51

Respuestas

  • "Rudolf Heiner" escribió:

    > ahora el error que vota es: NO SE PUEDO ENCONTRAR EL ARCHIVO ISAM INSTALABLE

    Eso se debe a que no tienes instalado el proveedor Microsoft.ACE.OLEDB.12.0 correspondiente a la arquitectura de 32/64 bits con la que has compilado tu proyecto de Visual Basic, siempre y cuando hayas especificado correctamente el ISAM 'Excel 12,0 Xml' en las propiedades extendidas de la cadena de conexión utilizada para establecer la conexión con el libro de Excel.

    Desde luego va a ser complicado que puedas ejecutar correctamente la consulta SQL si en tu equipo no tienes instalados los componentes necesarios y requeridos para ello.



    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    miércoles, 27 de julio de 2016 20:24
    Moderador
  • "Rudolf Heiner" escribió:

    > mira  mi maquina es de 64 bits, desinstale el office 2007 e instale el office
    > 2013 64 bits, ya instale el Microsoft.ACE.OLEDB.12.0 version 2010 de 64 bits,
    > ahora me vota otro error:
    >
    >  El proveedor 'Microsoft.ACE.OLEDB.12.0' no está registrado en el equipo local.
    >
    > ya esta todo ok pero me vota ese error, que puedo hacer porfavor si me puende ayudar

    NO ESTÁ TODO OK, porque de estarlo, no obtendrías el error que comentas.

    Si ahora obtienes ese error, es porque seguramente has compilado tu proyecto de Visual Basic para 32 bits, y al haber desinstalado Office 2007 de 32 bits, también has desinstalado la versión de 32 bits del proveedor 'Microsoft.ACE.OLEDB.12.0'. Lo que tendrías que hacer ahora es compilar tu aplicación para que SOLAMENTE SE EJECUTE en plataformas de 64 bits.

    Si tu deseas tener un equipo preparado para desarrollar aplicaciones que hacen uso del proveedor de datos 'Microsoft.ACE.OLEDB.12.0' (bases de Access, archivos de Excel, de texto delimitado), tienes que tener instaladas las versiones de 32 y de 64 bits del mencionado proveedor, para que tus aplicaciones que compiles para 32 y 64 bits funcionen correctamente en ambas plataformas.

    Eso por un lado, y por otro, deberías de saber que la arquitectura de Visual Studio es de 32 bits, incluida tu versión de 2013, por lo que también necesitarás la versión de 32 bits del proveedor 'Microsoft.ACE.OLEDB.12.0' si vas a crear conexiones con bases de datos de Access desde la ventana Explorador de servidores de Visual Studio, por eso te comenté en una respuesta más arriba que me extrañaba que tu Visual Studio 2013 fuera de 64 bits, simplemente porque no existe. ;-)

    Como dices que has desinstalado Office 2007, y por ende la versión de 32 bits del proveedor 'Microsoft.ACE.OLEDB.12.0', y que has instalado las versiones de 64 bits tanto de Office 2013 como del controlador de Access 2010, lo que tienes que hacer ahora es descargar e instalar el  Controlador de Office 2007 System, que solamente está disponible en 32 bits, para que puedan funcionar tus aplicaciones .NET que compiles para plataformas de 32 bits con dicho proveedor de datos y también puedas crear conexiones a orígenes de datos de Access desde tu Visual Studio.

    Quizás te estés preguntando por qué tienes que instalar el controlador de Office 2007 si lo has desinstalado previamente, y creo haberte comentado anteriormente en esta ya larga conversación que llevamos para exportar a SQL Server los datos de una hoja de Excel (operación que se suele hacer en un abrir y cerrar de ojos), que no puedes instalar un Office de 64 bits si tienes instalada una versión de 32 bits, pero sí puedes instalar el controlador de Office 2007 indicado aunque tengas una versión de Office 2010 o superior de 64 bits instalada. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.






    jueves, 28 de julio de 2016 5:50
    Moderador
  • "Rudolf Heiner" escribió:

    >  nue_var.consulta = "select * into cnta FROM OPENROWSET(  ...
    >
    > Ya logre que la cadena de datos funcionara, ahora me vota el siguiente error:
    >
    > ... componente 'Ad Hoc Distributed Queries' porque este componente está
    > desactivado como parte de la configuración de seguridad de este servidor...

    Hola:

    El mismo mensaje de error te está diciendo lo que tienes que hacer, que es habilitar en el servidor de SQL Server las consultas ad hoc distribuidas, ya que estás utilizando la función OPENROWSET.

    Abre el Administrador de SQL Server, y en la base de datos 'master', prueba a ejecutar las consultas que aparecen en la siguiente imagen:


    Para más información, consulta la ayuda de SQL Server:

    ad hoc distributed queries (opción de configuración del servidor)

    Espero que tengas en cuenta la nota que aparece en el artículo indicado:

    Un saludo

     


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.




    miércoles, 27 de julio de 2016 11:05
    Moderador
  • "Rudolf Heiner" escribió:

    > Mira este es el codigo:
    >
    > nue_var.consulta = "select * into cnta FROM OPENROWSET('Microsoft.Jet.OLEDB.2.6'," & > 'Excel12.0;Database=cnta.xls;HDR=YES'," & "' SELECT * FROM [Hoja1$]')"

    El mensaje de error simplemente te está diciendo que NO EXISTE el proveedor que estás utilizando en la cadena de conexión OleDb que le estás pasando a la función OPENWROSET. Pero observando la cadena de conexión, también tienes mal el tipo de ISAM de Excel que has especificado, ya que tampoco existe el ISAM 'Excel12.0'.

    Para conectarte con un libro de Excel 2007 o superior a través de su ISAM instalable, tienes que utilizar la siguiente cadena de conexión OleDb:

        nue_var.consulta = "SELECT * INTO cnta FROM OPENROWSET(" & _
                           "'Microsoft.ACE.OLEDB.12.0','Excel 12.0 Xml;Database=cnta.xls;HDR=Yes','SELECT * FROM [Hoja1$]')"

    Por supuesto, tanto el proveedor Microsoft.ACE.OLEDB.12.0 como el ISAM Excel 12.0 Xml tienen que estar previamente instalados en el equipo.

    Como observo que la extensión del archivo de Excel es 'xls', puede ser que se trate de un archivo de Excel con una versión inferior a Excel 2007. Si es así, también puedes utilizar ésta otra cadena de conexión OleDb:

     
       nue_var.consulta = "SELECT * INTO cnta FROM OPENROWSET(" & _
                           "'Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=cnta.xls;HDR=Yes','SELECT * FROM [Hoja1$]')"

    Observa el siguiente parámetro:   ...;Database=cnta.xls;...

    No estaría de más que incluyeras la ruta completa del archivo de Excel:  ...;Database=C:\Carpeta\cnta.xls;...

    Y si tienes dudas con la función OPENROWSET, nuevamente te remito a la ayuda de SQL Server:

    OPENROWSET (Transact-SQL)

    Y al foro en español de Microsoft SQL Server porque a decir verdad, poco tiene que ver tu pregunta con Visual Basic .NET, aunque utilices éste lenguaje de programación para ejecutar la función OPENROWSET del lenguaje T-SQL de Microsoft SQL Server:

    https://social.msdn.microsoft.com/Forums/es-ES/home?forum=sqlserveres


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    miércoles, 27 de julio de 2016 14:23
    Moderador
  • "Rudolf Heiner" escribió:

    > 1.- Oficce 2007 32 Bits
    >
    > 2.- Windows 10 64 bits
    >
    > 3.- SQL SERVER EXPRESS 2012 64 Bits
    >
    > 4.- Visual Studio 2013 64 Bits
    >
    > 5.- AnyCPU

    ¿Visual Studio 2013 de 64 bits? Me extraña. ;-)

    ¡Vamos a ver! Si tu aplicación de Visual Basic la compilas para AnyCPU y tu equipo Windows 10 es de 64 bits, necesariamente tienes que instalar la versión de 64 bits del Componente redistribuible del motor de base de datos de Microsoft Access 2010.

    Prueba a compilar tu aplicación para x86 e intenta de nuevo a ejecutar la consulta.

    Si continuas con el mismo mensaje de error, no se si recomendarte que descargues el archivo AccessDatabaseEngine_X64.exe desde el enlace anterior y lo instales. Pero ten en cuenta que si tienes instalado Office 2007 de 32 bits, entiendo que no vas a poder instalar los Componentes de Access 2010 hasta que no desinstales la versión de Office 2007. Así que tu veras.

    De todas maneras, te comento que para lo que deseas hacer, que es crear una tabla en la base de SQL Server con los datos existentes en una hoja de cálculo de Excel, no es sumamente necesario que para ello utilices la función OPENROWSET, porque puedes conectarte con el libro de Excel mediante el proveedor Microsoft.ACE.OLEDB.12.0 y conectarte con la base de SQL Server mediante su driver ODBC, tal y como muestra el siguiente ejemplo:

    Imports System.Data.OleDb
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            ' Cadena de conexión con el archivo de Excel
            Dim cadenaConexion As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=cnta.xls;" &
                "Extended Properties='Excel 12.0 Xml;HDR=Yes'"
    
            Dim n As Integer
    
            Try
                Using cnn As New OleDbConnection(cadenaConexion)
                    Dim cmd As OleDbCommand = cnn.CreateCommand()
    
                    cmd.CommandText =
                        "SELECT * INTO cnta " &
                        "IN ''[ODBC;Driver={SQL Server};" &
                        "Server=(local);Database=NombreBaseDatos;UID=CuentaUsuario;PWD=Contraseña]" &
                        "FROM [Hoja1$]"
    
                    cnn.Open()
                    n = cmd.ExecuteNonQuery()
    
                End Using
    
                MessageBox.Show("Nº de registros insertados: " & n.ToString())
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub
    

    Modifica la ruta del archivo de Excel así como los datos de la cadena de conexión ODBC para conectarte a tu servidor de SQL Server.

    Insisto que para ejecutar este ejemplo tienes que compilar tu aplicación para x86, ya que al tener instalado Office 2007 de 32 bits, ésta arquitectura será la del proveedor Microsoft.ACE.OLEDB.12.0 que tendrás instalado en tu equipo.

    > estaba pensando no le hace falta como un left join al codigo y si es asi
    > donde lo pongo, y otra cosa que veo es que no es toda la hoja sino 3
    > columnas que tienen sus encabezados:

    Yo no sé si tienes que indicar un LEFT JOIN. Solamente me estoy limitando a la consulta SQL que estás queriendo ejecutar. Si dices que solamente quieres seleccionar 3 columnas de la hoja de cálculo, tan sólo tienes que especificar sus nombres en la cláusula SELECT:

                    cmd.CommandText =
                        "SELECT Campo1, Campo2, Campo3 INTO cnta " &
                        "IN ''[ODBC;Driver={SQL Server};" &
                        "Server=(local);Database=NombreBaseDatos;UID=CuentaUsuario;PWD=Contraseña]" &
                        "FROM [Hoja1$]"
    


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    miércoles, 27 de julio de 2016 16:33
    Moderador
  • "Rudolf Heiner" escribió:

    > ahora me vota este error, ...

    Observando el mensaje de error, lo único que te puedo preguntar es si existe instalada una instancia llamada (local), que parece ser es el nombre que le has indicado al parámetro Server de la cadena de conexión ODBC.

    Quiero pensar que el servicio de SQL Server está ejecutándose.

        cmd.CommandText =
             "SELECT Campo1, Campo2, Campo3 INTO cnta " &
             "IN ''[ODBC;Driver={SQL Server};" &
             "Server=(local);Database=NombreBaseDatos;UID=CuentaUsuario;PWD=Contraseña]" &
             "FROM [Hoja1$]"

    En el ejemplo, utilizo la instancia por defecto o local de SQL Server. ¿Que tu instancia se llama de otra manera? Deberás escribir en el parámetro Server el nombre correcto de la instancia de tu servidor.

    Por ejemplo, vamos a suponer que tienes una instancia con nombre llamada SQLExpress. El valor que tienes que especificar en el parámetro Server sería:

        cmd.CommandText =
             "SELECT Campo1, Campo2, Campo3 INTO cnta " &
             "IN ''[ODBC;Driver={SQL Server};" &
             "Server=(local)\SQLExpress;Database=NombreBaseDatos;UID=CuentaUsuario;PWD=Contraseña]" &
             "FROM [Hoja1$]"

    > Dim nue_conexion As New conexion
    > nue_conexion.conectar()

    ¿Cual es el valor del parámetro 'Data Source' de la cadena de conexión que utiliza el objeto 'nue_conexion'? Pues ese es el valor que le tienes que especificar al parámetro Server.

    > ya hice la actualizacion del OLEDB a 12 de 32 bits:

    No me entero. Si ya tenías instalado Office 2007 de 32 bits, ¿qué instalación has realizado de 32 bits del citado proveedor?


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    miércoles, 27 de julio de 2016 17:28
    Moderador

Todas las respuestas

  • Ya logre que la cadena de datos funcionara, ahora me vota el siguiente error:

    miércoles, 27 de julio de 2016 10:23
  • "Rudolf Heiner" escribió:

    >  nue_var.consulta = "select * into cnta FROM OPENROWSET(  ...
    >
    > Ya logre que la cadena de datos funcionara, ahora me vota el siguiente error:
    >
    > ... componente 'Ad Hoc Distributed Queries' porque este componente está
    > desactivado como parte de la configuración de seguridad de este servidor...

    Hola:

    El mismo mensaje de error te está diciendo lo que tienes que hacer, que es habilitar en el servidor de SQL Server las consultas ad hoc distribuidas, ya que estás utilizando la función OPENROWSET.

    Abre el Administrador de SQL Server, y en la base de datos 'master', prueba a ejecutar las consultas que aparecen en la siguiente imagen:


    Para más información, consulta la ayuda de SQL Server:

    ad hoc distributed queries (opción de configuración del servidor)

    Espero que tengas en cuenta la nota que aparece en el artículo indicado:

    Un saludo

     


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.




    miércoles, 27 de julio de 2016 11:05
    Moderador
  • Hola Rudolf

    Puedes utilizar la librería Open XML SDK. Yo suelo usarla con c# pero en vb también funciona. Supondría reescribir el código pero, en mi opinión, hacerlo con esta librería es mucho mas intuitivo y limpio. Tu decides.

    Saludos,

    MrR0b07

    miércoles, 27 de julio de 2016 11:18
  • Gracias por responder Enrique hice lo que me dijiste y por ese lado ya funciona, ahora me sale otro error:

    me podras seguir ayudando porfavor, yo tengo instalado el microsoft office 2007 con lenguage pack DEU SPN ENG,

    a ver si me ayudas porfavor.

    Mira este es el codigo:

    nue_var.consulta = "select * into cnta FROM OPENROWSET('Microsoft.Jet.OLEDB.2.6'," & "'Excel12.0;Database=cnta.xls;HDR=YES'," & "' SELECT * FROM [Hoja1$]')"
    miércoles, 27 de julio de 2016 11:46
  • saludos MrR0b07 gracias por escribir, dime como es eso de utilizar la libreria y de donde lo tengo que bajar en esta vez estoy novato,

    quedo de ti,

    rudolf heiner.

    miércoles, 27 de julio de 2016 11:47
  • En ese caso te falta la libreria OleDB tienes que descargartela si no la tienes e incluirla al inicio en los imports, por otro lado puedes descargar la libreria Open XML SDK aquí:  https://www.microsoft.com/en-us/download/details.aspx?id=30425&wa=wsignin1.0  pero ya casi que mejor que sigas usando OleDB porque no sabría decirte como usar la librería en VB, nunca he programado en VB, solo se que no se nada y que en vb se puede usar esa librería :P

    Saludos,

    MrR0b07

    miércoles, 27 de julio de 2016 12:05
  • Hola MrR0b07, dime ya instale el programa y ahora que hago me podras ayudar porfavor,

    quedo de ti,

    rudolf heiner.

    miércoles, 27 de julio de 2016 13:16
  • "Rudolf Heiner" escribió:

    > Mira este es el codigo:
    >
    > nue_var.consulta = "select * into cnta FROM OPENROWSET('Microsoft.Jet.OLEDB.2.6'," & > 'Excel12.0;Database=cnta.xls;HDR=YES'," & "' SELECT * FROM [Hoja1$]')"

    El mensaje de error simplemente te está diciendo que NO EXISTE el proveedor que estás utilizando en la cadena de conexión OleDb que le estás pasando a la función OPENWROSET. Pero observando la cadena de conexión, también tienes mal el tipo de ISAM de Excel que has especificado, ya que tampoco existe el ISAM 'Excel12.0'.

    Para conectarte con un libro de Excel 2007 o superior a través de su ISAM instalable, tienes que utilizar la siguiente cadena de conexión OleDb:

        nue_var.consulta = "SELECT * INTO cnta FROM OPENROWSET(" & _
                           "'Microsoft.ACE.OLEDB.12.0','Excel 12.0 Xml;Database=cnta.xls;HDR=Yes','SELECT * FROM [Hoja1$]')"

    Por supuesto, tanto el proveedor Microsoft.ACE.OLEDB.12.0 como el ISAM Excel 12.0 Xml tienen que estar previamente instalados en el equipo.

    Como observo que la extensión del archivo de Excel es 'xls', puede ser que se trate de un archivo de Excel con una versión inferior a Excel 2007. Si es así, también puedes utilizar ésta otra cadena de conexión OleDb:

     
       nue_var.consulta = "SELECT * INTO cnta FROM OPENROWSET(" & _
                           "'Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=cnta.xls;HDR=Yes','SELECT * FROM [Hoja1$]')"

    Observa el siguiente parámetro:   ...;Database=cnta.xls;...

    No estaría de más que incluyeras la ruta completa del archivo de Excel:  ...;Database=C:\Carpeta\cnta.xls;...

    Y si tienes dudas con la función OPENROWSET, nuevamente te remito a la ayuda de SQL Server:

    OPENROWSET (Transact-SQL)

    Y al foro en español de Microsoft SQL Server porque a decir verdad, poco tiene que ver tu pregunta con Visual Basic .NET, aunque utilices éste lenguaje de programación para ejecutar la función OPENROWSET del lenguaje T-SQL de Microsoft SQL Server:

    https://social.msdn.microsoft.com/Forums/es-ES/home?forum=sqlserveres


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    miércoles, 27 de julio de 2016 14:23
    Moderador
  • Gracias Enrique, solo te pido una ayuda, me sale este error:

    que puede ser ?

    solo eso y ya estaria todo,

    quedo de ti,

    rudolf heiner.

    mi archivo excel es asi, te muestro algunos campos :

    ctacod ctanom ctanv
    1 ACTIVO 1
    1.1. Activo Corriente 2
    1.1.1. Efectivo y equivalentes de efectivo 3
    1.1.1.01. Efectivo 4
    1.1.1.01.01. Caja 5
    1.1.1.01.01.02. Efectivo en caja en el país 6
    1.1.1.01.01.03. Efectivo en caja en el exterior 6
    1.1.1.01.02. Depósitos bancarios 5


    miércoles, 27 de julio de 2016 15:22
  • "Rudolf Heiner" preguntó:

    > me sale este error:
    >
    > Error de Conexion a la Base de Datos: No se puede crear una instancia del
    > proveedor OLE DB "Microsoft.ACE.OLEDB.12.0" para el servidor vinculado "(null)".

    Me imagino que habrás ejecutado la consulta TAL CUAL te la he indicado. Te lo pregunto porque me extraña lo del servidor vinculado con el nombre "(null)".

    Ese error se puede deber a múltiples causas, entre ellas, que haya una incompatibilidad entre la arquitectura del proveedor Microsoft.ACE.OLEDB.12.0 y la de la versión de SQL Server que tengas instalado en tu equipo.

    ¿Qué versión de Microsoft Office tienes instalada en tu equipo? ¿Es de 32 o de 64 bits? Si no dispones de Microsoft Office, digo yo que habrás tenido que instalar al menos los Componentes de acceso a datos de Access 2007 o 2010. Si es así, ¿qué versión has instalado, la de 32 o la de 64 bits? Te advierto que los Componentes de Access 2007 solamente están disponibles para 32 bits.

    ¿Qué versión de Windows tienes instalada, indicando si es de 32 o de 64 bits? ¿Qué versión de SQL Server tienes instalada, indicando si es de 32 o de 64 bits? Por último, ¿para qué plataforma has compilado tu aplicación de Visual Basic? ¿Para x86, x64 o AnyCPU?

    Como podrás observar, son muchas las preguntas que tienes que responder para ver si alguien puede decirte a qué se puede deber ese error.

    Yo acabo de ejecutar la consulta SQL comentada y no he tenido ningún tipo de problema, y eso que mi cuenta de usuario de Windows no tiene privilegios de Administrador. Todo lo tengo en 64 bits: el sistema operativo, el proveedor Microsoft.ACE.OLEDB.12.0 y SQL Server 2014, habiendo compilado la aplicación de Visual Basic para x64.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    miércoles, 27 de julio de 2016 15:49
    Moderador
  • Saludos Enrique:

    1.- Oficce 2007 32 Bits

    2.- Windows 10 64 bits

    3.- SQL SERVER EXPRESS 2012 64 Bits

    4.- Visual Studio 2013 64 Bits

    5.- AnyCPU

    estaba pensando no le hace falta como un left join al codigo y si es asi donde lo pongo, y otra cosa que veo es que no es toda la hoja sino 3 columnas que tienen sus encabezados:

    nue_var.consulta = "SELECT * INTO cnta FROM OPENROWSET(" & _
    "'Microsoft.ACE.OLEDB.12.0','Excel 12.0 Xml;Database=D:\Descargas\Exportar\Exportar\bin\Debug\cnta.xls;HDR=Yes','SELECT * FROM [Hoja1$]')"

    Quedo de ti,

    saludos,

    rudolf heiner.


    miércoles, 27 de julio de 2016 16:01
  • "Rudolf Heiner" escribió:

    > 1.- Oficce 2007 32 Bits
    >
    > 2.- Windows 10 64 bits
    >
    > 3.- SQL SERVER EXPRESS 2012 64 Bits
    >
    > 4.- Visual Studio 2013 64 Bits
    >
    > 5.- AnyCPU

    ¿Visual Studio 2013 de 64 bits? Me extraña. ;-)

    ¡Vamos a ver! Si tu aplicación de Visual Basic la compilas para AnyCPU y tu equipo Windows 10 es de 64 bits, necesariamente tienes que instalar la versión de 64 bits del Componente redistribuible del motor de base de datos de Microsoft Access 2010.

    Prueba a compilar tu aplicación para x86 e intenta de nuevo a ejecutar la consulta.

    Si continuas con el mismo mensaje de error, no se si recomendarte que descargues el archivo AccessDatabaseEngine_X64.exe desde el enlace anterior y lo instales. Pero ten en cuenta que si tienes instalado Office 2007 de 32 bits, entiendo que no vas a poder instalar los Componentes de Access 2010 hasta que no desinstales la versión de Office 2007. Así que tu veras.

    De todas maneras, te comento que para lo que deseas hacer, que es crear una tabla en la base de SQL Server con los datos existentes en una hoja de cálculo de Excel, no es sumamente necesario que para ello utilices la función OPENROWSET, porque puedes conectarte con el libro de Excel mediante el proveedor Microsoft.ACE.OLEDB.12.0 y conectarte con la base de SQL Server mediante su driver ODBC, tal y como muestra el siguiente ejemplo:

    Imports System.Data.OleDb
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            ' Cadena de conexión con el archivo de Excel
            Dim cadenaConexion As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=cnta.xls;" &
                "Extended Properties='Excel 12.0 Xml;HDR=Yes'"
    
            Dim n As Integer
    
            Try
                Using cnn As New OleDbConnection(cadenaConexion)
                    Dim cmd As OleDbCommand = cnn.CreateCommand()
    
                    cmd.CommandText =
                        "SELECT * INTO cnta " &
                        "IN ''[ODBC;Driver={SQL Server};" &
                        "Server=(local);Database=NombreBaseDatos;UID=CuentaUsuario;PWD=Contraseña]" &
                        "FROM [Hoja1$]"
    
                    cnn.Open()
                    n = cmd.ExecuteNonQuery()
    
                End Using
    
                MessageBox.Show("Nº de registros insertados: " & n.ToString())
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub
    

    Modifica la ruta del archivo de Excel así como los datos de la cadena de conexión ODBC para conectarte a tu servidor de SQL Server.

    Insisto que para ejecutar este ejemplo tienes que compilar tu aplicación para x86, ya que al tener instalado Office 2007 de 32 bits, ésta arquitectura será la del proveedor Microsoft.ACE.OLEDB.12.0 que tendrás instalado en tu equipo.

    > estaba pensando no le hace falta como un left join al codigo y si es asi
    > donde lo pongo, y otra cosa que veo es que no es toda la hoja sino 3
    > columnas que tienen sus encabezados:

    Yo no sé si tienes que indicar un LEFT JOIN. Solamente me estoy limitando a la consulta SQL que estás queriendo ejecutar. Si dices que solamente quieres seleccionar 3 columnas de la hoja de cálculo, tan sólo tienes que especificar sus nombres en la cláusula SELECT:

                    cmd.CommandText =
                        "SELECT Campo1, Campo2, Campo3 INTO cnta " &
                        "IN ''[ODBC;Driver={SQL Server};" &
                        "Server=(local);Database=NombreBaseDatos;UID=CuentaUsuario;PWD=Contraseña]" &
                        "FROM [Hoja1$]"
    


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    miércoles, 27 de julio de 2016 16:33
    Moderador
  • Hola enrique ahora me vota este error, ya hice la actualizacion del OLEDB a 12 de 32 bits:

    miércoles, 27 de julio de 2016 17:07
  • "Rudolf Heiner" escribió:

    > ahora me vota este error, ...

    Observando el mensaje de error, lo único que te puedo preguntar es si existe instalada una instancia llamada (local), que parece ser es el nombre que le has indicado al parámetro Server de la cadena de conexión ODBC.

    Quiero pensar que el servicio de SQL Server está ejecutándose.

        cmd.CommandText =
             "SELECT Campo1, Campo2, Campo3 INTO cnta " &
             "IN ''[ODBC;Driver={SQL Server};" &
             "Server=(local);Database=NombreBaseDatos;UID=CuentaUsuario;PWD=Contraseña]" &
             "FROM [Hoja1$]"

    En el ejemplo, utilizo la instancia por defecto o local de SQL Server. ¿Que tu instancia se llama de otra manera? Deberás escribir en el parámetro Server el nombre correcto de la instancia de tu servidor.

    Por ejemplo, vamos a suponer que tienes una instancia con nombre llamada SQLExpress. El valor que tienes que especificar en el parámetro Server sería:

        cmd.CommandText =
             "SELECT Campo1, Campo2, Campo3 INTO cnta " &
             "IN ''[ODBC;Driver={SQL Server};" &
             "Server=(local)\SQLExpress;Database=NombreBaseDatos;UID=CuentaUsuario;PWD=Contraseña]" &
             "FROM [Hoja1$]"

    > Dim nue_conexion As New conexion
    > nue_conexion.conectar()

    ¿Cual es el valor del parámetro 'Data Source' de la cadena de conexión que utiliza el objeto 'nue_conexion'? Pues ese es el valor que le tienes que especificar al parámetro Server.

    > ya hice la actualizacion del OLEDB a 12 de 32 bits:

    No me entero. Si ya tenías instalado Office 2007 de 32 bits, ¿qué instalación has realizado de 32 bits del citado proveedor?


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    miércoles, 27 de julio de 2016 17:28
    Moderador
  • Hola Enrique sigue con el mismo error, mi nombre de servidor es: RUDOLF\SQLEXPRESS2012

    "SELECT * INTO cnta " &
    "IN ''[ODBC;Driver={SQL Server};" &
    "Server=(local)\SQLEXPRESS2012;Database=sys_contab_2016_yodo_cletas_1;UID=sa;PWD=admin123456]" &
    "FROM [Hoja1$]"

    quiero que te fijes si no le falta algo como comillas o algo mas en la conexion,

    quedo de ti,

    rudolf heiner.

    miércoles, 27 de julio de 2016 17:41
  • "Rudolf Heiner" escribió:

    > sigue con el mismo error, mi nombre de servidor es: RUDOLF\SQLEXPRESS2012
    >
    > quiero que te fijes si no le falta algo como comillas o algo mas en la conexion,

    A la conexión ni le faltan comillas ni nada más. ¿Tienes instalado en tu equipo el driver ODBC de SQL Server?

    Prueba con éste otro driver:

     "SELECT * INTO cnta " &
     "IN ''[ODBC;Driver={SQL Server Native Client 11.0};" &
     "Server=RUDOLF\SQLEXPRESS2012;Database=sys_contab_2016_yodo_cletas_1;UID=sa;PWD=admin123456]" &
     "FROM [Hoja1$]"
    


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    miércoles, 27 de julio de 2016 17:49
    Moderador
  • "Rudolf Heiner" escribió:

    > Tengo instalado el mysql-connector-odbc-5.3.4-winx64 y esta votando
    > otro error : ODBC fallo la llamada

    Pero ¿qué tiene que ver el driver ODBC de MySQL con el driver ODBC de SQL Server?

    Lo que yo te estoy explicando es para UTILIZAR EL DRIVER ODBC DE SQL SERVER, que si no lo tienes instalado, va a ser complicado que puedas ejecutar la consulta que te he indicado anteriormente.

    Y si por casualidad estás queriendo insertar los datos en una base de MySQL, entonces mejor será que te olvides de todo lo que te he explicado durante el día de hoy, y te estaría enormemente agradecido que la próxima vez indiques claramente en tu mensajes el motor de datos estás utilizando desde tu aplicación de Visual Basic. :-(


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    miércoles, 27 de julio de 2016 18:11
    Moderador
  • Hola Enrique disculpame queria poner el odbc de sql server y por equivocacion puse el de mysql sorry, bueno hay dos driver el Sql :

    ODBC Driver 11 for SQL Server

    SQL Server Native Client 11.0 

    ahora vota errror aun en el odbc: ODBC Fallo la llamada

    quedo de ti,

    rudolf heiner.


    miércoles, 27 de julio de 2016 18:42
  • "Rudolf Heiner" escribió:

    > ... hay dos driver el Sql :
    >
    > ODBC Driver 11 for SQL Server
    >
    > SQL Server Native Client 11.0
    >
    > ahora vota errror aun en el odbc: ODBC Fallo la llamada

    Pues si con cualquiera de los dos obtienes ese mensaje de error, siempre y cuando la consulta SQL la estás ejecutando tal cual te indiqué, ignoro a qué se puede deber, dado que yo no puedo reproducir el error que comentas. Quiero pensar que tienes los suficientes permisos para acceder al servidor de SQL Server y al archivo de Excel, y que la cuenta y contraseña del usuario especificadas son correctas.

    Como anteriormente has comentado que tienes instalado SQL SERVER EXPRESS 2012 de 64 bits, lo único que me queda ya por indicarte es que ejecutes tu aplicación compilándola en modo x64. Pero está claro que si no tienes instalado el proveedor Microsoft.ACE.OLEDB.12.0 de 64 bits, entonces obtendrás el correspondiente error.

    Y si tu aplicación la estás compilando para x86 (32 bits), entonces procura tener instalados los drivers ODBC para SQL Server de 32 bits.

    También puedes efectuar tu consulta en el foro de Microsoft SQL Server que te indiqué más arriba, por si algún experto en SQL Server te puede decir algo que yo ignore.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.




    miércoles, 27 de julio de 2016 19:09
    Moderador
  • Gracias Enrique, ahora el error que vota es: NO SE PUEDO ENCONTRAR EL ARCHIVO ISAM INSTALABLE
    miércoles, 27 de julio de 2016 19:20
  • "Rudolf Heiner" escribió:

    > ahora el error que vota es: NO SE PUEDO ENCONTRAR EL ARCHIVO ISAM INSTALABLE

    Eso se debe a que no tienes instalado el proveedor Microsoft.ACE.OLEDB.12.0 correspondiente a la arquitectura de 32/64 bits con la que has compilado tu proyecto de Visual Basic, siempre y cuando hayas especificado correctamente el ISAM 'Excel 12,0 Xml' en las propiedades extendidas de la cadena de conexión utilizada para establecer la conexión con el libro de Excel.

    Desde luego va a ser complicado que puedas ejecutar correctamente la consulta SQL si en tu equipo no tienes instalados los componentes necesarios y requeridos para ello.



    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    miércoles, 27 de julio de 2016 20:24
    Moderador
  • Bueno muchas gracias Enrique por todo, gracias en verdad, bueno hasta otra oportunidad, saludos, 

    rudolf heiner.

    jueves, 28 de julio de 2016 2:30
  • Saludos Enrique, mira  mi maquina es de 64 bits, desinstale el office 2007 e instale el office 2013 64 bits, ya instale el Microsoft.ACE.OLEDB.12.0 version 2010 de 64 bits, ahora me vota otro error:

    ya esta todo ok pero me vota ese error, que puedo hacer porfavor si me puende ayudar,

    quedo de usted,

    rudolf heiner.

    jueves, 28 de julio de 2016 4:38
  • "Rudolf Heiner" escribió:

    > mira  mi maquina es de 64 bits, desinstale el office 2007 e instale el office
    > 2013 64 bits, ya instale el Microsoft.ACE.OLEDB.12.0 version 2010 de 64 bits,
    > ahora me vota otro error:
    >
    >  El proveedor 'Microsoft.ACE.OLEDB.12.0' no está registrado en el equipo local.
    >
    > ya esta todo ok pero me vota ese error, que puedo hacer porfavor si me puende ayudar

    NO ESTÁ TODO OK, porque de estarlo, no obtendrías el error que comentas.

    Si ahora obtienes ese error, es porque seguramente has compilado tu proyecto de Visual Basic para 32 bits, y al haber desinstalado Office 2007 de 32 bits, también has desinstalado la versión de 32 bits del proveedor 'Microsoft.ACE.OLEDB.12.0'. Lo que tendrías que hacer ahora es compilar tu aplicación para que SOLAMENTE SE EJECUTE en plataformas de 64 bits.

    Si tu deseas tener un equipo preparado para desarrollar aplicaciones que hacen uso del proveedor de datos 'Microsoft.ACE.OLEDB.12.0' (bases de Access, archivos de Excel, de texto delimitado), tienes que tener instaladas las versiones de 32 y de 64 bits del mencionado proveedor, para que tus aplicaciones que compiles para 32 y 64 bits funcionen correctamente en ambas plataformas.

    Eso por un lado, y por otro, deberías de saber que la arquitectura de Visual Studio es de 32 bits, incluida tu versión de 2013, por lo que también necesitarás la versión de 32 bits del proveedor 'Microsoft.ACE.OLEDB.12.0' si vas a crear conexiones con bases de datos de Access desde la ventana Explorador de servidores de Visual Studio, por eso te comenté en una respuesta más arriba que me extrañaba que tu Visual Studio 2013 fuera de 64 bits, simplemente porque no existe. ;-)

    Como dices que has desinstalado Office 2007, y por ende la versión de 32 bits del proveedor 'Microsoft.ACE.OLEDB.12.0', y que has instalado las versiones de 64 bits tanto de Office 2013 como del controlador de Access 2010, lo que tienes que hacer ahora es descargar e instalar el  Controlador de Office 2007 System, que solamente está disponible en 32 bits, para que puedan funcionar tus aplicaciones .NET que compiles para plataformas de 32 bits con dicho proveedor de datos y también puedas crear conexiones a orígenes de datos de Access desde tu Visual Studio.

    Quizás te estés preguntando por qué tienes que instalar el controlador de Office 2007 si lo has desinstalado previamente, y creo haberte comentado anteriormente en esta ya larga conversación que llevamos para exportar a SQL Server los datos de una hoja de Excel (operación que se suele hacer en un abrir y cerrar de ojos), que no puedes instalar un Office de 64 bits si tienes instalada una versión de 32 bits, pero sí puedes instalar el controlador de Office 2007 indicado aunque tengas una versión de Office 2010 o superior de 64 bits instalada. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.






    jueves, 28 de julio de 2016 5:50
    Moderador