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 24 Datenbankabfragen mit ADO.NET
Pfeil 24.1 DbCommand
Pfeil 24.1.1 Ein DbCommand-Objekt erzeugen
Pfeil 24.1.2 Ausführen des DbCommand-Objekts
Pfeil 24.1.3 Begrenzung der Abfragezeit durch CommandTimeout
Pfeil 24.1.4 Aktionsabfragen absetzen
Pfeil 24.1.5 Abfragen mit einem Einzelergebnis
Pfeil 24.2 SqlDataReader
Pfeil 24.2.1 Das SQL-Kommando SELECT
Pfeil 24.2.2 Datensätze einlesen
Pfeil 24.2.3 DataReader schließen
Pfeil 24.2.4 MARS (Multiple Active Resultsets)
Pfeil 24.2.5 Batch-Abfragen mit NextResult durchlaufen
Pfeil 24.2.6 Informationen über eine Tabelle
Pfeil 24.3 Parametrisierte Abfragen
Pfeil 24.3.1 SqlClient-Datenprovider
Pfeil 24.3.2 SqlParameter
Pfeil 24.3.3 OleDb-Datenprovider
Pfeil 24.4 Asynchrone Abfragen
Pfeil 24.4.1 Polling
Pfeil 24.4.2 Bereitstellen einer Rückrufmethode
Pfeil 24.5 Gespeicherte Prozeduren (Stored Procedures)
Pfeil 24.5.1 Gespeicherte Prozeduren in Visual Studio 2008 erstellen
Pfeil 24.5.2 Gespeicherte Prozeduren aufrufen
Pfeil 24.5.3 Komplexe gespeicherte Prozeduren


Rheinwerk Computing - Zum Seitenanfang

24.4 Asynchrone Abfragen Zur nächsten ÜberschriftZur vorigen Überschrift

Die Methoden ExecuteReader, ExecuteNonQuery oder ExecuteXmlReader blockieren die Anwendung, sodass der Programmfluss erst nach der Antwort des SQL Servers weitergeht. Dauert die Operation eine längere Zeit, wirkt die Clientanwendung wie eingefroren. Daher stellt ADO.NET außerdem asynchrone Methoden bereit, jedoch nur im SqlClient-Provider für SQL Server ab Version 7.0. Andere Provider kennen nur synchrone Abfragen.

Jede der drei Execute-Methoden erhält je eine Begin- und eine End-Methode. Für ExecuteReader sind es z. B. BeginExecuteReader und EndExecuteReader. In der folgenden Syntax sind optionale Parameter in eckige Klammern gesetzt:


Public Function BeginExecuteReader([beh As CommandBehavior]) As IAsyncResult

Public Function BeginExecuteReader(call As AsyncCallback, state As Object 
  [, beh As CommandBehavior]) As IAsyncResult

Public Function EndExecuteReader(result As IAsyncResult) As SqlDataReader

Mit BeginExecuteReader wird die asynchrone Operation gestartet. Der aufrufende Code initiiert die Aktion und fährt sogleich mit dem Programmfluss fort, ohne auf den Abschluss der Abfrage zu warten. Woher weiß das Clientprogramm, wann wie die Daten abgerufen werden können? Dazu gibt es zwei Möglichkeiten an, die ich in Beispielen vorstellen werde:

  • Sie fragen in einer Schleife permanent ab, ob die asynchrone Operation bereits beendet ist. Dieses Verfahren wird als Polling bezeichnet.
  • Sie definieren eine Rückrufmethode (Callback-Methode), die aufgerufen wird, sobald das Ergebnis vorliegt.

Asynchrone Operationen sind per Vorgabe nicht aktiviert. Damit das SqlConnection-Objekt auch asynchrone Abfragen ermöglicht, muss die Verbindungszeichenfolge um

Asynchronous Processing=true

ergänzt werden. Alternativ weisen Sie der Eigenschaft AsynchronousProcessing eines SqlConnectionStringBuilder-Objekts den Wert True zu.

Unsere bisherigen einfachen Abfragen sind zu schnell, um die Effekte asynchroner Operationen wahrzunehmen. Daher simulieren wir eine längere Abfrage mit der Anweisung WAITFOR DELAY, die den SQL Server um eine gewisse Zeit verzögert, zum Beispiel um zwei Sekunden:

WAITFOR DELAY '00:00:02'

Rheinwerk Computing - Zum Seitenanfang

24.4.1 Polling Zur nächsten ÜberschriftZur vorigen Überschrift

Sehen wir uns zuerst den gesamten Beispielcode an:


'...\ADO\Datenbankabfragen\Polling.vb

Option Strict On 
Imports System.Data.Common, System.Data.SqlClient 
Namespace ADO 
  Module Polling 
    Sub Test() 
      Dim con As SqlConnection = New SqlConnection("Data Source=.;" & _ 
        "Initial Catalog=Northwind;Integrated Security=sspi;" & _ 
        "Asynchronous Processing=true") 
      Dim cmd As SqlCommand = New SqlCommand( _ 
        "WAITFOR DELAY '00:00:01';SELECT TOP 10 * FROM Products", con) 
      con.Open()

      Dim result As IAsyncResult = cmd.BeginExecuteReader() ' asynchron

      While (Not result.IsCompleted) ' warten 
        Arbeiten() 
      End While

      Console.WriteLine(Environment.NewLine & "Und nun das Ergebnis:") 
      Dim dr As SqlDataReader = cmd.EndExecuteReader(result) 
      While dr.Read() 
        Console.WriteLine(dr("ProductName")) 
      End While

      dr.Close() : con.Close() : Console.ReadLine() 
    End Sub

    Sub Arbeiten() 
      Console.Write(DateTime.Now.Millisecond & " ") 
      Threading.Thread.Sleep(50) 
    End Sub 
  End Module 
End Namespace

Beim Polling prüft der Client, ob die durch die Begin-Methode angestoßene Operation abgeschlossen ist. Die Kommunikation mit dem Thread, in dem die Begin-Methode läuft, findet über die Statuseigenschaft IsCompleted statt. Sie wird von dem DbAsynchResult-Objekt bereitgestellt, das die Begin-Methode als Ergebnis zurückliefert und das die Schnittstelle IAsyncResult implementiert. Der Status kann nur ausgelesen werden und ist während der Ausführung der Operation False. Beachten Sie, dass in diesem Beispiel die parameterlose Methode BeginExecuteReader eingesetzt wird. Dies hat zur Folge, dass die Operation sang- und klanglos endet, ohne uns automatisch, außer über den Status, über ihr Ende zu informieren.

Solange die Ergebnismenge noch nicht vorliegt, hat IsCompleted den Wert False und die Clientanwendung erledigt in Arbeiten eine andere Aufgabe und gibt einige Zahlen aus (Sleep simuliert eine ausgedehntere Aktivität). Ist die Anfrage an den Datenbankserver beendet, kann das Ergebnis geholt werden. Dazu dient die Methode EndExecuteReader, die ihrerseits die Referenz auf ein SqlDataReader-Objekt bereitstellt, das wir zur Ausgabe der Spalte ProductName benutzen.


Rheinwerk Computing - Zum Seitenanfang

24.4.2 Bereitstellen einer Rückrufmethode topZur vorigen Überschrift

Während beim Polling fortwährend der eigene Code prüft, ob der Datenbankserver die Anfrage bearbeitet hat, obliegt es durch das Bereitstellen einer Rückrufmethode der Begin-Methode, die Rückrufmethode nach getaner Arbeit aufzurufen.

Die Adresse der Rückrufmethode, die im folgenden Beispiel Rückruf heißt, wird dem ersten Parameter der überladenen Methode BeginExecuteReader übergeben. Die Rückrufmethode ist vom Typ des Delegates AsyncCallback, das einen Parameter vom Typ IAsyncResult hat und keinen Wert zurückgibt. Im zweiten Parameter erhält BeginExecuteReader ein beliebiges Objekt, auf das in der Rückrufmethode über die Eigenschaft AsyncState des Methodenparameters zugegriffen werden kann. In unserem Beispiel speichern wir das Kommando zur Erzeugung eines DataReaders und die Verbindung zum Aufräumen mit Close nach getaner Arbeit. Wie Sie die Informationen organisieren, bleibt Ihnen überlassen. Das Beispiel nutzt ein Array von Objekten.

Nach Beendigung der asynchronen Operation wird die Rückrufmethode ausgeführt, aus der heraus EndExecuteReader aufgerufen wird. Das dazu notwendige SqlCommand-Objekt steckt in dem Objekt, das dem zweiten Parameter der Methode BeginExecuteReader übergeben wurde, und ist in der Eigenschaft AsyncState des IAsyncResult-Parameters gespeichert. Da AsyncState vom Typ Object ist, müssen noch einige Konvertierungen mit CType erfolgen.


'...\ADO\Datenbankabfragen\Callback.vb

Option Strict On 
Imports System.Data.Common, System.Data.SqlClient 
Namespace ADO 
  Module Callback 
    Sub Test() 
      Dim con As SqlConnection = New SqlConnection("Data Source=.;" & _ 
        "Initial Catalog=Northwind;Integrated Security=sspi;" & _ 
        "Asynchronous Processing=true") 
      Dim cmd As SqlCommand = New SqlCommand( _ 
        "WAITFOR DELAY '00:00:01';SELECT TOP 3 * FROM Products", con) 
      con.Open()

      Dim callback As New AsyncCallback(AddressOf Rückruf) 
      Dim info() As Object = {cmd, con} 
      cmd.BeginExecuteReader(callback, info) ' asynchron

      For i As Integer = 0 To 25 : Arbeiten() : Next

      Console.ReadLine() 
    End Sub

    Sub Rückruf(ByVal result As IAsyncResult) 
      Dim info() As Object = CType(result.AsyncState, Object()) 
      Dim cmd As SqlCommand = CType(info(0), SqlCommand) 
      Dim con As SqlConnection = CType(info(1), SqlConnection) 
      Dim dr As SqlDataReader = cmd.EndExecuteReader(result) 
      Console.WriteLine(Environment.NewLine & "Und nun das Ergebnis:") 
      While dr.Read() : Console.WriteLine(dr("ProductName")) : End While 
      dr.Close() : con.Close() 
    End Sub

    Sub Arbeiten() 
      Console.Write(DateTime.Now.Millisecond & " ") 
      Threading.Thread.Sleep(50) 
    End Sub 
  End Module 
End Namespace

Die Ausgabe zeigt, wie die Hauptroutine durch die Rückrufmethode unterbrochen wird. Ohne dass der Hauptthread mit Sleep für den asynchronen Thread Platz macht, kann es sein, dass alle Arbeiten-Aufrufe vor der Ergebnisausgabe erfolgen.

144 204 254 304 354 405 455 505 555 605 655 705 755 805 855 905 955 5 55 106 
Und nun das Ergebnis: 
Tee 
Chang 
Aniseed Syrup 
156 206 256 306 356 406


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