Zur laufzei DatenbankFile erstellen


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
 

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
 

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!
 

Halfbax

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

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?
 

Halfbax

Erfahrenes 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?
Inwiefern, willst du das Objekt vordefinieren? Weiß deine Helper-Klasse denn bereits die Struktur?

Grüße,
Halfbax
 

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.
 

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.
 

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:
IDbConnection connection = System.Data.Common.DbProviderFactories.GetFactory(this.ProviderName).CreateConnection(); //In meinem test SQLite
            connection.ConnectionString = this.ConnectionString; //Data Source=Source.db
            DataContext context = new DataContext(connection);
           
            if (context.DatabaseExists())
            {
                return false;
            }

            context.CreateDatabase();//<-- Hier bekomme ich einen Fehler, dass keine Tabelle vorhanden ist.

Habe demnach mal das hier probiert:

Code:
IDbConnection connection = System.Data.Common.DbProviderFactories.GetFactory(this.ProviderName).CreateConnection(); //In meinem test SQLite
            connection.ConnectionString = this.ConnectionString; //Data Source=Source.db
            Test context = new Test(connection);
           
            if (context.DatabaseExists())
            {
                return false;
            }

            context.CreateDatabase();

Code:
internal class Test : DataContext
    {
        public Table<Dummy> Dummys;
        public Test(IDbConnection connection) : base(connection) { }
    }
    [System.Data.Linq.Mapping.Table(Name = "Dummy")]
    internal class Dummy
    {
        [System.Data.Linq.Mapping.Column]
        public string Spalte;
    }

jetzt bekomme ich den Fehler:
Zusätzliche Informationen: SQL logic error or missing database
near "DATABASE": syntax error
 

Halfbax

Erfahrenes Mitglied
Probier es mal bitte mit (Testzwecken).
C#:
    internal class Test : DataContext
    {
        public Table<TestTable> testTable;
        public Test(IDbConnection connection) : base(connection) { }
    }


    [Table(Name = "TestTable")]
    internal class TestTable
    {
        [Column(IsPrimaryKey = true)]
        public int? id { get; set; }

        [Column]
        public string title { get; set; }
    }
 

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.