Announcement

Collapse
No announcement yet.

SQLite ohne Installation

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQLite ohne Installation

    Hallo Leute,

    ich habe folgendes Problem.
    Ich habe eine Anwendung geschrieben, die mit Daten einer SQLite Datenbank arbeitet.
    Auf der Entwicklungsumgebung funktioniert das auch wunderbar.
    Aber wenn ich das auf den Win 10 Rechner meines Vaters kopiere, erhallte ich den Fehler, dass der Provider nicht gefunden werden kann.
    Auf dem ist auch soweit nichts in der Art installiert.

    Zu Begin der Anwendung wird folgendes ausgeführt:

    Code:
    CreateProvider("SQLite Data Provider", ".Net Framework Data Provider for SQLite", "System.Data.SQLite", "System.Data.SQLite.SQLiteFactory, System.Data.SQLite");
    
    public void CreateProvider(string provider, string description, string name, string type)
            {
                try
                {
                    System.Data.DataSet dataSet = System.Configuration.ConfigurationManager.GetSection("system.data") as System.Data.DataSet;
                    DataRow rowToDelete = null;
                    foreach (DataRow row in dataSet.Tables[0].Rows)
                    {
                        if ((row["InvariantName"] as string) == name)
                        {
                            rowToDelete = row;
                        }
                    }
                    if (rowToDelete != null)
                    {
                        dataSet.Tables[0].Rows.Remove(rowToDelete);
                    }
                    dataSet.Tables[0].Rows.Add(provider, description, name, type);
                    DataTable factoryClasses = System.Data.Common.DbProviderFactories.GetFactoryClasses();
                    foreach (DataRow row in factoryClasses.Rows)
                    {
                        System.Diagnostics.Trace.WriteLine(row.ItemArray[2].ToString());
                    }
                }
                catch (System.Data.ConstraintException) { }
            }
    Der Trace gibt auch den SQLite aus!
    Damit sollte der Provider ja eigentlich public gemacht werden.

    im Connect findet das hier statt:

    Code:
    System.Data.Common.DbProviderFactories.GetFactory("System.Data.SQLite").CreateConnection();
    Aber genau da kommt die Exception.

    in dem Projekt habe ich angegeben, dass x86 verwendet werden soll und in dem Appverzeichniss liegen
    - System.Data.SQLite.dll
    - System.Data.SQLite.EF6.dll
    - System.Data.SQLite.Linq.dll

    Woran liegt dass, dass der den Provider nicht findet.

  • #2
    Hallo,

    Vielleicht helfen diese Links:
    http://stackoverflow.com/questions/2...-on-windows-10
    http://igrali.com/2015/05/01/using-s...niversal-apps/
    PHP rocks!
    Eine Initiative der PHP Community

    Comment


    • #3
      Hallo,

      Leider helfen die Links nicht weiter.
      Ich habe das mal auf anderen Rechnern probiert.
      Dort funktioniert die Ausführung.

      Das Besondere an den Rechnern war, dass auf jedem das Visual Studio installiert ist.
      Kann es daran liegen?
      Was würde dann fehlen?

      Comment


      • #4
        Starte auf den Rechner mal den Process Monitor.
        Dort kannst du verfolgen nach welchen DLL's oder Registry Einträgen gesucht wird.

        Die fehlende DLL sollte sich so schnell finden lassen.

        Gruss

        Comment


        • #5
          Je nach SqlLite Paket das du installiert hast brauchst du noch die nativen Treiber oder passende Konfig dateien oder ... Eigentlich solle zum Treiber ein Deployment Dokument gehören das du durchlesen solltest.

          Zum Beispiel könntest du die Mixed Mode System.Data.SQLite.dll erwischt haben die für 32 bit kompiliert ist du hast aber eine Net. Anwendung programmiert mit AnyCPU einstellungen. Wenn dein Ziel Rechner nun 64bit ist wird die 32bit Mixed Mode Assembly nicht mehr funktionieren wenn deine Net. Anwendung im 64Bit Modus läuft.

          Comment


          • #6
            Hallo,

            ich habe die Anwendung auf 32Bit gestellt.
            Da würde auch eine Format-Exception kommen.

            Ebenso habe ich mal den Process-Monitor verwendet.
            Der scheint ein Problem zu haben, System.Transaction zu laden.
            System.DataSQLite finde ich in der Liste. Die wird also gefunden.

            Aber System.Transactions ist im GAC.

            Was nun?

            Comment


            • #7
              Poste mal die ganze Exception. Vielleicht lässt sich das auch anders interpretieren.

              Comment


              • #8
                Hier die Exception:

                System.Configuration.ConfigurationErrorsException: Der registrierte .Net Framework-Datenprovider kann nicht gefunden bzw. geladen werden.
                bei System.Data.Common.DbProviderFactories.GetFactory( DataRow providerRow)
                bei System.Data.Common.DbProviderFactories.GetFactory( String providerInvariantName)
                bei ArSSch.Data.Common.Db.Connect()


                eigentlich ein klassischer Fall!

                Comment


                • #9
                  Hier die Providerliste des PC's bei dem es nicht geht:

                  Odbc Data Provider | .Net Framework Data Provider for Odbc | System.Data.Odbc | System.Data.Odbc.OdbcFactory, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
                  OleDb Data Provider | .Net Framework Data Provider for OleDb | System.Data.OleDb | System.Data.OleDb.OleDbFactory, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
                  OracleClient Data Provider | .Net Framework Data Provider for Oracle | System.Data.OracleClient | System.Data.OracleClient.OracleClientFactory, System.Data.OracleClient, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
                  SqlClient Data Provider | .Net Framework Data Provider for SqlServer | System.Data.SqlClient | System.Data.SqlClient.SqlClientFactory, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
                  SQLite Data Provider | .Net Framework Data Provider for SQLite | System.Data.SQLite | System.Data.SQLite.SQLiteFactory, System.Data.SQLite

                  Und hie die, bei dem es geht:

                  Odbc Data Provider | .Net Framework Data Provider for Odbc | System.Data.Odbc | System.Data.Odbc.OdbcFactory, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
                  OleDb Data Provider | .Net Framework Data Provider for OleDb | System.Data.OleDb | System.Data.OleDb.OleDbFactory, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
                  OracleClient Data Provider | .Net Framework Data Provider for Oracle | System.Data.OracleClient | System.Data.OracleClient.OracleClientFactory, System.Data.OracleClient, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
                  SqlClient Data Provider | .Net Framework Data Provider for SqlServer | System.Data.SqlClient | System.Data.SqlClient.SqlClientFactory, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
                  Microsoft SQL Server Compact Data Provider | .NET Framework Data Provider for Microsoft SQL Server Compact | System.Data.SqlServerCe.3.5 | System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=3.5.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91
                  Microsoft SQL Server Compact Data Provider 4.0 | .NET Framework Data Provider for Microsoft SQL Server Compact | System.Data.SqlServerCe.4.0 | System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91
                  MySQL Data Provider | .Net Framework Data Provider for MySQL | MySql.Data.MySqlClient | MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.5.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d
                  SQLite Data Provider | .Net Framework Data Provider for SQLite | System.Data.SQLite | System.Data.SQLite.SQLiteFactory, System.Data.SQLite

                  Comment


                  • #10
                    Das bedeutet, denke ich, das die Einstellungen in den Config Dateien zum Provider fehlen. Die Assemblies sind nicht gemeint.

                    Die Einstellungen sollen in deiner App.Config Datei liegen wenn dem ,auch bei dir lokal wo es funktioniert, nicht der Fall ist dann war der SQLite Provider möglicherweise so böse und hat das in die machine.config eingetragen.
                    Sollte das in der App.config liegen solltest du die auch mitdeployen.

                    Machine.config liegt in "DeinWindowsOrdner/Microsoft.Net/Framework/DeineVerwendeteFrameworkVersion/Config/"
                    Je nach Bittigkeit musst du in Framework64 gucken nicht in den Framework Ordner.

                    PS. Warum benutzt du überhaupt die ProviderFactory? Willst du SqLite austauschen können? Du würdest dir das leben deutlich einfacher machen wenn du die SqLite assemblies einfach referenzierst.

                    Comment


                    • #11
                      Hallo,

                      in den Machine.config sind die Einträge nicht enthallten.
                      Dafür ist die Methode CreateProvider da.
                      in der App.config ist auch nichts enthallten.
                      wenn ich die Zeilen auskommentiere in der Methode, dann erhallte ich auf meinem Entwicklungssystem auch den selben Fehler!

                      Ich mache das über die Facktory, weil ich mir eine Datenbanklasse gebaut habe, die via Attribute an den Eigenschaften meiner Objecte eine Datenbank erzeugt und die passenden Tabellen, so dass ich diese Objecte in der Datenbank speichern kann.
                      dazu sollte es egal sein, welche Datenbank da liegt.
                      Deshalb verwende ich keine Spezifischen Klassen von SQLite.

                      Comment


                      • #12
                        Ok. Die CreateProvider Methode sieht für mich nach Voodoo aus (wo ist die Rückkopplung das das was man in irgendeine In-Memory DataTable schreibt auch wieder in der Config landet?). Aber wenn die Traceausgabe das passende liefert glaube ich das mal. Und andere scheinen ja damit laut Google erfolgt gehabt zu haben

                        Mir würde noch einfallen das du auf deinem Rechner mal die machine.config wegkopierst und durch die machine.config.default die im selben Ordner liegt ersetzt. Wenn das dann auf deinem Rechner auch nicht mehr geht hast du zumindest die Chance das mit mehr Möglichkeiten zu debuggen. Im anderen Fall (es geht) können wir dann zumindest die machine.config aus der Problemrechnung nehmen.

                        Hat die ConfigurationErrorsException eventuell noch eine InnerException?

                        Comment


                        • #13
                          Hallöle,

                          habe die Config wie du beschrieben hast getauscht. Funktioniert alles super.
                          Ich habe mal ein kleines Projekt angehängt.
                          Vielleicht kannst du das auch bei dir nachstellen.

                          wie kann ich das den noch debuggen?

                          Die Files liegen auf meiner Dropbox.

                          SQLite-Test

                          Comment


                          • #14
                            Interessanterweise ging es genau einmal bei mir. Danach lande ich ebenfalls in der ConfigurationErrorsException.
                            Ich konnte jetzt nicht feststellen was an meinem System geändert wurde. Die configs wurden nicht getoucht. Ein Reboot ändert nix. Ich schau mal weiter ob ich irgendeine Systemänderung finde.

                            Wenn du VMWare Benutzer bis wäre es hier bestimmt hilfreich ein virtuelle Machine zu haben um die immer wieder zurücksetzen zu können.


                            PS. Jetzt geht es dauerhaft. Vermutlich habe ich nur beim experimentieren irgendwas kaputt gemacht und es lag nicht am Projekt sondern an mir
                            Zuletzt editiert von Ralf Jansen; 10.12.2015, 23:42.

                            Comment


                            • #15
                              Das heist also, dass du das problemlos ausführen kannst?
                              Was kann das dann noch sein?

                              Comment

                              Working...
                              X