Forum: PC-Programmierung Datenbank mit C#


von Minipli-Thomas (Gast)


Lesenswert?

Hallo,

ich denke darüber nach, in Zukunft unter Windows 7 und folgenden 
Windows-Betriebssystemen Datenbank-Software im klassischen 
Fenster-Design mit C# zu programmieren.

Ein paar Sachen sind mir leider noch unklar, da benötige ich mal eure 
Hilfe:

Zunächst die Wahl der Datenbank-Systems selbst...Es gibt da ja unter 
anderem z.B. MS SQL Server Compact, MS SQL Server Express und MySQL in 
die engere Wahl gezogen. Wegen der Beschränkungen bei MS SQL Express 
glaube ich kaum, dass ich diese Grenzen in absehbarer Zukunft 
überschreiten werde.
Bei Compact kann ich glaube ich nur lokal auf dem Client auf die 
Datenbank zugreifen.

MySQL kenne ich von Webservern, da kann man dann wohl auch mal eine 
Datenbank programmieren, an der viele Leute gleichzeitig arbeiten. Wie 
würde man mit C# und MS SQL Express so etwas wie einen Server und 
diverse Clients programmieren, die dann über das Internet auf den Server 
zugreigen?

Bei Express und MySQL bin ich mir nicht sicher, wo da abgesehen von der 
unterschiedlichen Syntax die wesentlichen Unterschiede bestehen?
Kann man mit allen drei Dialekten einfach und schnell Transaktionen 
durchführen? Also ungefähr so:
1. BeginTransaktion
2. Diverse Querys nacheinander auf die DB loslassen...
3. CommitTransaktion
4. Ggf. Rollback.

Dann die Wahl des Connectors...ADO.NET, ODBC oder dieses LINQ? Was nimmt 
man da am besten und funktioniert ODBC z.B. auch nach dem nächsten 
Visual C# Express ServicePack noch?

Irgendwo habe ich gelesen, dass man die Abfragen und ähnliches besser 
als Parameter an Funktionen übergibt("abkapseln"), um eine spätere 
Portierung auf ein anderes Datenbank-System zu erleichtern. Da ist mir 
nicht ganz klar ob und wie das mit LINQ funktioniert...

Und ich frage mich, wie sinnvoll dieses Abkapseln ist, wenn es gewisse 
Unterschiede in der Syntax der verschiedenen Dialekte zu geben scheint?

Schöne Grüße...Thomas

von Borislav B. (boris_b)


Lesenswert?

Darf ich vielleicht noch SQLite ins Rennen werfen? Davon gibts auch eine 
Version für C#.

Der Vorteil ist: das Ding ist super klein (wenige KB), und kann direkt 
mit der Anwendung als Assembly ausgeliefert werden. Eine 
Extra-Installation und ein im Hintergrund laufender Server sind nicht 
notwendig.
Für den Anwender ist das somit deutlich angenehmer (ich hasse es, wenn 
eine Anwendung mir mein System mit fetten Datenbank-Systemen 
vollstopft).

von Minipli-Thomas (Gast)


Lesenswert?

Hallo Boris,

klar darfst Du das! Ich habe aufgrund Deines Vorschlags z.B. den 
folgenden C#-Wrapper gefunden:
http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki
Ist das der Richtige?
Gibt es da noch andere? Falls ja, welchen sollte man benutzen und warum?

Schöne Grüße...Thomas

von Borislav B. (boris_b)


Lesenswert?

Einen .NET Wrapper zu benutzen ist die eine Möglichkeit:
https://github.com/praeclarum/sqlite-net

Es gäbe auch noch eine komplett in C# geschriebene Version:
http://code.google.com/p/csharp-sqlite/

von ♪Geist (Gast)


Lesenswert?

Ich würde dir auch stark SQLite empfehlen, da die Datenbank Datei 
portabel ist. Für anspruchsvolle Sachen würde ich MySQL nehmen, geht 
easy in C#.

von Mehmet K. (mkmk)


Lesenswert?

SQlite hat den einen kleinen nicht zu vernachlaessigen Nachteil: wie 
sehr der Kunde auch beteuert, dass die Anwendung nur Single-User 
Anwendung sei und bleiben werde: spaetestens nach dem 2. Jahren kommt er 
mit der Forderung nach Multi-User. Und da hat man mit SQlite ein 
Problem.

von Ich (Gast)


Lesenswert?

Hallo,
wirf mal einen Blick auf MongoDB.org. Tolle Datenbank!

von funky (Gast)


Lesenswert?

MongoDB hat aber einen vollkommen anderen Ansatz als eine "normale" SQL 
Datenbank und sicherlich nicht für Einsteiger geeignet.

Nimm MySQL, damit hat man erstmal zu tun bis das ausgereizt ist.
Sollen Daten hauptsächlich gelesen werden, dann geht auch SQLite wobei 
das eben kein richtiges Datenbanksystem ist.
Was soll das ganze denn werden? Hört sich jetzt eher nach privatem 
ausprobieren, mal rumspielen an & verstehen der Technik an

von Peter II (Gast)


Lesenswert?

also wenn du schon unter windows mit C# arbeitest dann würde ich MS-SQL 
verwenden. Da würde ich mir mysql nicht antun. (je nach Storatype gehen 
Contraints, foreign keys, Transaktionen nicht oder so sachen wie case 
insensitive Tabellennamen ).

von Ich (Gast)


Lesenswert?

funky schrieb:
> MongoDB hat aber einen vollkommen anderen Ansatz als eine "normale" SQL
> Datenbank und sicherlich nicht für Einsteiger geeignet.

Gerade diese "andere" Ansatz ist es, der den Umgang mit MongoDB so 
elegant und einfach gestaltet.

von Der (Gast)


Lesenswert?

Eine Option wäre sicherlich der Microsoft SQL Server Compact

http://www.microsoft.com/en-us/download/details.aspx?id=17876

Zusammen mit den EntiyFramework hast du gute Optionen.

>Bei Compact kann ich glaube ich nur lokal auf dem Client auf die
>Datenbank zugreifen.

Grundsätzlich hat das aber was mit der Architektur zu tun, etwas weniger 
mit den DB. Auch eine DB, welche mehrere gleichzeitige Zugriffe erlaubt, 
schützt dich nicht vor einer Lösung um konkurrenzierende Zugriffe auf 
die Daten zu verwalten.

Ein Weg ist es sicherlich, in den Clients nicht via DB Verbindungen zu 
arbeiten sondern via REST/WebService eine Service Factory aufzubauen, 
welche ihre Daten in einer DB (oder wo auch immer) hält. Nachteil, etwas 
mehr Overhead in der Umsetzung aber dafür via HTTP. z.B. hier die RIA 
Services.

von Robert L. (lrlr)


Lesenswert?

nimm ein Framework dass mehrere datenbanksysteme unterstützt

sowas wird es ja wohl hoffentlich auch für C# geben..

von Borislav B. (boris_b)


Lesenswert?

Robert L. schrieb:
> nimm ein Framework dass mehrere datenbanksysteme unterstützt

Warum nicht gleich eine Datenbank, die das leistet was er braucht?
Es ist ja nicht so, dass die man die Datenbank jede Woche wechseln 
will...

von Robert L. (lrlr)


Lesenswert?

>die das leistet was er braucht?

genau deshalb:

wer weiß da schon, was man braucht ;-)

von Arc N. (arc)


Lesenswert?

Robert L. schrieb:
> nimm ein Framework dass mehrere datenbanksysteme unterstützt
>
> sowas wird es ja wohl hoffentlich auch für C# geben..

Das ist eingebaut seit es .NET gibt...
Ob man jetzt bspw. LINQ gegen eine ausgewachsene MSSQL, Oracle, 
irgendwas oder lokal bspw. gegen eine Liste mit Objekten im Speicher 
ausführt macht keinen Unterschied.
http://blogs.msdn.com/b/knom/archive/2009/04/27/linq-to-everywhere-list-of-linq-providers.aspx
(irgendwo gibt's mit Sicherheit auch eine aktuellere Liste zusätzlicher 
LINQ-Provider)

von Peter II (Gast)


Lesenswert?

Arc Net schrieb:
> Ob man jetzt bspw. LINQ gegen eine ausgewachsene MSSQL, Oracle,
> irgendwas oder lokal bspw. gegen eine Liste mit Objekten im Speicher
> ausführt macht keinen Unterschied.

gilt aber nur wenn man nicht anspruchsvolles mit einer Datenbank machen 
will. Jede Datenbank hat fähigkeiten die über den normale SQL 
hinausgehen. Da muss man sich halt fragen was man will.

von Robert L. (lrlr)


Lesenswert?

@ Peter II

du meinst, man müsste sich dann auf den "kleinsten gemeinsamen nenner" 
einlassen

scheint aber nicht (ganz) zu stimmen:

hab gesehen, dass es z.b.  Transaktionen geben würde, bei LINQ
auch wenn bestimmte Datenbank das bestimmt nicht unterstützen..

und: bestimmte Sachen, wegen 2% Performancesteigerung einfach mal nicht 
zu machen (Server-Seitige Trigger usw.) ist jetzt langfristig nicht 
unbedingt immer ein Nachteil..

aber ja: "es kommt drauf an" ist sicher die einzige "richtige" antwort..

man sollte trotzdem möglichkeiten aufzählen dürfen...

(oft sucht sich auch der Kunde die Datenbank aus: "ich hab M$ SQL Server 
und was anders kommt mir nicht ins Haus" ;-) )

von Peter II (Gast)


Lesenswert?

Robert L. schrieb:
> bestimmte Sachen, wegen 2% Performancesteigerung einfach mal nicht
> zu machen (Server-Seitige Trigger usw.) ist jetzt langfristig nicht
> unbedingt immer ein Nachteil..

ich arbeite (sehr) viel mit SQL-Server. Dort gibt es z.b.

Row_Number (http://msdn.microsoft.com/de-de/library/ms186734.aspx)

und solche sachen wie

select
  sum() over( partition by xyz )
from
  askdf

http://msdn.microsoft.com/de-de/library/ms189461.aspx

das kenn ich von keiner andere DB. (wenn vorhanden, dann bestimmt einen 
anderen Syntax)

oder

merge http://msdn.microsoft.com/de-de/library/bb510625.aspx

damit bekommt man nicht nur 2% Performancesteigerung sondert kann sich 
dazu noch viel Code sparen.

Damit legt man sich aber auf die Datenbank fest.

von ahellwig (Gast)


Lesenswert?

Minipli-Thomas schrieb:

> Irgendwo habe ich gelesen, dass man die Abfragen und ähnliches besser
> als Parameter an Funktionen übergibt("abkapseln"), um eine spätere
> Portierung auf ein anderes Datenbank-System zu erleichtern.

Dafür gibt es das Repository-Entwurfsmuster:

http://martinfowler.com/eaaCatalog/repository.html
http://devtyr.norberteder.com/post/Das-Repository-Pattern-anhand-eines-Beispiels-inkl-Tests.aspx

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.