none
Problema con conexión a SQLite RRS feed

  • Pregunta

  • Hola a todos:

    Tengo el problema de que al conectar con SQLite me indica que el proveedor no existe. Tengo instada la referencia a Sytem.Data.SQLite Versión:1.0.99.0 en Windows 7, VB 2015 y compilando a 64 bits.

    Entiendo que el problema puede ser por que no existe dicho proveedor en la factoria de proveedores ya que siempre me indica que el proveedor no existe.

     Public Sub New(providerInvariantName As String, connectionString As String)
    
            ' Antes que el método GetFactory de la clase DbProviderFactories genere
            ' la excepción, la generamos nosotros mismos para personalizar el mensaje
            ' de la excepción.
            '
            If (String.IsNullOrWhiteSpace(providerInvariantName)) Then
                Throw New ArgumentException("No se ha especificado el nombre del proveedor de datos.")
            End If
    
            m_connectionString = connectionString
            m_providerInvariantName = providerInvariantName
    
            ' Creamos la factoría. Se distingue entre mayúsculas y minúsculas.
            '
            m_factory = DbProviderFactories.GetFactory(m_providerInvariantName)
    
        End Sub
    Ahí (en negrita) salta la excepción de que el proveedor no existe.

    La cadena de conexión que utilizo es:

      <add name="PerseoSQLite" connectionString="Data Source=|DataDirectory|\PerseoSQLite.db;Version=3;New=False;Compress=True"
          providerName="System.Data.SQLite.EF6" />

    y como se ve en la App.Config está instalada la dll en la carpeta del directorio del programa. Debug.

    He probado varias cosas y siempre me dice lo mismo, que el proveedor no existe. Trabajo con factoría de proveedores.

    No se que me falta o que tengo mal.

    Bueno, si veis algo me lo indicáis por favor.

    Un saludo.

    Gemma


    • Editado gemma_campillo sábado, 12 de marzo de 2016 10:41 Ampliar pregunta
    sábado, 12 de marzo de 2016 7:54

Respuestas

  • "gemma_campillo" escribió:

    > Tengo el problema de que al conectar con SQLite me indica que el proveedor
    > no existe. Tengo instada la referencia a Sytem.Data.SQLite Versión:1.0.99.0
    > en Windows 7, VB 2015 y compilando a 64 bits.
    >
    > Entiendo que el problema puede ser por que no existe dicho proveedor en la
    > factoria de proveedores ya que siempre me indica que el proveedor no existe.

    ¿Ya has terminado de trabajar con los otros proveedores de datos y ahora le toca el turno a SQLite? ¡Madre mía en qué "charco" te vas a meter! Y no lo digo porque quieras trabajar con SQLite. ;-)

    ¡Vamos a ver! Si obtienes el siguiente mensaje de error


    Efectivamente se debe a que en el archivo Machine.config de tu Windows 7 no está registrado el proveedor invariable para SQLite.

    Como dices que estás compilando tu aplicación para 64 bits, abre el Explorador de Windows y te diriges a la siguiente carpeta:

        C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config

    Haz doble clic en el archivo machine.config y busca la sección <system.data><DbProviderFactories>. Mira a ver si te aparecen los siguientes registros:

        <add name="SQLite Data Provider" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6, Version=1.0.99.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />

        <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.99.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />

    Si no te aparecen, ese el motivo del error que obtienes, que estás intentando hacer uso de un proveedor que no se encuentra registrado en la factoría de proveedores invariables.

    Pero yo no te voy a aconsejar que edites dicho archivo para añadir los registros anteriores, porque aparte que se puede fastidiar si no sabemos bien lo que estamos haciendo, tampoco es sumamente necesario añadirlos al archivo machine.config, que dicho sea de paso, no estaría de más que hicieras una copia de seguridad de dicho archivo y la guardes en algún lugar seguro por lo que pueda pasar. ¿De acuerdo?

    Abre el archivo app.config de tu aplicación e inserta las siguientes secciones después de finalizar la sección </connectionStrings>:

        <system.data>
            <DbProviderFactories>
            <clear />
            <add name="SQLite Data Provider" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6, Version=1.0.99.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    
            <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.99.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
            </DbProviderFactories>
        </system.data>

    Guarda las modificaciones efectuadas y prueba de nuevo a establecer una conexión con la base de datos de SQLite utilizando la cadena de conexión con nombre PerseoSQLite que figura en el archivo de configuración de tu aplicación:

    Fíjate en el elemento <clear />

       <DbProviderFactories>
           <clear />

    Te advierto que ese elemento hará que no se tengan en cuenta los valores existentes en la sección <DBProviderFactories> del archivo de configuración del equipo, el archivo machine.config, por eso te he comentado que no hace falta modificar dicho archivo para registrar los proveedores de SQLite o de cualquier otro proveedor.

    Elemento <clear> para <configSections>

    > La cadena de conexión que utilizo es:
    >
    > <add name="PerseoSQLite" connectionString="Data Source=|DataDirectory|\PerseoSQLite.db;Version=3;
               New=False;Compress=True" providerName="System.Data.SQLite.EF6" />
    >
    > y como se ve en la App.Config está instalada la dll en la carpeta del directorio del programa. Debug.

    Ahí no se ve ninguna DLL. Lo que se ve son los parámetros de la cadena de conexión con nombre llamada "PerseoSQLite", pero nada más. Lo que hace falta es que el ensamblado de SQLite se encuentre debidamente registrado en la Caché Global de Ensamblados (GAC) de tu equipo, que para una compilación de 64 bits utilizando la versión 4.0 o superior del marco de trabajo de .NET, el ensamblado de SQLite tendrá que aparecer en la ruta C:\Windows\Microsoft.NET\assembly\GAC_64\System.Data.SQLite:


    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.





    sábado, 12 de marzo de 2016 11:33
    Moderador

Todas las respuestas

  • "gemma_campillo" escribió:

    > Tengo el problema de que al conectar con SQLite me indica que el proveedor
    > no existe. Tengo instada la referencia a Sytem.Data.SQLite Versión:1.0.99.0
    > en Windows 7, VB 2015 y compilando a 64 bits.
    >
    > Entiendo que el problema puede ser por que no existe dicho proveedor en la
    > factoria de proveedores ya que siempre me indica que el proveedor no existe.

    ¿Ya has terminado de trabajar con los otros proveedores de datos y ahora le toca el turno a SQLite? ¡Madre mía en qué "charco" te vas a meter! Y no lo digo porque quieras trabajar con SQLite. ;-)

    ¡Vamos a ver! Si obtienes el siguiente mensaje de error


    Efectivamente se debe a que en el archivo Machine.config de tu Windows 7 no está registrado el proveedor invariable para SQLite.

    Como dices que estás compilando tu aplicación para 64 bits, abre el Explorador de Windows y te diriges a la siguiente carpeta:

        C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config

    Haz doble clic en el archivo machine.config y busca la sección <system.data><DbProviderFactories>. Mira a ver si te aparecen los siguientes registros:

        <add name="SQLite Data Provider" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6, Version=1.0.99.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />

        <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.99.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />

    Si no te aparecen, ese el motivo del error que obtienes, que estás intentando hacer uso de un proveedor que no se encuentra registrado en la factoría de proveedores invariables.

    Pero yo no te voy a aconsejar que edites dicho archivo para añadir los registros anteriores, porque aparte que se puede fastidiar si no sabemos bien lo que estamos haciendo, tampoco es sumamente necesario añadirlos al archivo machine.config, que dicho sea de paso, no estaría de más que hicieras una copia de seguridad de dicho archivo y la guardes en algún lugar seguro por lo que pueda pasar. ¿De acuerdo?

    Abre el archivo app.config de tu aplicación e inserta las siguientes secciones después de finalizar la sección </connectionStrings>:

        <system.data>
            <DbProviderFactories>
            <clear />
            <add name="SQLite Data Provider" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6, Version=1.0.99.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    
            <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.99.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
            </DbProviderFactories>
        </system.data>

    Guarda las modificaciones efectuadas y prueba de nuevo a establecer una conexión con la base de datos de SQLite utilizando la cadena de conexión con nombre PerseoSQLite que figura en el archivo de configuración de tu aplicación:

    Fíjate en el elemento <clear />

       <DbProviderFactories>
           <clear />

    Te advierto que ese elemento hará que no se tengan en cuenta los valores existentes en la sección <DBProviderFactories> del archivo de configuración del equipo, el archivo machine.config, por eso te he comentado que no hace falta modificar dicho archivo para registrar los proveedores de SQLite o de cualquier otro proveedor.

    Elemento <clear> para <configSections>

    > La cadena de conexión que utilizo es:
    >
    > <add name="PerseoSQLite" connectionString="Data Source=|DataDirectory|\PerseoSQLite.db;Version=3;
               New=False;Compress=True" providerName="System.Data.SQLite.EF6" />
    >
    > y como se ve en la App.Config está instalada la dll en la carpeta del directorio del programa. Debug.

    Ahí no se ve ninguna DLL. Lo que se ve son los parámetros de la cadena de conexión con nombre llamada "PerseoSQLite", pero nada más. Lo que hace falta es que el ensamblado de SQLite se encuentre debidamente registrado en la Caché Global de Ensamblados (GAC) de tu equipo, que para una compilación de 64 bits utilizando la versión 4.0 o superior del marco de trabajo de .NET, el ensamblado de SQLite tendrá que aparecer en la ruta C:\Windows\Microsoft.NET\assembly\GAC_64\System.Data.SQLite:


    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.





    sábado, 12 de marzo de 2016 11:33
    Moderador
  • Hola maestro:

    Ahora si, eso es lo que necesitaba. Aparte de la solución, la explicación es lo que más agradezco.

    No te asustes que por ahora solo hay 3 proveedores funcionando a la perfección, el Access, Sql Server Express y SqlCompact 4.0. Realmente he tenido que retocar muy pocas sentencias, y una vez retocadas funcionan perfectamente. Nada más voy a meter 2 proveedores más SqlLite y MySQL, quedarán si se necesitan Posygredd y Oracle, pero bueno, eso mas adelante.

    Enrique gracias otra vez como siempre. Esto ya se va acabando y solo quedará ir añadiendo nuevos análisis en el futuro.

    Bueno, me pongo con todo ello y te envío un abrazo muy fuerte.

    Gemma

    sábado, 12 de marzo de 2016 17:56