Laden...

Gibt es eine Datenbank, die lokal im Projekt liegt & in der Linq-to-sql funktioniert?

Erstellt von jok3r89 vor 5 Jahren Letzter Beitrag vor 5 Jahren 4.679 Views
J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren
Gibt es eine Datenbank, die lokal im Projekt liegt & in der Linq-to-sql funktioniert?

Hallo,
ich mache gerade die ersten Schritte mit einer SQL Datenbank,
Ich habe eine Software geschrieben und bisher habe ich alle Daten immer in XML Dateien gespeichert.
Jetzt wage ich aber den Umstieg auf eine SQL Datenbank, und blicke beim besten willen nicht durch wo sich die einzelne Datenbanken unterschieden und welche für mich die beste Wahl wäre

Was ich suche ist eine Datenbank die local im Projekt liegt und wo linq to Sql funktioniert , geht das?

Gruß

2.078 Beiträge seit 2012
vor 5 Jahren

Ich kenne drei Optionen: LocalDB, SQLite und SqlCE
SqlCE ist allerdings nicht mehr zu empfehlen, das wird nicht mehr supported.
LocalDB und SQLite basieren beide auf einer einzelnen Datei und brauchen keinen kompletten Datenbank-Server drum herum.

Wie Du darauf zugreifst, kannst Du hier nachlesen:
http://openbook.rheinwerk-verlag.de/visual_csharp_2012/

Das EntityFramework macht die Zugriffe wunderbar einfach und für alle drei Optionen gibt's entsprechende Provider.
Alternativ gibt es noch nHibernate, das bis auf einige Feinheiten sehr ähnlich zum EntityFramework ist.
Und als neuste Option gibt es das EntityFrameworkCore. Das ist eine neu aufgesetzte EntityFramework-Version, die auf .NET Standard basiert. Es unterstützt noch lange nicht so viele Funktionen wie sein Vorgänger, es wird aber noch daran gearbeitet und gefällt mir persönlich am besten.

Am meisten Erfahrung hab ich mit nHibernate, für ein kleines, schnell aufgebautes pragmatisches Projekt ist das vermutlich die beste Option.

M
368 Beiträge seit 2006
vor 5 Jahren

Der Bericht der DotNetPro könnte auch weiterhelfen: SQLite mit C#/VB.NET nutzen (die Beispiele hantieren mit ADO.NET)

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉

2.078 Beiträge seit 2012
vor 5 Jahren

Wobei man dazu sagen muss:
Das ADO.NET, wie es dort gezeigt wird, ist zwar sehr flexibel und transparent, allerdings muss man die meisten Aktionen in Form von Commands selber machen. Das ist auf Dauer sehr aufwändig, deshalb gibt es ORMs wie EntityFramework oder nHibernate, die versprechen, dass das alles automatisch läuft und man (fast) nur noch mit Klassen und C# (insbesondere LINQ) arbeitet.
Was man nun lieber mag, da kann man vortrefflich drüber streiten und findet bei jedem Projekt eine andere Antwort. Ich persönlich würde für kleine (Spaß-)Projekte immer ein vollständiges ORM verwenden, einfach aus Faulheit. Für eine große Business-Anwendung, die permanent zig tausende Datenzeilen hin und her schaufeln/lesen/schreiben muss, bietet sich eventuell an, auf ein vollständiges ORM zu verzichten - schon allein wegen der Performance.

Dabei fällt mir aber ein, es gibt noch ein weiteres Framework: Dapper
Damit tut man im Prinzip immer noch sehr viel alleine, allerdings übernimmt Dapper das nervige Mappen gegen Klassen. Allerdings kann es so einige Features nicht, die bei großen ORMs (Dapper bezeichnet sich als Micro ORM) ganz normal sind.

F
10.010 Beiträge seit 2004
vor 5 Jahren

@Palladin007:

LocalDB und SQLite basieren beide auf einer einzelnen Datei und brauchen keinen kompletten Datenbank-Server drum herum.

Stimmt für SQLite, aber LocalDB braucht einen installierten SQLServer Express in der LocalDB variante, ist also nicht wirklich ohne Server benutzbar.

Und für SQLite empfehle ich immer SQLite-NET, einfacher geht es wirklich nicht.

J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren

Okay schon mal danke, ich hatte nebenbei schon ein wenig was gemacht.

Ich bin einige Tutorials durch gegangen und hab jetzt im Projekt
ein Database.mdf und eine DataClasse.dbml also die linq klasse.
Ich steh jetzt nur ein wenig auf dem Schlauch, wo liegt denn jetzt die Datenbank?
Auch konnte ich wenn ich was hinzugefügt habe die Datensätze nicht sehen ?
SQL Lite hätte mir schon auch gefallen einzig was mir aufgefallen ist ich kann die Datensätze nicht beobachten(SQL Server like)?

Gruß

4.931 Beiträge seit 2008
vor 5 Jahren

LinqToSql ist veraltet und funktioniert nur mit dem MS SQL Server, d.h. du mußt diesen installiert haben (nicht bloß die .mdf-Datei im Projekt).

Für SQLite kann ich dir SQLiteStudio empfehlen.
Und für die Anbindung stimme ich FZelle zu: nimm SQLite-NET.

J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren

SQLLite ich schaue mir das mal an.
Also der SQLLite Studio funktioniert schon mal, ich hab auch gleich mal ein wenig damit gespielt. Gibts da nicht ne Möglichkeit den Designer im VS17 dafür zu benutzen?

16.806 Beiträge seit 2008
vor 5 Jahren

LingToSql ist veraltet und funktioniert nur mit dem MS SQL Server

Nein...? 🤔
Linq2SQL ist Teil der ADO.NET Familie....wie auch das Entity Framework.

Gibts da nicht ne Möglichkeit den Designer im VS17 dafür zu benutzen

Einen Designer solltest Du Dir aus dem Kopf schlagen.
Da gibt es nichts aktuelles. Allgemein ist Code First der moderne Ansatz.

F
10.010 Beiträge seit 2004
vor 5 Jahren

Und das ding heißt SQLite ( mit einem L ) das macht das suchen leichter.
Vorallem findet man dann für VS.NET die Extension "SQLite / Sql Server Compact Toolbox" von ErikEJ.

Damit hat man dann einen Server Explorer in VS.NET und man kann sich für SQLite-NET gleich die entities erzeugen lassen.

J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren

Ich mach gerade meine Anfänge, bisher funktionierte alles ganz gut.
Jetzt versuche ich gerade meinen Code um zu tippen, Ich kann Datenbank Einträge lesen aber er fügt nichts hinzu.
Mach ich was falsch?
Gruß


        private void btn_Add_Click(object sender, EventArgs e)
        {

            using (SQLiteConnection con = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;"))
            {
                con.Open();
                string stm = "Select Max(id) From plc";

                using (SQLiteCommand cmd = new SQLiteCommand(stm, con))
                {
                    using (SQLiteDataReader rdr = cmd.ExecuteReader())
                    {
                        if (rdr.Read()){
                            int maxID = (Int32)rdr.GetInt32(0);
                            Console.WriteLine("insert plc at ID " + maxID + 1);

                            using ( SQLiteCommand wr = new SQLiteCommand("INSERT INTO plc (id, name, ip, target, cycle)" +
                                                                        " VALUES (@id, @name, @ip, @target, @cycle)", con))
                            {
                                wr.Parameters.AddWithValue("@id", maxID+1);
                                wr.Parameters.AddWithValue("@name", textBox_name.Text);
                                wr.Parameters.AddWithValue("@ip", textBox_ip.Text);
                                wr.Parameters.AddWithValue("@target", comboBox_typ.Text);
                                wr.Parameters.AddWithValue("@cycle", textBox_cylce.Text);
                            }

                        }else
                        {

                        }
                        
                        
                    }
                }
                con.Close();
            }
            ListView_Refresh();
        }
F
10.010 Beiträge seit 2004
vor 5 Jahren

Mach ich was falsch?Mach ich was falsch?

Das Du einfach drauf los Codest ohne dir die Grundlagen anzuschauen.

Wo führst du das Command denn aus?

J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren

Irgendwann muss man ja auch mal anfangen...
Ehrlich gesagt versteh ich deine Frage gerade nicht. Dieses program ist ein WindowsForm und das Codeschnippsel wird durch einen Btn ausgelöst.

Gruß

edit:
okay ich habs verstanden, Danke!
Ich hab wohl beim verschieben was gelöscht...
->
wr.ExecuteNonQuery();

2.078 Beiträge seit 2012
vor 5 Jahren

Zwei kleine Tipps am Range:

Verwende sinnvolle Namen für Variablen, Methoden, etc.
Wo z.B. erkennt man an "wr", dass es ein SQLiteCommand ist und noch besser, was soll ein Command namens "wr" tun? (Das gilt übrigens auch für Tabellen-Namen)
Ich würde da zwei Wege in Betracht ziehen: Ein sinnvoller Variablen-Name oder eine Methode, die nur für diesen einen Command da ist. Im letzteren Fall wäre mir der Command-Variablen-Name auch egal, es wird ja schon durch den Methoden-Namen klar, was das Ding tut.

Und da sind wir schon bei Tipp Nr. Zwei: Teile deinen Code in sinnvolle Methoden auf, sodass eine Methode immer überschaubar bleibt (Faustregel: Nicht länger als man ohne Scrollen lesen kann) und nicht mehr als eine Aufgabe gleichzeitig erledigt.

Wenn Du das beides befolgst, passieren dir auch solche Schussel-Fehler nicht so schnell 😉

J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren

Ja das ist mir klar, das hier sind eher kleine Testversuche.

Ich finde bisher Linq to sql doch ein wenig eleganter, was haltet ihr davon? Ich hab schon darüber gelesen das man es auch für SQLite benutzen könnte?

2.078 Beiträge seit 2012
vor 5 Jahren

LINQ to SQL als ORM ist veraltet, nutz das lieber nicht.
Das EntityFramework ist der Quasi-Nachfolger und dessen Nachfolger (zwecks Platformunabhängigkeit) ist EntityFrameworkCore.
Daneben ist NHibernate noch sehr bekannt, es gibt aber noch einige Andere.

LINQ unterstützen sie aber alle, den eleganten Vorteil, dass LINQ zu SQL "konvertiert" wird, bekommst Du bei jedem dieser ORMs.

F
10.010 Beiträge seit 2004
vor 5 Jahren

Und SQLite-NET oder Linq2DB sind beides ORMapper die mit SQLite zusammenarbeiten und eben auch Linq abfragen auf die DB erlauben.

T
2.219 Beiträge seit 2008
vor 5 Jahren

Ich würde dir zu EF Core raten.
Die SQLite Anbindung gibt es über NuGet direkt fertig.
Dann kannst du direkt mit EF Core die Daten ohen viel Aufwand per Code First verarbeiten.
Alternativ kannst du auch Dapper verwenden, wenn du direkt Zugriff auf ADO.NET Ebene willst.
Dann bist du so nah an der DB, wie man mit .NET nur sein kann.
Die Performance kann dann auch u.U. um längen besser sein als bei EF Core.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

4.931 Beiträge seit 2008
vor 5 Jahren

LinqToSql ist veraltet und funktioniert nur mit dem MS SQL Server

Nein...? 🤔
Linq2SQL ist Teil der ADO.NET Familie....wie auch das Entity Framework.

Hallo Abt,

s. Linq2SQL auf dem Abstellgleis

(oder hast du dich mit linq2db vertan?)

T
2.219 Beiträge seit 2008
vor 5 Jahren

@Th69
Ich denke mal, Abt meinst schon Linq2SQL.
Und wie er schreibst, ist es auch Teil von EF und EF Core.
In EF Core kann man mittels Linq2SQL sogar dynamische Filterfunktionen auf die Entity Sets anwenden.

Als reine Lösung dürfte Linq2SQL aber nicht mehr anzutreffen sein, bzw. kenne ich kein Projekt was mit Line2SQL ohne andere Lösungen auskommt.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.806 Beiträge seit 2008
vor 5 Jahren

Und wie er schreibst, ist es auch Teil von EF und EF Core.

Nein, ist es nicht. Hab ich auch nicht geschrieben 😉

LINQ 2 SQL ist ein Parallelprodukt von Entity Framework (EF Core klammer ich mal aus).
MS hat damals entschieden den kompletten Stack neu zu entwickeln, woraus eben EF entstand.

Man kann es meinetwegen als veraltet betiteln; aber wem das simple Konstrukt, das als Feature Complete gilt, von L2S ausreicht; why not?
Klar gibt es besser Alternativen (zB Dapper) aber EF als "Ersatz" zu sehen würde ich auch nicht ganz.
Vielleicht hab ich mich am Begriff "veraltet" schwer getan, weil Microsoft mit dem EF einfach kein wirklichen Nachfolger gebracht hat, sondern einen großen, langsamen monolithen - das sie jetzt mit EF Core reparieren wollen.

An für sich ist das aber Off-Topic.
Der Threadstarter hat hier ja bereits SQlite genannt bekommen; was ich auch für relationale Daten so auch nur unterstützen kann.
(Für nicht-relationale Daten: LiteDB).

J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren

Ich hab mir jetzt mal das EF auch angesehen.
Was soll ich sagen ich bin nach der MS Anleitung vorgegangen, aber es will nicht so recht funktionieren(siehe Anhang)

J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren

Der Fehler...
System.ArgumentException: "Keyword not supported: 'version'."

Irgendwas ging hier bei der Implementierung schief... ist sowas bekannt?

P
441 Beiträge seit 2014
vor 5 Jahren

Irgendwas ging zur Laufzeit schief 😃

Hast du denn mal Google bemüht mit deinem Fehler?
Brauchst du zwingend die Versionsangabe im Connection String - in der offiziellen Doku bzw. Codebeispiel daraus ist die auch nicht drin (da bin ich übrigens mit "ef core sqlite version" via google hingekommen).

J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren

Hmm leider bisher nichts gefunden was mir weiterhilft.
Ich hab die Version mal rausgenommen.

Jetzt gibts einen anderen Fehler

Fehlermeldung:
Microsoft.Data.Sqlite.SqliteException: "SQLite Error 1: 'no such table: PLCSets'."

Mal sehen evtl bringt mich das ans Ziel

edit. Jetzt gehts gar nima 😄

PM> Update-Database
Both Entity Framework Core and Entity Framework 6 are installed. The Entity Framework Core tools are running. Use 'EntityFramework\Update-Database' for Entity Framework 6.
Applying migration '20180521181709_db'.
Failed executing DbCommand (2ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE "DbSets" (
    "id" INTEGER NOT NULL CONSTRAINT "PK_DbSets" PRIMARY KEY AUTOINCREMENT,
    "adress" INTEGER NOT NULL,
    "lengh" INTEGER NOT NULL,
    "name" TEXT NULL,
    "offset" INTEGER NOT NULL,
    "plcId" INTEGER NOT NULL,
    "varId" INTEGER NOT NULL
);