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ß
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.
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 😉
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.
@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.
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ß
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.
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?
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.
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();
}
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?
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();
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 😉
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?
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.
Und SQLite-NET oder Linq2DB sind beides ORMapper die mit SQLite zusammenarbeiten und eben auch Linq abfragen auf die DB erlauben.
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.
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?)
@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.
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).
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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)
Der Fehler...
System.ArgumentException: "Keyword not supported: 'version'."
Irgendwas ging hier bei der Implementierung schief... ist sowas bekannt?
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).
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
);