Datenbank mit C#

Gast #3129943
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
#3129965
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).
#3130094
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.
Gast #3130207
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
Gast #3130214
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 ).
Gast #3130346
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.
#3130451
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)
Gast #3130460
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.
#3130534
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" ;-) )
Gast #3130540
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.
Gast #3137395
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren