Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort zur 5. Auflage
1 Allgemeine Einführung in .NET
2 Grundlagen der Sprache C#
3 Klassendesign
4 Vererbung, Polymorphie und Interfaces
5 Delegates und Ereignisse
6 Weitere .NET-Datentypen
7 Weitere Möglichkeiten von C#
8 Auflistungsklassen (Collections)
9 Fehlerbehandlung und Debugging
10 LINQ to Objects
11 Multithreading und die Task Parallel Library (TPL)
12 Arbeiten mit Dateien und Streams
13 Binäre Serialisierung
14 Einige wichtige .NET-Klassen
15 Projektmanagement und Visual Studio 2010
16 XML
17 WPF – Die Grundlagen
18 WPF-Containerelemente
19 WPF-Steuerelemente
20 Konzepte der WPF
21 Datenbindung
22 2D-Grafik
23 ADO.NET – verbindungsorientierte Objekte
24 ADO.NET – Das Command-Objekt
25 ADO.NET – Der SqlDataAdapter
26 ADO.NET – Daten im lokalen Speicher
27 ADO.NET – Aktualisieren der Datenbank
28 Stark typisierte DataSets
29 LINQ to SQL
30 Weitergabe von Anwendungen
Stichwort

Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Visual C# 2010 von Andreas Kühnel
Das umfassende Handbuch
Buch: Visual C# 2010

Visual C# 2010
geb., mit DVD
1295 S., 49,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1552-7
Pfeil 27 ADO.NET – Aktualisieren der Datenbank
Pfeil 27.1 Aktualisieren mit dem »CommandBuilder«
Pfeil 27.1.1 Von »SqlCommandBuilder« generierte Aktualisierungsstatements
Pfeil 27.1.2 Konfliktsteuerung in einer Mehrbenutzerumgebung
Pfeil 27.1.3 Die Eigenschaft »ConflictOption« des »SqlCommandBuilder«
Pfeil 27.1.4 Die Eigenschaft »SetAllValues«
Pfeil 27.2 Manuell gesteuerte Aktualisierung
Pfeil 27.2.1 Eigene Aktualisierungslogik
Pfeil 27.2.2 Beispielprogramm
Pfeil 27.3 Konfliktanalyse
Pfeil 27.3.1 Benutzer über fehlgeschlagene Aktualisierungen informieren
Pfeil 27.3.2 Konfliktverursachende Datenzeilen bei der Datenbank abfragen
Pfeil 27.4 Neue Autoinkrementwerte abrufen


Galileo Computing - Zum Seitenanfang

27.4 Neue Autoinkrementwerte abrufen topZur vorigen Überschrift

Wenn Sie der Tabelle Products eine neue Datenzeile hinzufügen, wird ein Primärschlüsselwert generiert, der automatisch von der Datenbank erzeugt wird. Nicht alle Datenbanken unterstützen dieses Feature, aber der SQL Server gehört dazu. Das Problem bei der Aktualisierung durch Hinzufügen einer neuen Datenzeile ist, dass der DataRow im DataSet nach der Aktualisierung der von der Datenbank erzeugte Primärschlüssel nicht zur Verfügung steht, während jede andere Aktualisierung dazu führt, dass die DataRowVersion.Original den Wert von DataRowVersion.Current annimmt.

Wie also erhalten wir nach dem Hinzufügen den neuen, aktuellen Primärschlüssel einer Autoinkrementspalte? Hier hilft uns der SQL Server mit seiner integrierten Funktion @@IDENTITY. Sie liefert den letzten erzeugten Autoinkrementwert zurück.

Wir können das Beispiel aus dem letzten Abschnitt nun in der Weise ergänzen, dass wir für unsere beiden hinzuzufügenden Datenzeilen die entsprechenden Werte im Ereignishandler zu RowUpdated abfragen und der Spalte ProduktID der betreffenden Datenzeile zuordnen.


static void da_RowUpdated(object sender, SqlRowUpdatedEventArgs e) {
  // Konfliktanalyse
  if (e.Status == UpdateStatus.ErrorsOccurred) {
    ...
  }
  // Abfrage der neuen Autoinkrementwerte 
  else if ((e.Status == UpdateStatus.Continue) && 
           (e.StatementType == StatementType.Insert)) {
    SqlCommand cmdPS = new SqlCommand();
    cmdPS.CommandText = "SELECT @ProductID = @@IDENTITY";
    cmdPS.Connection = con;
    SqlParameter param = cmdPS.Parameters.Add("@ProductID", SqlDbType.Int);
    param.Direction = ParameterDirection.Output;
    cmdPS.ExecuteNonQuery();
    e.Row["ProductID"] = cmdPS.Parameters["@ProductID"].Value;
  }
}

Zunächst muss sichergestellt werden, dass nur die erfolgreiche Aktualisierung einer neu hinzugefügten Datenzeile vom folgenden Code behandelt wird. Die Eigenschaften Status und StatementType des EventsArgs-Objekts gestatten uns eine entsprechende Filterung.

Im Anweisungsblock wird zuerst ein SqlCommand-Objekt erzeugt. Der CommandText-Eigenschaft weisen wir mit


SELECT @ProductID = @@IDENTITY

den Rückgabewert von @@IDENTITY zu. Der Parameter @ProductID muss als Ausgabeparameter festgelegt werden. Nach dem Aufruf der Methode ExecuteNonQuery können wir dem Parameter den neuen Wert entnehmen und ihn in die Spalte ProductID der entsprechenden Datenzeile schreiben. Bevor Sie die Anwendung testen, müssen Sie noch berücksichtigen, dass aufgrund des Aufrufs von FillSchema die Spalte ProductID schreibgeschützt ist. Sie müssen deshalb mit


ds.Tables[0].Columns["ProductID"].ReadOnly = false;

vor dem Aufruf der Update-Methode des SqlDataAdapters den Schreibschutz wieder aufheben.


Hinweis

Das komplette Beispiel finden Sie auf der Buch-DVD unter: …\Beispiele\Kapitel27\
AutoInkrementSample




Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen. >> Zum Feedback-Formular
<< zurück
  Zum Katalog
Zum Katalog: Visual C# 2010

Visual C# 2010
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Professionell entwickeln mit Visual C# 2012






 Professionell
 entwickeln mit
 Visual C# 2012


Zum Katalog: Windows Presentation Foundation






 Windows Presentation
 Foundation


Zum Katalog: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Katalog: C++ Handbuch






 C++ Handbuch


Zum Katalog: C/C++






 C/C++


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2010
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern