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

Inhaltsverzeichnis
1 Einführung
2 Grundlagen der Sprachsyntax
3 Klassendesign
4 Weitere Datentypen
5 Multithreading
6 Collections und LINQ
7 Eingabe und Ausgabe
8 Anwendungen: Struktur und Installation
9 Code erstellen und debuggen
10 Einige Basisklassen
11 Windows-Anwendungen erstellen
12 Die wichtigsten Steuerelemente
13 Tastatur- und Mausereignisse
14 MDI-Anwendungen
15 Grafiken mit GDI+
16 Drucken
17 Entwickeln von Steuerelementen
18 Programmiertechniken
19 WPF – Grundlagen
20 Layoutcontainer
21 WPF-Steuerelemente
22 Konzepte von WPF
23 Datenbankverbindung mit ADO.NET
24 Datenbankabfragen mit ADO.NET
25 DataAdapter
26 Offline mit DataSet
27 Datenbanken aktualisieren
28 Stark typisierte DataSets
A Anhang: Einige Übersichten
Stichwort

Jetzt Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Visual Basic 2008 von Andreas Kuehnel, Stephan Leibbrandt
Das umfassende Handbuch
Buch: Visual Basic 2008

Visual Basic 2008
3., aktualisierte und erweiterte Auflage, geb., mit DVD
1.323 S., 49,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1171-0
Pfeil 27 Datenbanken aktualisieren
Pfeil 27.1 Aktualisieren mit CommandBuilder
Pfeil 27.1.1 Parallelitätskonflikt
Pfeil 27.1.2 Aktualisierungsbefehle des DbCommandBuilders
Pfeil 27.1.3 Aktualisierungsoptionen des DbCommandBuilders
Pfeil 27.1.4 Vor- und Nachteile des DbCommandBuilders
Pfeil 27.2 Manuell gesteuerte Aktualisierungen
Pfeil 27.2.1 Manuelles Aktualisieren mit dem DataAdapter
Pfeil 27.2.2 Aktualisieren mit ExecuteNonQuery
Pfeil 27.3 Benutzer über fehlgeschlagene Aktualisierungen informieren
Pfeil 27.4 Konfliktverursachende Datenzeilen bei der Datenbank abfragen
Pfeil 27.5 DataSet mit der Datenbank synchronisieren
Pfeil 27.5.1 UpdatedRowSource in DbCommand
Pfeil 27.6 Hierarchische Änderungen an die Datenbank übermitteln
Pfeil 27.6.1 Datenbank auslesen
Pfeil 27.6.2 Änderung
Pfeil 27.6.3 Bestellung einfügen
Pfeil 27.6.4 Bestelldetails einfügen
Pfeil 27.6.5 Wiederherstellen der Datenbank


Rheinwerk Computing - Zum Seitenanfang

27.3 Benutzer über fehlgeschlagene Aktualisierungen informieren topZur vorigen Überschrift

Vielleicht sind Sie auf die Idee gekommen, mit dem Beispielprogramm ZuFuss einen Parallelitätskonflikt zu simulieren. Sie werden dann festgestellt haben, dass im Konfliktfall keine Ausnahme ausgelöst wird. Zudem werden auch alle nach dem Konfliktfall anstehenden Änderungen in der Datenbank vorgenommen.

Ganz anders operiert der DbDataAdapter, der die Zeilen einzeln an die Datenbank schickt. Im Konfliktfall löst er eine DBConcurrencyException aus. Die verbleibenden Änderungen werden nicht mehr an die Datenbank geschickt. So ist das Standardverhalten.

Die folgende Eigenschaft weist den DataAdapter an, nach einem Konflikt seine Aufgabe fortzusetzen und auch die verbleibenden Änderungen zu übermitteln.

da.ContinueUpdateOnError = True

Das hat weitreichende Konsequenzen, denn nun verursacht ein fehlgeschlagener Aktualisierungsversuch keine Ausnahme mehr. Stattdessen wird die Eigenschaft HasErrors des entsprechenden DataRow-Objekts auf True gesetzt, ebenso die gleichnamige Eigenschaft des DataSets und der DataTable. Eine DataRow hat auch eine Eigenschaft RowError. Diese enthält nach dem misslungenen Versuch eine Fehlermeldung.

Im folgenden Beispielcode wird der Einsatz der Eigenschaften ContinueUpdateOnError, HasErrors und RowError gezeigt. Das nötige Command-Objekt wird von der schon bekannten Methode CreateUpdateCommand generiert.

Für eine korrekte Arbeitsweise setzt das Beispiel voraus, dass die Products-Datenbank in ihrem Ursprungszustand ist. Zuerst werden die Daten von der Datenbank eingelesen. Eine Datenzeile wird in der Datenbank geändert, um einen Konflikt zu provozieren. Danach wird die gleiche Zeile lokal geändert und die Datenbank synchronisiert. Danach werden Fehler protokolliert.


'...\ADO\Aktualisierung\Konflikt

Option Strict On 
Imports System.Data.Common, System.Data.SqlClient 
Namespace ADO 
  Module Konflikt 
    Sub Test() 
      Dim con As DbConnection = New SqlConnection() 
      con.ConnectionString = "Data Source=(local);" & _ 
        "Initial Catalog=Northwind;Integrated Security=sspi" 
      Dim cmd As DbCommand = New SqlCommand() 
      cmd.CommandText = "SELECT ProductID, ProductName, " & _ 
        "UnitPrice, Discontinued FROM Products" 
      cmd.Connection = con 
      Dim ds As New DataSet() 
      Dim da As DbDataAdapter = New SqlDataAdapter() 
      da.SelectCommand = cmd 
      da.Fill(ds)

      ' Konflikt simulieren 
      cmd.CommandText = _ 
        "UPDATE Products SET ProductName='Tee' WHERE ProductID=1" 
      con.Open() : cmd.ExecuteNonQuery() : con.Close()

      ' Änderungen durchführen 
      ds.Tables(0).Select("ProductID=1")(0)("ProductName") = "Kräutertee" 
      da.UpdateCommand = CreateUpdateCommand(con) 
      da.ContinueUpdateOnError = True 
      da.Update(ds)

      ' auf Konflikte prüfen 
      If ds.HasErrors Then 
        For Each row As DataRow In ds.Tables(0).Rows 
          If row.HasErrors Then Console.WriteLine( _ 
            "ID: {0}, Fehler: {1}", row("ProductID"), row.RowError) 
        Next 
      Else 
        Console.WriteLine("Aktualisierung erfolgreich.") 
      End If 
      Console.ReadLine() 
    End Sub 
    Function CreateUpdateCommand(ByVal con As DbConnection) As DbCommand ... 
  End Module 
End Namespace

Nach dem Aufruf von Update auf den DataAdapter wird zuerst mit

If ds.HasErrors Then ...

getestet, ob überhaupt ein Konflikt im DataSet vorliegt. True signalisiert, dass irgendeine Datenzeilenaktualisierung fehlgeschlagen ist und dass wir alle Datenzeilen in der Tabelle des DataSets durchlaufen müssen, um die konfliktverursachenden Zeilen zu finden.

For Each row As DataRow In ds.Tables(0).Rows 
  If row.HasErrors Then ... 
Next

Jetzt können wir reagieren. Im einfachsten Fall lassen wir uns zumindest die ID des betreffenden Übeltäters ausgeben – so wie in diesem Beispiel. Sie können die Information natürlich auch dazu benutzen, dem Benutzer die Chance zu geben, die Konfliktursache zu beseitigen, denn der Verursacher ist ermittelt.



Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

<< zurück
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Visual Basic 2008
Visual Basic 2008
Jetzt Buch bestellen


 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Rheinwerk-Shop: Visual Basic 2012






 Visual Basic 2012


Zum Rheinwerk-Shop: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Rheinwerk-Shop: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


Zum Rheinwerk-Shop: Professionell entwickeln mit Visual C# 2012






 Professionell
 entwickeln mit
 Visual C# 2012


Zum Rheinwerk-Shop: Windows Presentation Foundation






 Windows Presentation
 Foundation


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2009
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