1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Zur laufzei DatenbankFile erstellen

Dieses Thema im Forum ".NET Datenverwaltung" wurde erstellt von 10110010, 14. Oktober 2016.

  1. 10110010

    10110010 Mitglied

    Hallo,

    Ich habe mir eine Projekt gebaut, mit dessen Hilfe ich einfach Daten aus eine Datenbank lesen und schreiben kann. Jetzt möchte ich darin aber auch eine Methode bereitstellen, die demnach eine Datei erzeugt und in dieser dann die Datenbank mit Tabellen bereitstellt.
    Ich weis allerdings zu der Zeit nicht, um welche Datenbank es sich handelt (SQL, SQLite, FireBird, ...).
    Ich verwende somit die Schnittstellen IDbConnection der mithilfe von System.Data.Common.DbProviderFactories.GetFactory(this.ProviderName).CreateConnection() erzeugt wird.
    Jetzt möchte ich bei nichtvorhanden sein der DB-Datei eine anlegen und diese Füllen.
    Ich finde lauter Spezifische Beispiele für SQLite. Würde aber gerne unspezifisch bleiben.

    Geht das? Anhand der ProviderFactories sollte doch eigentlich das System wissen, für welchen Typ er die Datei an zu legen hat, oder?

    Gruß
    10110010
     
  2. Halfbax

    Halfbax Erfahrenes Mitglied

    Aber du bearbeitest doch vorher die Datenbank dann weißt du doch welches Datenbanksystem verwendet wird, oder versteh ich da was falsch?

    Stichwort: SQL Server Export/Import Manager

    Nachtrag: Geht es dir nur um Inhalt der Tabellen, oder die SQL Datei zum re-import?

    Gruss,
    Halfbax
     
  3. 10110010

    10110010 Mitglied

    Hallo,

    Das Projekt ist eine Hilfe zur verwendung von Datenbanken. Das heist, ich binde die Dll in mein Projekt ein, in dem ich eine Datenbank verwenden möchte und übergebe meiner Hilfsklasse alle Verbindungsparameter. Welche Datenbank dahinter hängt, weis mein Helper nicht.

    Der Helper arbeitet Datenbantyp unspezifich (deshalb IDbConnection).

    Ich möchte halt einfach in meinen Klassen, via Attribute, festlegen, welche Tabelle diese repräsentiert und pelche Properties in die Tabellenspalten geschrieben werden sollen.

    Das sind die Infos, die mein Helper kennt.
    Demnach möchte ich bei nicht vorhandensein der Datei die Tabellen mit den Spalten erstellen.

    Ziel ist es ein Objectkonstrukt zu erstellen und dem Helper zu überlassen die datenbank dazu zu erstellen.

    Und ja, ich möchte meinen Helper dafür verwenden und keine DataAdapter von ADO.NET!
     
  4. Halfbax

    Halfbax Erfahrenes Mitglied

    Eine Möglichkeit wäre es ein Objectkonstrukt via DataContext zu erstellen. Dabei nutzt du am besten LINQ
     
  5. 10110010

    10110010 Mitglied

    Hm... der DataContext ist ja schon eine nette idee.
    Würde den gerne für das erzeugen der Datenbank verwenden.
    Gibt es eine Möglichkeit, DataContext.CreateDatabase() auszuführen ohne tabellen zu haben?
     
  6. Halfbax

    Halfbax Erfahrenes Mitglied

    Inwiefern, willst du das Objekt vordefinieren? Weiß deine Helper-Klasse denn bereits die Struktur?

    Grüße,
    Halfbax
     
  7. 10110010

    10110010 Mitglied

    Meine Helperklasse kennt die Struktur bereits.
    Ich möchte halt erstmal eine Leere Datenbank. In meinem Test mit SQLite eine leete SQLite-Datei.
     
  8. Halfbax

    Halfbax Erfahrenes Mitglied

    Wenn ich das richtig verstanden habe, willst du eine eine leere Datenbank (Verbindung steht) binden? Wenn ja binde die einfach auf das DataContext Objekt. Ansonsten erstell eine Klasse/Struct und binde diese dem DataContext Objekt.
     
  9. 10110010

    10110010 Mitglied

    Nein, die Verbindung steht nicht.
    Bei SQLite gibt man als Datenbank die Datei an. genau die will ich erzeugen. Bei einem SQL-Server ist mir klar, dass ich eine Verbindung mit der Instanz aufnehmen muss und da dann die DB anlege.
    Ich habe mal folgendes Probiert:

    Code (Text):
    1. IDbConnection connection = System.Data.Common.DbProviderFactories.GetFactory(this.ProviderName).CreateConnection(); //In meinem test SQLite
    2.             connection.ConnectionString = this.ConnectionString; //Data Source=Source.db
    3.             DataContext context = new DataContext(connection);
    4.            
    5.             if (context.DatabaseExists())
    6.             {
    7.                 return false;
    8.             }
    9.  
    10.             context.CreateDatabase();//<-- Hier bekomme ich einen Fehler, dass keine Tabelle vorhanden ist.
    Habe demnach mal das hier probiert:

    Code (Text):
    1. IDbConnection connection = System.Data.Common.DbProviderFactories.GetFactory(this.ProviderName).CreateConnection(); //In meinem test SQLite
    2.             connection.ConnectionString = this.ConnectionString; //Data Source=Source.db
    3.             Test context = new Test(connection);
    4.            
    5.             if (context.DatabaseExists())
    6.             {
    7.                 return false;
    8.             }
    9.  
    10.             context.CreateDatabase();
    Code (Text):
    1. internal class Test : DataContext
    2.     {
    3.         public Table<Dummy> Dummys;
    4.         public Test(IDbConnection connection) : base(connection) { }
    5.     }
    6.     [System.Data.Linq.Mapping.Table(Name = "Dummy")]
    7.     internal class Dummy
    8.     {
    9.         [System.Data.Linq.Mapping.Column]
    10.         public string Spalte;
    11.     }
    jetzt bekomme ich den Fehler:
    Zusätzliche Informationen: SQL logic error or missing database
    near "DATABASE": syntax error
     
  10. Halfbax

    Halfbax Erfahrenes Mitglied

    Probier es mal bitte mit (Testzwecken).
    Code (C#):
    1.     internal class Test : DataContext
    2.     {
    3.         public Table<TestTable> testTable;
    4.         public Test(IDbConnection connection) : base(connection) { }
    5.     }
    6.  
    7.  
    8.     [Table(Name = "TestTable")]
    9.     internal class TestTable
    10.     {
    11.         [Column(IsPrimaryKey = true)]
    12.         public int? id { get; set; }
    13.  
    14.         [Column]
    15.         public string title { get; set; }
    16.     }
     
  11. 10110010

    10110010 Mitglied

    Selber Fehler.
     
  12. 10110010

    10110010 Mitglied

    Habe das Problem gefunden.
    SQLite ist nicht suported.

    only SQL Server and SQL Server CE are supported
     
  13. Halfbax

    Halfbax Erfahrenes Mitglied

    Da muss ich mich wohl entschuldigen, darüber habe ich mir garkeinen Kopf gemacht, denn bisher habe ich noch nie mit SQLite gearbeitet. Andere Möglichkeit du baust dir eine Serialization.
     
  14. 10110010

    10110010 Mitglied

    Habe mir jetzt was anderes einfallen lassen.
    Danke für deine Hilfe.
     
Die Seite wird geladen...