25
Walter Doberenz, Thomas Gewinnus Datenbankprogrammierung mit Visual C# 2010

Walter Doberenz, Thomas Gewinnus 531 Caching 532 Weitere Methoden 532 Ereignisse 533 Zugriff auf Geschäftsobjekte mit der ObjectDataSource 534 Verbindung zwischen Objekt und DataSource

Embed Size (px)

Citation preview

Walter Doberenz, Thomas Gewinnus

Datenbankprogrammierung mit Visual C# 2010

Kurzübersicht

Vorwort 31

1 Erste Schritte 35

2 Einführung in LINQ 85

3 SQL in Theorie und Praxis 123

4 Einführung ADO.NET 217

5 Das DataSet-Objekt im Detail 311

6 Windows Forms-Datenbindung 397

7 Datenbindung - WPF 479

8 Datenbindung in ASP.NET-Anwendungen 523

9 Die Microsoft Chart-Controls 651

10 Reporting Services 683

11 Crystal Report 759

12 Access-Datenbanken 825

13 Microsoft SQL Server-Einstieg 903

14 Microsoft SQL Server-Programmierung 961

15 SQL Server Compact 1061

16 SQLite - Ein Mini ganz groß 1097

17 UNQtoSQL 1121

18 Arbeiten mit dem Entity Framework 1171

19 WCF - eine Einführung 1259

20 Einführung WCF Data Services 1307

21 Komplexbeispiel Webshop 1341

Stichwortverzeichnis 1413

Inhaltsverzeichnis

Die Bonuskapitel 3,11,17 und 21 finden Sie als PDF-Datei auf der beiliegenden CD. Im Inhaltsverzeichnis sindsie durch ein CD-Symbol gekennzeichnet.

Vorwort 31

Erste Schritte 35Unsere Werkstatt 36

Betriebssystem 36Internet Information Server 36Visual Studio 2010 39SQL Server 2008 oder Express Edition 39Microsoft Access 40

C# und die Datenbankprogrammierung 40Zur Geschichte des universellen Datenzugriffs 41Merkmale webbasierter Anwendungen 42Ein Wort zum .NET-Sicherheitskonzept 45

Was ist neu in .NET 4.0/Visual Studio 2010? 46Die verschiedenen Pakete 46Die Visual C#-Entwicklungsumgebung 47

- Neuheiten im Framework 4.0 48C# 4.0: Sprache und Compiler 49

Ein wenig Datenbanktheorie 50Normalisieren von Tabellen 50Verknüpfen von Tabellen 54Weitere wichtige Begriffe 59

Einführungsbeispiele 601.1 ... auf eine lokale Access-Datenbank zugreifen? 611.2 ... mit dem Microsoft SQL Server arbeiten? 661.3 ... eine einfache LINQ to SQL-Anwendung schreiben? 691.4 ... eine einfache ASP.NET-Webanwendung entwickeln? 711.5 ... meine erste WPF-Anwendung erstellen? 771.6 ... einen einfachen WCF-Dienst entwickeln? 80

Einführung in LINQ 85Die LINQ-Philosophie 86

OOP-Modell versus relationales Modell 86Besonderheiten beim ORM 87Ein erstes LINQ-Beispiel 88Der Weg zu LINQ 90

LINQ-Grundlagen 92Typinferenz 93Objekt-Initialisierer 94

Inhaltsverzeichnis

Erweiterungsmethoden 97Lambda-Ausdrücke 98

Abfragen mit LINQ to Objects 100Grundlegende Syntax 100Zwei alternative Schreibweisen von LINQ-Abfragen 101Die wichtigsten Abfrageoperatoren 102Die Projektionsoperatoren Select und SelectMany 104Der Restriktionsoperator Where 106Die Sortierungsoperatoren OrderBy und ThenBy 106Der Gruppierungsoperator GroupBy 108Verknüpfen mit Join 110Aggregat-Operatoren 111Verzögerte Ausführung von LINQ-Abfragen 112Konvertierungsmethoden 113Abfragen mit PLINQ 114

How-to-Beispiele 1162.1 ... LINQ-Abfragen verstehen? 1162.2 ... nichtgenerische Collections abfragen? 119

/^ 3^SQL in Theorie und Praxis 123I ,., f Einführung 124\ y-:f\) SQL-Dialekte 124\^ \ ! Kategorien von SQL-Anweisungen 125

'"" ^ Testprogramm und Beispieldatenbank 126Hinweise zur Bedienung 127Unsere Beispieldatenbank im Überblick 127Alternative Varianten für die SQL-Abfrage 128Bemerkungen 131

Daten abfragen 131Abfragen mit SELECT 131Alle Spalten auswählen 132Auswahl der Spalten 133Filtern 134Beschränken der Ergebnismenge 140Eindeutige Records/doppelte Datensätze 142Tabellen verknüpfen 143Tabellen vereinigen 146Datensätze sortieren 147Datensätze gruppieren 148Unterabfragen 149

Daten manipulieren 154Einfügen einzelner Datensätze 154Einfügen von Abfragedaten 155Exportieren/Importieren von Abfragedaten 157Aktualisieren/Ändern 160Löschen 160

Erweiterte SQL-Funktionen 161Berechnete/Formatierte Spalten 162Berechnungsfunktionen 169

171172178179181181182183

dem 185186188191191192193193193195195196199

hlerfeld abfragen? 199rmitteln? 200he nutzen? 200berücksichtigen? 201PTION verwenden? .: 201ren? 202,er Tabelle löschen? 203

204irogramm erstellen? 205ten? 207

209features unterstützen? 213

213213

;-SQL 214

217218218219222

Klassen 222223223224226

;r Verbindung 229230

10 Inhaltsverzeichnis

Verbindungspooling 231Transaktionen 231Eigenschaften des Connection-Objekts 232Methoden des Connection-Objekts 234Ereignisse des Connection-Objekts 235Der ConnectionStringBuilder 236ConnectionString in den Anwendungseinstellungen speichern 237

Das Command-Objekt 238Erzeugen und Anwenden eines Command-Objekts 238Erzeugen mittels CreateCommand-Methode 239Eigenschaften des Command-Objekts 239Methoden des Command^Objekts 242Freigabe von Connection- und Command-Objekten 243

Parameter-Objekte 244Erzeugen und Anwenden eines Parameter-Objekts 244Eigenschaften des Parameter-Objekts 245

Das CommandBuilder-Objekt 247Erzeugen 247Anwenden 247Einsatzbeschränkungen 248Einige Regeln 248Optimistisches Konkurrenzmodell 249

Das DataReader-Objekt 249DataReader erzeugen 249Daten lesen 250Eigenschaften des DataReaders 251Methoden des DataReaders 251

Das DataAdapter-Objekt 251DataAdapter erzeugen 252Command-Eigenschaften 253Fill-Methode 253Update-Methode 254UpdateCommand und Parameter-Objekte 255InsertCommand und DeleteCommand 257MissingSchemaAction-Eigenschaft 259RowUpdating- und RowUpdated-Ereignis 260

Arbeiten mit Excel-Arbeitsmappen 262Zugriffsmöglichkeiten 262OLE DB-Connectionstring 263Zugriff auf Excel 2007/2010-Arbeitsmappen 264Neue Mappen erstellen 265Daten in ein Tabellenblatt eintragen 266Daten aktualisieren 267Daten auslesen 267Zugriff auf Tabellenbereiche 269OLE-Automation 270

Weitere Features des Datenzugriffs unter ADO.NET 273Auslesen von Datenbankschemas 273Providerfabriken 273

Inhaltsverzeichnis 11

How-to-Beispiele 2744.1 ... wichtige ADO.NET-Objekte schnell kennen lernen? 2744.2 ... eine Aktionsabfrage ausführen? "— 2764.3 ... Daten direkt zur Datenbank hinzufügen oder löschen? 2784.4 ... eine Access-Auswahlabfrage ausführen? 2814.5 ... parametrierte Abfragen ausführen? 2844.6 ... die Datenbank aktualisieren? 2874.7 ... RowUpdating-/RowUpdated-Ereignisse verstehen? 2914.8 ... Schemainformationen der Datenbank abrufen? 2944.9 ... einen Connectionstring verschlüsseln? 2974.10 ... eine klassische Datenzugriffsschicht entwickeln? 299

Übersichten 305Datentypen 305Connection-Objekt 305Command-Objekt 306Parameter-Objekt 307DataReader-Objekt 307DataAdapter 308CommandBuilder 309

Das DataSet-Objekt im Detail 311Einführung 312

Das Objektmodell 312Methoden zum Erzeugen eines DataSets 314Weitere wichtige Methoden des DataSets 316Die XML-Fähigkeiten des DataSets 317

Das DataTable-Objekt 319DataTable erzeugen 319Spalten hinzufügen 320Berechnete Spalten 321Primärschlüssel ergänzen 322Einbinden von Constraints 323Hinzufügen von Relationen 325Zeilen zur DataTable hinzufügen 328Auf den Inhalt einer DataTable zugreifen 329Weitere Hinweise zum Bearbeiten von Zeilen 332Zeilen löschen 333Zeilenstatus und Zeilenversion 334Ereignisse des DataTable-Objekts 337

Datenansichten mit Data View 338Erzeugen eines Data View 339Sortieren und Filtern von Datensätzen 339Suchen von Datensätzen 340Zeilenansicht mit DataRowView 341

Weitere DataSet-Features 342Umwandlungen zwischen DataSet und DataReader 342Binäre Serialisierung für DataSet/DataTable 344Die DataTable kann mehr XML 344Schnelles Laden von DataSets 344

12 Inhaltsverzeichnis

Typisierte DataSets 345Was ist ein typisiertes DataSet? 345Das Datenquellen-Konzept 347Typisierte DataSets und TableAdapter 348

LINQ to DataSet 350Untypisierte DataSets abfragen 351Typisierte DataSets abfragen 352Abhängigkeiten zwischen den Tabellen auflösen 353

Die Qual der Wahl 355DataReader - der schnelle Lesezugriff 355DataSet - die Datenbank im Hauptspeicher 355Objektrelationales Mapping - die Zukunft? 356

How-to-Beispiele 3575.1 ... eine DataTable erzeugen und in einer Binärdatei speichern? 3575.2 ... eine DataTable in einer XML-Datei abspeichern? 3615.3 ... Master-Detailbeziehungen im DataGrid anzeigen? 3625.4 ... in einem DataView sortieren und filtern? 3645.5 ... nach Datensätzen suchen? 3655.6 ... vereinfacht nach Datensätzen suchen? 3685.7 ... zwischen DataTable und DataReader umwandeln? 3705.8 ... große Datenmengen in ein DataSet laden? 3725.9 ... ein DataSet binär serialisieren? 3745.10 ... ein DataSet in einen XML-String konvertieren? 3775.11 ... ein untypisiertes in ein typisiertes DataSet laden? 3825.12 ... ein typisiertes DataSet mit LINQ abfragen? 3865.13 ... mit LINQ to DataSet die Datenbank aktualisieren? 388

Übersichten 391DataSet 391DataTable 392DataColumn 393DataRow 394DataView 395

Windows Forms-Datenbindung 397Einführung 398Manuelle Datenbindung an einfache Datenfelder 399

BindingSource erzeugen 399Binding-Objekt 400DataBindings-Collection 400Bindungen löschen 401Bemerkungen 401

Manuelle Datenbindung an Listen und Tabelleninhalte 402DataGridView 402Datenbindung von ComboBox und ListBox 402

Entwurfszeit-Datenbindung an ein typisiertes DataSet 403Drag & Drop-Datenbindung 404Navigieren im DataSet 405

Vor- und Rückwärtsblättern 405Hinzufügen und Löschen 405

Inhaltsverzeichnis 13

Aktualisieren und Abbrechen 405BindingNavigator 406

Die Anzeige formatieren 406Das DataGridView 407

Vom DataGrid zum DataGridView 407Grundlegende Datenbindung 408Standardmäßige Anzeige und Bedienung 409Wichtige Spalteneinstellungen 410Automatische Größenanpassungen 411Selektieren von Zellen 413Columns- und Rows-Auflistungen 414DataGridViewCellStyle-Objekte 415Spaltentypen 418Editieren im DataGridView 421Fehlerbehandlung 421Eingabeprüfung .- 422

How-to-Beispiele 4236.1 ... eine Objekt-Datenquelle verwenden? 4236.2 ... Steuerelemente an einen Objektbaum binden? 4276.3 ... Detailinformationen mit ListBox/ComboBox anzeigen? 4336.4 ... Steuerelemente manuell an ein DataSet binden? 4356.5 ... zwei Formulare an eine Datenquelle binden? 4406.6 ... mittels ComboBox zwei Tabellen verknüpfen? 4456.7 ... ein typisiertes DataSet manuell binden? 4496.8 ... l:n-Beziehungen per Drag & Drop-Datenbindung anzeigen? 4546.9 ... die Spalten im DataGridView formatieren? 4566.10 ... mit DataReader und ListView arbeiten? 4586.11 ... Bilder aus der Datenbank anzeigen? 4626.12 ... BLOB-Daten verwalten? 4646.13 ... BLOB-Daten anzeigen? 4666.14 ... das DataGridView als Datenbank-Frontend verwenden? 4676.15 ... Datenbindung mit LINQ to SQL kennen lernen? 4736.16 ... den DataRepeater für die Anzeige verwenden? 477

Datenbindung - WPF 479Grundprinzip 480

Bindungsarten 481Wann wird eigentlich die Quelle aktualisiert? 482Bindung zur Laufzeit realisieren 483

Binden an Objekte 484Objekte im Code instanziieren 484Verwenden der Instanz im C#-Quellcode 486Anforderungen an die Quell-Klasse 487Instanziieren von Objekten per C#-Code 488

Binden von Collections 489Anforderung an die Collection 489Einfache Anzeige 490Navigieren zwischen den Objekten 491Einfache Anzeige in einer ListBox 493

Inhaltsverzeichnis

DataTemplates zur Anzeigeformatierung 494Mehr zu List- und ComboBox 495Verwendung der ListView .; 496

Ein Blick hinter die Kulissen 498Navigieren in den Daten 499Sortieren 500Filtern , 501

Drag & Drop-Datenbindung 501Vorgehensweise 501Weitere Möglichkeiten 504

Formatieren von Werten 505IValueConverter 506BindingBase.StringFormat-Eigenschaft 508

Das DataGrid als Universalwerkzeug 508Grundlagen der Anzeige 509Vom Betrachten zum Editieren 513

How-to-Beispiele 5137.1 ... Datenbindung unter LINQ to SQL realisieren? 5137.2 ... Drag & Drop-Bindung für Master/Detail-Beziehungen umsetzen? 518

Datenbindung in ASP.NET-Anwendungen 523Übersicht Datenbindung unterASP.NET 524

Grundkonzept 525DataSource-Steuerelemente 525

SqlDataSource im Detail 526Datenauswahl mit Parametern 528Parameter für INSERT, UPDATE und DELETE 529FilterExpression 531Caching 532Weitere Methoden 532Ereignisse 533

Zugriff auf Geschäftsobjekte mit der ObjectDataSource 534Verbindung zwischen Objekt und DataSource 534Ein Beispiel sorgt für Klarheit 535Geschäftsobjekte in einer Session verwalten 539

Typisierte DataSets und ObjectDataSource 541Verwendung von TableAdaptern in ASP.NET-Seiten 541Datenauswahl und Anzeige mit TableAdaptern 542Datenmanipulation mit TableAdaptern 546ObjectDataSource und typisierte DataSets 548

LinqDataSource 553Bindung von einfachen LINQ-Collections 553Binden eines LINQ to SQL-DataContext 555Berechnete Spalten/Detaildaten 556Eigene LINQ-Ausdrücke zur Laufzeit übergeben 558Filtern mit der LinqDataSource 559

EntityDataSource 560Entity Data Model erstellen 560EntityDataSource anbinden 563

Inhaltsverzeichnis "

Datenmenge filtern 566QueryExtender 566

Grundlagen 567Suchen 568Sortieren 570

Weitere Datenquellen 571Spezialfall AccessDataSource ". 571Verwalten strukturierter Daten mit der XmlDataSource 571

Das GridView-Steuerelement im Detail 572Auswahlfunktion (Zeilenauswahl) 573Auswahl mit mehrspaltigem Index realisieren 574Hyperlink-Spalte für Detailansicht nutzen 574Spalten erzeugen/konfigurieren 575Template-Spalten verwenden 576Paging im GridView realisieren 580Editieren und Löschen im GridView 581Einfügen von Datensätzen 581Keine Daten, was tun? 582

Weitere Steuerelemente für die Datenbindung 582DetailsView 582Form View 585DataList 588Repeater 590ListView 592Label/TextBox 596CheckBoxList, BulletList, RadioButtonList, DropDownList, ListBox 597Hierarchische Datenanzeige mittels TreeView-Control 599Chart-Control 602

Eingabeprüfung mit den Validator-Steuerelementen 604Übersicht 604Wo findet die Fehlerprüfung statt? 604Verwendung 605RequiredFieldValidator 606CompareValidator 606RangeValidator 608RegularExpressionValidator 609CustomValidator 610ValidationSummary 612Weitere Möglichkeiten der Validation-Steuerelemente 613

Reports in ASP.NET-Anwendungen verwenden 613Der Microsoft ReportViewer 613Direkter ExceWPDF-Export 615Parameterübergabe an lokale Reports 618

Weitere Themen 618Dynamic Data 618ASP.NET MVC 626AJAX 630

Inhaltsverzeichnis

How-to-Beispiele 6338.1 ... die Zellen im GridView formatieren? 6338.2 ... ein GridView mit Scrollbar realisieren? 6358.3 ... ein GridView mit Mouseover-Effekt realisieren? 6368.4 ... GridView-Daten im Excel-Format exportieren? 6378.5 ... Detaildaten in einem Popup-Fenster anzeigen? 6408.6 ... eine Zeilensumme im GridView berechnen? 6438.7 ... reagieren, wenn keine Daten vorhanden sind? 6438.8 ... im GridView eine Spaltensummen berechnen? 6448.9 ... korrekte Währungswerte im GridView anzeigen? 6458.10 ... Eingabewerte im GridView validieren? 6468.11 ... einen E-Mail-Versand in ASP.NET realisieren? 647

9 Die Microsoft Chart-Controls 651Allgemeine Chart-Features 652

Serien/Reihen und Datenpunkte direkt erzeugen 652Den Diagrammtyp ändern 6533D-Darstellung 656Farben für Serien und Datenpunkte 656Leere Datenpunkte 657Diagramm drucken 658Diagramm exportieren/abspeichern 658

Einführung in die Chart-Datenbindung 659Manuelle Datenbindung mittels Points.AddXY-Methode 659Übersicht über die speziellen Datenbindungsmethoden 661Unterstützte Datenquellen 662

Spezielle Chart-Datenbindungsmethoden 662Die DataBindTable-Methode 662DataBind-Methode/DataSource-Eigenschaft 665Die DataBindCrossTable-Methode 666Die Points.DataBind-Methode 668Die Points.DataBind(X)Y-Methoden 669

How-to-Beispiele 6729.1 ... das Chart-Control zur Laufzeit mit Daten füllen? 6729.2 ... das Chart mit einer LINQ to SQL-Abfrage verbinden? 6749.3 ... mit ASP.NET ein Diagramm anzeigen? 676

10 Reporting Services 683Übersicht 684

Report Designer 684Report Viewer 684

Einführungsbeispiele 685Der erste Bericht - so einfach geht das! 685Ein zweiter Bericht - weg mit dem Assistenten! 690

Unsere Werkzeuge zum Berichtsentwurf 695Oberfläche des Report-Designers 695Toolbox 695Bericht-Menü 697

Inhaltsverzeichnis

Berichtsdaten-Fenster 698Programmieren mit Visual Basic 700

Sortieren, Gruppieren und Filtern von Datensätzen 703Allgemeines 703Sortieren .- 705Gruppieren 705Filtern 707

Kreuztabellenberichte , 708Einfache Matrix 708Zeilen- und Spaltensummen anzeigen 709Zusätzliche berechnete Spalten einfügen 710Matrix mit zwei Zeilengruppen 710Bilder anzeigen 711Ein Bild in den Bericht einbetten 712Bilder aus einer Datenbank 713Externe Bilder 713Hintergrundbilder 713

Diagramme darstellen 713Diagrammtypen 713Säulendiagramm 714Weitere Gruppen hinzufügen 716Weitere Diagramme 718

Parameter anwenden 719Parameterdefinition 719Einbau von Parametern in den Berichtsentwurf 720Parameterwerte an Bericht übergeben 721

Berichtsvariablen 722Master-Detail-Reports 723

Subreports 723Eingebettete Datenregionen 723

Noch mehr Reporting 724Hyperlink realisieren 724Verwenden von ReportViewer-Ereignissen 725

Hinzufügen von benutzerdefiniertem Code 727Variante 1: Eingebetteter Visual Basic-Code 727Variante 2: Benutzerdefinierte Assembly 728

Ergänzungen zum ReportViewer 730Local Mode versus Server Mode 730RDL- versus RDLC-Format 730Übersicht Datenbindung 731

How-to-Beispiele 73310.1 ... einen Bericht mit dem Berichtsassistenten erstellen? 73310.2 ... einen Unterbericht verwenden? 73710.3 ... eine Rechnung anzeigen? 74310.4 ... das Drillthrough-Event behandeln? 74810.5 ... auf eine benutzerdefinierte Assembly zugreifen? 75110.6 ... das Messgerät zur Anzeige nutzen? 756

18 Inhaltsverzeichnis

T>Crystal Report 759Übersicht 760^ Installieren 760

Ein Einsteigerbeispiel 761Der Report-Designer 767Der Reportaufbau 768Die Druckvorschau-Komponente 769

Wichtige Funktionen im Überblick 770Formelfelder 770Parameterfelder 770Gruppennamenfelder 772Spezialfelder 772SQL-Ausdrucksfelder 773Laufende Summe-Felder 773Unterberichte 774Diagramme und Bilder 775Weitere Komponenten 775Das Ereignis-Modell 776

Reports entwerfen 777Verbindung zur Datenbank herstellen 777Sortieren und Gruppieren 780Verwenden von Parameterfeldern 784Berechnungen im Report 787Gestalten mit bedingter Formatierung 791Kreuztabellenberichte 793Unterberichte 796

Programmieren der Druckvorschau 799Der CrystalReportViewer im Überblick 799Wichtige Eigenschaften, Methoden und Ereignisse 799

Direkte Ausgabe auf dem Drucker 801Die Lizenz zum Drucken 801Druckerauswahl und Konfiguration 802Drucken mit Druckerdialog 803

Exportieren von Reports 804Bestimmen des Exportformats 804Export als Datei 805Export als E-Mail 806

Praxisbeispiel - Rechnung mit Crystal Report drucken 807Datenbasis anpassen 807Report erzeugen 809Festlegen der Datenquelle 809Berechnungen im Report durchführen 809Auswahl der gewünschten Datensätze 810Reportentwurf 810Druckvorschaufenster entwerfen 812Zuweisen der Daten und Übergabe der Parameter 813Die fertige Rechnung 814

How-to-Beispiele 81511.1 ... ein Deckblatt erzeugen? 815

Inhaltsverzeichnis

11.2 ... Seitenzahlen, Druckdatum etc. einblenden? 81511.3 ... Spaltensatz oder Etiketten realisieren? 81511.4 ... die Seitenränder festlegen? 81611.5 ... mehrspaltige Reports erstellen? 81711.6 ... einen Seitenumbruch erzwingen? 81711.7 ... die Position und Größe der Druckvorschau vorgeben? 81811.8 ... Reports in die Applikation einbetten? 81811.9 ... Querdruck auswählen? 81811.10 ... RTF-/HTML-Text ausgeben? 81911.11... den Report zur Laufzeit auswählen? 81911.12 ... Summen, Anzahlen, Mittelwerte etc. berechnen? 82011.13 ... farbliche und optische Formatierungen realisieren? 82011.14... den Datenbankpfad zur Laufzeit anpassen? 82111.15 ... die Login-Informationen zur Laufzeit ändern? 82211.16 ... Crystal Report unter LINQ to SQL nutzen? y. 822

12 Access-Datenbanken 825Ein erster Blick auf Microsoft Access-Datenbanken 826

Warum Access? 826Access-Datentypen 827Beschränkungen 828

Zugriff aus C# 828Warum nicht nur ADO.NET? 829Die ADOX-Library 829Die JRO-Library :. 830ADO MD 830Einbinden von ADOX und JRO in C# 832Parameter für ADO.NET-Connectionstrings 833Access-Datenbankpasswort 833Access-Datenbanksicherheit (Benutzer-/Gruppenebene) 834Datenbankzugriff auf schreibgeschützte Medien (CD, DVD) 835

Datenbanken erstellen 835Die Create-Methode 836Weitere Parameter 836Jet-spezifische Optionen 836

Tabellen/Indizes erstellen/verwalten 838Tabellendefmition 838Indexdefinition 843Erstellen von Prozeduren und Sichten 845Tabellen verknüpfen (Relationen) 846

Zugriffsschutz in Access-Datenbanken 848Grundlagen 848Sichern auf Datenbankebene 849Erstellen neuer Benutzer und Gruppen 850Vergabe von Rechten 851Verschlüsseln von Datenbanken 853

Einbinden externer Tabellen 855Erstellen einer Verbindung 855Aktualisieren einer Verbindung 856

20 Inhaltsverzeichnis

Löschen einer Verbindung 857Replizieren von Datenbanken 857

Begriffe 857Aufbau einer Replikatgruppe 858Probleme bei Replikationen 858Vorbereitungen zur praktischen Umsetzung 859Replikat erstellen 860Abgleich von Kopie und Original 860

Datenbankanalyse 861Verwendung von GetSchema 861Datenbankeigenschaften mit ADOX ermitteln 864Tabellen mit ADOX bestimmen 865Sichten/Abfragen mit ADOX bestimmen 867Nutzer und Nutzergruppen auslesen 870Nutzer- und Gruppenberechtigungen ermitteln 872

Weitere Aufgabenstellungen 874Access-Datenbanken reparieren/komprimieren 874Distribution von Access-Datenbanken 875

Access 2007-Datenbanken 875Zugriff auf die Datenbanken 876Neuer Connectionstring 876Übersicht neue Datentypen 877Arbeiten mit den DAOs 877Memofeld mit Archiv-Funktion 878Anlage-Feld 880Rich-Text-Feld 886Multivalue-Feld (MVF) 888

Access 2010-Datenbanken 891Download/Installation Access 2010 Database Engine 892Berechnete Spalten 893Trigger/Datenmakros 895Unterschiede Access 2007/2010 897

How-to-Beispiele 89812.1 ... ADO installieren? 89812.2 ... Access-Datenbanken exklusiv öffnen? 89812.3 ... die Zugriffsgeschwindigkeit auf Access-Datenbanken erhöhen? 89812.4 ... Access-Datenbanken im Netzwerk verwenden? 89812.5 ... alle aktiven Verbindungen zur Datenbank auflisten? 89912.6 ... eine Spalte mit eindeutigen Zufallswerten erzeugen? 89912.7 ... das Datenbank-Kennwort ändern? 90012.8 ... Abfragen über mehrere Datenbanken realisieren? 90112.9 ... die Beschreibung von Datenbankfeldern abrufen? 901

13 Microsoft SQL Server-Einstieg 903Übersicht 904

SQL Server Express 904SQL Server Compact 905Unterschiede SQL Server/SQL Server Express/Jet-Engine 905Client- versus Fileserver-Programmierung 907

Inhaltsverzeichnis 21

Die wichtigsten Tools von SQL Server 909Vordefinierte Datenbanken 913Einschränkungen 913Weitere SQL Server-Funktionen im Kurzüberblick 914

Datenzugriff aus C# 916Einrichten der Anbindung (Assistent) 917Einrichten der Verbindung (Quellcode) 918

Transact-SQL 919Schreibweise 920Kommentare 920Zeichenketten 920Variablen deklarieren/verwenden 921Bedingungen mit IF/ELSE auswerten 922Verwenden von CASE 923Verwenden von WHILE ... BREAK/CONTINUE 923Datum und Uhrzeit in T-SQL 924Verwenden von GOTO 925Fehlerbehandlung 925

Datenbanken mit DMO verwalten 925Einbindung 926Einführungsbeispiel 926

SQL Server Management Objects (SMO) 927Einbindung 927Einführungsbeispiel 928Anmelden am Server 930

Datensicherheit auf dem Microsoft SQL Server 931Überblick Sicherheitsmodell 931Verwalten mit dem SQL Server Management Studio 934Verwalten mit T-SQL 937

How-to-Beispiele 94113.1 ... den Netzwerkzugriff auf den SQL Server Express aktivieren? 94113.2 ... den SQL Server Express erkennen? 94313.3 ... den SQL Server Express administrieren? 94313.4 ... alle Nutzer einer Datenbank ermitteln? 94413.5 ... alle registrierten Microsoft SQL Server ermitteln? 94513.6 ... alle Datenbanken und deren Tabellen ermitteln? 94613.7 ... eine Tabelle löschen? 94613.8 ... eine Tabelle mit den SMO erzeugen? 94713.9 ... die Anzahl der Datensätze beschränken? 94813.10 ... Platzhalterzeichen in T-SQL verwenden? 94913.11 ... Teilstrings erzeugen? 95013.12 ... Leerzeichen entfernen? 95013.13 ... mit DROP INDEX jeden Index löschen? 95013.14 ... @@ERROR korrekt verarbeiten? 95113.15 ... die Anzahl der Datensätze einer Abfrage bestimmen? 95113.16 ... IFF ersetzen? 95113.17 ... mit Bedingungen Feldinhalte formatieren? 95213.18 ... Abfragen mit Platzhaltern beschleunigen? 95213.19 ... die Groß-/Kleinschreibung berücksichtigen? 953

22 Inhaltsverzeichnis

13.20 ... das Ergebnis einer Stored Procedure speichern? 95313.21... eine Datenbank umbenennen? 95413.22 ... eine Datenbank zwischen Servern verschieben? 95413.23 ... eine Datenbankstruktur kopieren? 95513.24 ... nach dem Löschen IDENTITY auf 0 setzen? 95613.25 ... eine Tabellenspalte umbenennen? 95613.26 ... Unterschiede zwischen temporären Tabellen erkennen? 95713.27 ... Daten aus verschiedenen Datenbanken anzeigen? 95713.28 ... die PRINT-Anweisung in C# anzeigen? 957

Übersichten 958Datentypen 958Unterschiede Access- und SQL Server-Datentypen 959

14 Microsoft SQL Server-Programmierung 961Praktisches Arbeiten mit dem SQL Server 962

Erstellen von SQL Server-Datenbanken 962Erzeugen und Verwalten von Tabellen 966Datenbankdiagramme 971Erzeugen und Verwenden von Sichten (Views) 973Gespeicherte Prozeduren verwenden 974Programmierung/Verwendung von Triggern 978Volltextabfragen 982Die Verwendung von FileStream-Storage 988Massenkopieren 994Datenbanken sichern und wiederherstellen 996

Fehlerbehandlung 1001Das Fehlermodell 1001Verwenden von @@ERROR 1002Verwenden von RAISEERROR 1003Fehlerbehandlung mit TRY...CATCH 1003Fehlerbehandlung mit ADO.NET 1005

Weitere Features des Datenzugriffs unter ADO.NET 1007Alle verfügbaren SQL Server ermitteln 1007Asynchrone Befehlsausführung 1007Benachrichtigungen über Datenänderungen 1009Multiple Active Resultsets (MARS) 1009

CLR-Integration im SQL Server 1010Grundsätzlicher Ablauf 1011CLR-Unterstützung aktivieren 1011Assembly erstellen 1012Benutzerdefinierte Funktionen (UDF) 1015Stored Procedures 1016Aggregat-Funktionen 1022Trigger in C# realisieren 1024Mehr Sicherheit 1025Fazit 1026

XML-Unterstützung 1026Der XML-Datentyp 1027XML-Daten mit SELECT erzeugen 1028

Inhaltsverzeichnis 23

XML-Abfragen 1032Der Clientzugriff auf die XML-Daten 1034 ,

How-to-Beispiele 1037 /14.1 ... Aktualisierungs- und Löschweitergaben realisieren? 1037/14.2 ... Änderungen in Tabellen protokollieren? ./.. 103/714.3 ... SQL-Anweisungen debuggen? /.... 103814.4 ... ein SqlConnection-Objekt konfigurieren? / 104014.5 ... eine gespeicherte Prozedur aufrufen? /. /104314.6 ... mit Table Value-Parametern arbeiten? J /104614.7 ... mit Stapel-Abfragen arbeiten? 1 .1 104914.8 ... Query Notifications einrichten und auswerten? /N-.-.-r:. 105114.9 ... die MARS-Technologie kennen lernen? 105614.10 ... Row-Constructors verwenden? 1059

15 SQL Server Compact 1061Einsatzszenarien 1062

Einschränkungen 1062Fähigkeiten/Vorteile 1063

Installation 1063Datenbanken erstellen, verwalten und einbinden 1065

Visual Studio 1065SQL Server Management Studio 1066Codebasiert mit C# 1067Tabellen und Referenzen erstellen 1069

Zusammenarbeit mit dem DataSet 1072Datenzugriff mit SqlCeResultSet 1073

Datenbindung 1073Das ResultSet konfigurieren 1075Datensätze löschen 1075Datensätze einfügen 1076Datensätze bearbeiten 1076Navigation zwischen den Datensätzen 1077

Zugriff mit LINQ to SQL 1078Anbinden einer vorhandenen Datenbank 1078Erstellen einer neue Datenbank 1079Ergänzungen 1080

Zugriff per Entity Data Model 1081Model First-Entwurf 1081Database First-Entwurf 1082

Der Einsatz als Local Database Cache 1083Beispiel Einweg-Synchronisation 1083Bidirektionale Synchronisation 1087

Tipps & Tricks 1090Datenbank auf Remotelaufwerk nutzen 1090Performance verbessern 1090Datenbank von schreibgeschütztem Medium starten 1091Datenbankinformationen abrufen 1091Datenbank reparieren 1092Datenbank komprimieren 1093

24 Inhaltsverzeichnis

Datenbank nachträglich verschlüsseln 1094Ein Datenbank-Backup realisieren 1094Fehler in der Visual Studio-IDE vermeiden 1094Daten vom SQL Server zum SQL Server Compact zu kopieren 1094Distribution 1095Weitere Hilfe 1096

16 SQLite — Ein Mini ganz groß 1097Was ist eigentlich SQLite? 1098

Vorteile 1099Nachteile 1099v

Vorbereitungen 1100Download/Installation 1100Integration in Ihr Projekt 1100

Praktische Aufgabenstellungen 1101Erzeugen neuer Datenbanken mit Visual Studio 1101Alternative Möglichkeit zum Administrieren der Datenbank 1102Datenbank/Datenbankobjekte per Code erstellen 1104Mögliche Connectionstring-Parameter 1105Datenbankzugriff per DataSet realisieren 1106Besonderheit: InMemory-Datenbank 1108Datenzugriff mit dem Entity Framework 1109SOUNDEX verwenden 1110Volltextabfragen realisieren 1110Eigene skalare Funktionen in C# realisieren 1113Eigene Aggregat-Funktionen in C# realisieren 1115

Tipps & Tricks 1116Für Liebhaber der Kommandozeile - Sqlite3.exe 1116Eine Beispieldatenbank herunterladen 1117Eine Datenbank ver- und entschlüsseln 1117Eine verschlüsselte Datenbank öffnen 1118Testen, ob Tabelle vorhanden ist 1118Die Datenbank defragmentieren 1119Mehrere Datenbanken verknüpfen 1119

17 LINQ to SQL 1121Übersicht 1122

Das LINQ to SQL-Datenmodell 1122Der DataContext 1123Die Entitäts-Klassen 1124Umstiegsbeispiel für den »ehemaligen« SQL-Programmierer 1125Datenbank-Entwurfskonzepte 1127

Der schnelle Weg zu den SQL Server-Daten 1127Der LINQ to SQL-Designer 1127Die .DBML-Datei 1128Die Designer.CS-Datei 1130Ein erster Test und ein Blick unter die Motorhaube 1132SQL-Debugging leicht gemacht 1133

Inhaltsverzeichnis 25

Der steinige Weg zur Persistenz 1135Das Datenmodell entwickeln 1135Erzeugen der Datenbank und Herstellen der Verbindung 1137Ein paar Gedanken zum Erstellen neuer Datenbanken 1138

Datenauswahl/Datentypen 1138Einfache Datentypen 1138IQueryable<T> 1139Datenauswahl basierend auf Detaildaten 1139Bereichsauswahl (Paging) 1140Probleme mit First() 1141

Datenbindung 1142Datenquelle hinzufügen 1142Anzeige von Detaildaten 1144Listendarstellung mit anonymen Typen optimieren 1145Lazy Loading/Prefetch/Delay Loaded 1145ObjectTracking ausschalten 1148

Bearbeiten und Aktualisieren 1148Editieren 1148Fehler beim Aktualisieren 1149Konflikte beim Aktualisieren von Datensätzen 1150Lokale Datenaktualisierung per DataContext 1154Neue Datensätze erzeugen 1155Löschen 1158

Eingabevalidierung 1159Prüfung auf Feldebene (Eigenschaft) 1160Prüfung auf Datensatzebene (Objekt) 1161Überprüfung vor Update, Insert oder Delete 1161

Stored Procedures 1162Allgemeine Verwendung 1162Skalare Rückgabewerte 1163Typisierte Rückgabewerte 1164Insert/Update/Delete per Stored Procedure 1165

Weitere LINQ to SQL-Features 1167Direkte SQL-Programmierung 1167Verwendung der partiellen Klassen 1168

Schlussbemerkung 1170

18 Arbeiten mit dem Entity Framework imDas Grundkonzept 1172

Konzeptionelle Schicht 1173Logische Schicht 1175Zuordnungsschicht 1175Wie erstelle ich die Schema-Dateien? 1176Das Gesamtmodell im Überblick 1176Wie kann mit dem EDM gearbeitet werden? 1177Entwurfsmöglichkeiten 1178

Unsere Beispieldatenbank 1179Das Datendiagramm 1180Weitere Tabellen 1180

Inhaltsverzeichnis

Der EDM-Entwurf 1182Der EDM-Assistent 1182Der EDM-Designer 1185Weitere Fenster des EDM-Designers 1188Stored Procedures importieren 1190Komplexe Typen 1192Die erzeugten Klassen/partielle Klassen 1194Der Model-First-Entwurf 1196

Einsatz des EntityClient für die Datenabfrage 1198Ein Überblick 1198Einsatzbeispiel 1199Connection aufbauen 1200Parameterabfragen realisieren 1201Wann sollten Sie diese Variante nutzen? 1201

Verwenden der Objektdienste 1202Eine Übersicht 1202Verwendung von eSQL 1203Verwendung von LINQ to Entities 1204

Kurzeinführung in Entity SQL (eSQL) 1206Für den Umsteiger: Unterschiede zu T-SQL 1206Für den Einsteiger 1207

Praktisches Arbeiten mit dem EDM 1214Skalare Werte abfragen 1214Abfragen mit Projektion 1215Detaildaten/Verwendung der Navigationseigenschaften 1215Lazy Loading 1216Wie funktioniert das explizite Laden? 1218Was passiert beim vorzeitigen Laden (Eager-Load)? 1219Delay Loaded 1221Zugriff mit Paging 1221Abrufen einzelner Entitäten 1222Lokale Datenaktualisierung per ObjectContext 1223Einfaches Einfügen von Datensätzen 1224Abrufen eines Identity-Wertes nach dem Einfügen 1225Einfügen von Datensätzen in l:n/m:n-Beziehungen 1226Bearbeiten von Entitäten 1227Übernahme der Daten mit SaveChanges 1228Löschen von Entitäten 1229Verwendung von Stored Procedures 1231Funktionsimporte 1233Die Eigenschaft EntityState 1234Verwendung des ObjectStateManagers 1234Anhängen von Objekten 1236Arbeiten mit Vererbung 1238POCO-Unterstützung 1241Validierung 1242Verwenden der partiellen Klassen 1245Abschließender Hinweis 1247

Inhaltsverzeichnis

How-to-Beispiele 125018.1 ... den ConnectionString anpassen? 125018.2 ... ChangeTracking deaktivieren? 125118.3 ... LINQPad verwenden? 125218.4 ... SQL-Anweisungen analysieren? 125518.5 ... direkte SQL-Statements an den Server senden? 125618.6 ... weitere Beispiele finden? 1257

19 WCF - eine Einführung 1259Die Programmierung verteilter Systeme 1260

Intranet oder Internet? 1260Die Vorgänger 1261WCF - die neue Technologie 1262

Allgemeiner Aufbau eines WCF-Systems 1264WCF-Assemblies - die verfügbaren Bausteine 1264Service, Host und Client 1264Nachrichtenaustausch 1266

Das ABC der WCF-Endpunkte 1266Verträge 1267Bindungen 1268Adressen 1271

Programmierung eines WCF-Dienstes 1272Quellcode als Klassenbibliothek 1272Das [ServiceContract]-Attribut 1273Das [OperationContract]-Attribut 1274Service Klassen ohne Vertrags-Interfaces 1275

Der WCF-Host 1276Vorbereitungen 1276Die App.config 1276Die ServiceHost-Klasse 1277Festlegen der Basisadressen 1278Weitere Details der ServiceHost-Klasse 1279Das <system.serviceModel>-Element 1280Austausch der Metadaten (MEX) 1281

Der WCF-Client 1284Vorbereitungen 1284Verwenden von SvcUtil.exe 1284Einsatz des Proxy-Generators von Visual Studio 2010 1287

Verbesserungen unter WCF 4.0 1288Standard-Endpunkte 1288Multiple Bindungen 1289Standardmäßige MEX-Konfiguration 1290Projektvorlage WCF-Dienstbibliothek 1291Einsatz von WcfTestClient.exe 1293App.config mit SvcConfigEditor bearbeiten 1294

How-to-Beispiele 129519.1 ... einen WCF-Webdienst mit Datenzugriffsschicht entwickeln? 129519.2 ... einen Client für einen WCF-Webdienst entwickeln? 130219.3 ... was tun, wenn der IIS nicht funktioniert? 1305

28 Inhaltsverzeichnis

20 Einführung WCF Data Services 1307Einführung 1308

Warum WCF Data Services? 1308Vor- und Nachteile 1311Und was ist OData? 1312Was ist neu in .NET 4.0? 1313Übersicht der OData-Abfrageoptionen 1313

Praktisches Arbeiten mit den Data Services 1317Ein erster Data Consumer 1317Verwendung von CreateQuery<T> 1320Verwendung von Execute<T> 1321Asynchrone Verarbeitung 1321Anzahl der Entitäten bestimmen 1323Verwendung der DataServiceCollection 1324Eigene Methoden über den Data Service bereitstellen 1326Freigabe der Schnittstelle regeln 1329Verwendung von Fiddler 1330

How-to-Beispiele 133120.1 ... einen einfachen WCF Data Service erstellen? 133120.2 ... einen Silverlight-Client mit WCF Data Services anbinden? 1332

n^Komplexbeispiel Webshop 1341Grundkonzept 1342

'i Aufgabenstellung 1342Unterschiedliche Frontends für Kunden und Verkäufer 1343

T)ie Datenbankstruktur 1343Datenbankdiagramm 1343Tabellen 1345Stored Procedures 1347Ansichten/Views 1351Bemerkungen 1351

Entwurf Webshop-Projekt/Datenbank 1352Stammdatenverwaltung mit Webdienst 1353

Das Interface 1354Entwurf Webdienst 1354Die Methoden im Einzelnen 1355

Windows-Verwaltungsfrontend 1360Entwurf 1360Verbindung zum Webdienst herstellen 1360Oberflächengestaltung 1361Implementierung Stammdatenverwaltung 1363Test Stammdatenverwaltung 1366Typisiertes DataSet für den Report 1367Reportentwurf 1368Reporteinbindung 1371Filtern der Artikelgruppen 1373Kunden-Tabelle 1373

Inhaltsverzeichnis 29

ASP.NET-Kundeninterface 1374Übersicht 1374Entwurf Default.aspx 1375Vorbereitung Benutzersteuerelemente 1381Welcome.ascx 1383Shop.ascx 1384Warenkorb.ascx 1387Anmeldung.ascx 1391Bestellung.ascx 1392Danke.ascx 1395Kundenkonto.ascx 1396NeuerKunde.ascx :.. 1396

Abschlusstest und Bemerkungen 1398Test 1398Abschlussbemerkungen 1399

A Glossar 1401

B Wichtige Dateiendungen 1407

c Northwind versus Nordwind 1409

Stichwortverzeichnis 1413