Forums Neueste Beiträge
 

Silverlight + VB.NET + Datenbank

23/07/2009 - 11:13 von Stefan Donath | Report spam
Hallo Gruppe,

als erstes der Hinweis: Ich bin mir nicht sicher, mit meiner Frage hier
richtig zu sein. Sollte das nicht der Fall sein, bitte ich um einen
entsprechenden Hinweis!

Ich schreibe an einer Silverlight-Anwendung mit VB.NET. Über einen
Webservice werden Daten aus einer Datenbank gelesen.

Nun bin ich an einer Stelle, an der über eine For Each-Schleife ein
beliebige Anzahl SQL-Abfragen abgesetzt werden soll. Der Zugriff auf die
Datenbank erfolgt aber asynchron und wird jeweils mit einer
Finished-Ereignisprozedur beendet. Aufgrund der Asynchronitàt geht mir
aber die Zuordnung zwischen der Abfrage und dem jeweiligen Ergebnis
verloren.

Wie kann ich organisieren, dass die jeweils nàchste Abfrage erst dann
abgesetzt wird, wenn das Ergebnis der vorhergehenden vorliegt? Kann mit
jemand eine Art best practise für diese Problem schildern oder
entsprechende Links zukommen lassen?!?!

Vielen Dank und beste Grüße - Stefan.
 

Lesen sie die antworten

#1 Peter Götz
23/07/2009 - 13:43 | Warnen spam
Hallo Stefan,

Ich schreibe an einer Silverlight-Anwendung mit VB.NET.
Über einen Webservice werden Daten aus einer
Datenbank gelesen.

Nun bin ich an einer Stelle, an der über eine
For Each-Schleife ein beliebige Anzahl SQL-Abfragen
abgesetzt werden soll. Der Zugriff auf die Datenbank
erfolgt aber asynchron und wird jeweils mit einer
Finished-Ereignisprozedur beendet. Aufgrund der
Asynchronitàt geht mir aber die Zuordnung zwischen
der Abfrage und dem jeweiligen Ergebnis verloren.



Die Steuerung der jeweils nàchsten Frage solltest Du
in diesem Fall nicht in einer For-Each-Schleife abhandeln,
sondern eben Dein Finished-Ereignis zu Starten der
jeweils nàchsten Abfrage nutzen.

Wie kann ich organisieren, dass die jeweils nàchste
Abfrage erst dann abgesetzt wird, wenn das Ergebnis
der vorhergehenden vorliegt?



s.oben:
Die nàchste Abfrage immer erst dann starten, wenn das
Finished-Ereignis der vorherigen ausgelöst worden ist.

Das nachfolgende einfache Beispiel sollte das
Ablaufprinzip verdeutlichen.

' /// Code in einer leeren Form1.vb
Public Class Form1
Private Structure Monat
Friend ID As Integer
Friend SName As String
Friend LName As String
End Structure

Private mMonList As List(Of Monat)
Dim mCntr As Integer


Private Sub Form1_Load _
(ByVal sender As System.Object, _
ByVal e As System.EventArgs _
) Handles MyBase.Load

Dim i As Integer
Dim Mon As Monat
mMonList = New List(Of Monat)
For i = 1 To 12
Mon.ID = i
Mon.SName = MonthName(i, True)
Mon.LName = MonthName(i, False)
mMonList.Add(Mon)
Next
End Sub

Private Sub Form1_Shown _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Me.Shown

' *** Schleife erstmalig anstossen
Call Schleife()
End Sub

Private Sub Schleife()
If mCntr < mMonList.Count Then
Abfrage()
End If

End Sub

Private Sub Abfrage()
Dim Mon As Monat = mMonList(mCntr)

MsgBox _
("Zàhler mCntr steht auf " & _
mCntr.ToString & _
ControlChars.CrLf & _
Mon.ID.ToString & "; " & _
Mon.SName & "; " & _
Mon.LName)

mCntr += 1

' *** Finished ***

' *** zurück zu Schleife
Call Schleife()
End Sub
End Class
' \\\ E N T E

Die Ausgabe der MsgBox stellt Deine Abfrage dar.
Nach Anzeige der MsgBox dauert es eine unbestimmte
Zeit, bis der Anwender die MsgBox wieder schliesst
und erst dann geht es weiter.
In Deinem Fall müsste also Deine Ereignisprozedur
Finished() jeweils die Sub Schleife() aufrufen um so
die nàchste Abfrage zu starten.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

Ähnliche fragen