Zur laufzei DatenbankFile erstellen

#1
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
#2
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
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!
 
#5
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
#8
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
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
#10
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
#13
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.
 

Neue Beiträge