Laden...

wait-Funktion für Properties???

Erstellt von gustavmega vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.827 Views
G
gustavmega Themenstarter:in
78 Beiträge seit 2012
vor 10 Jahren
wait-Funktion für Properties???

Hallo,

ich habe folgendes Problem, ich habe eine Feldeigenschaft, dass die Gesamtstunden von einem Mitarbeiter zurückgibt.

In dieser Property wird immer aktuelle Eintrag aus der Datenbank gelesen. Habe das Problem, dass wenn ich über Binding den Wert von dem Feld darstellen will, dass beim ersten Aufruf immer den alten Wert ausgegeben wird und erst beim zweiten Aufruf den aktuellen und das liegt daran, dass wenn ich den Wert beim ersten Aufruf auslesen möchte, muss erst aus der Datenbank den aktuellen Eintragung gelesen werden und daher wird erstmal den alten Wert rausgegeben:

public string test
        {
            get
            {
                DataServiceClient proxyT = new DataServiceClient();
                string command = "SELECT gesamtstunden FROM dbo.benutzer WHERE (id = '" + benutzer.Key + "')";
                double totalMinuten = 0;
                proxyT.selectSelbstDefiniertCompleted += (senderT, eT) =>
                {
                    if (eT.Result.Count > 0)
                    {
                        for (int i = 0; i < eT.Result.Count; i += 2)
                        {
                            totalMinuten += Convert.ToDouble(eT.Result[i] + "");
                        }
                    }
                    gesamt = totalMinuten + "";
                };
                proxyT.selectSelbstDefiniertAsync(Anmelden.anmeldung[0], "kalender", Anmelden.anmeldung[1], Anmelden.anmeldung[2], command);

                return gesamt;
            }
        }

Weiß vielleicht jemand wie ich das Problem lösen kann?

Grüße,
G.M.

2.298 Beiträge seit 2010
vor 10 Jahren

Naja, da du ja quasi eine Synchronisation erreichen willst, wäre es eventuell der richtige Weg den Aufruf direkt synchron zu gestalten. Was hältst du davon?

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

5.658 Beiträge seit 2006
vor 10 Jahren

Hi gustavmega,

wäre es nicht viel eleganter, die DB-Abfrage synchron durchzuführen? Was willst du denn mit der asynchronen Abfrage erreichen? Wenn du den GUI-Thread darauf warten läßt, daß die DB-Abfrage fertig ist, hast du ja auch nichts gekonnt.

Wie lange dauert denn die Abfrage? Wenn die Abfrage zu lange dauert (> 50 ms), könntest du sie asynchron ausführen, und bei Erfolg die GUI über das PropertyChanged-Ereignis benachrichtigen.

Christian

Weeks of programming can save you hours of planning

M
402 Beiträge seit 2005
vor 10 Jahren

könntest du sie asynchron ausführen, und bei Erfolg die GUI über das PropertyChanged-Ereignis benachrichtigen

imho die einzig "saubere" Lösung...

F
10.010 Beiträge seit 2004
vor 10 Jahren

Und das Ausführen von DAL Aufgaben in einem Property zeigt auch nicht unbedingt eine saubere Architektur.

Aber da Auch WPF INotifyPropertyChanged beachtet kann man ja auch im Async result dann dieses aufrufen.

G
gustavmega Themenstarter:in
78 Beiträge seit 2012
vor 10 Jahren

Danke für eure Antworten.
Da die DB-Abfrage über Webservices gemacht wird (Silverlight), muss leider die Abfrage Asynchron gemacht werden. Glaube die Idee mit PropertyChanged ist genau das, was ich brauche!

Grüße,
G.M.

709 Beiträge seit 2008
vor 10 Jahren

Guten Morgen,
würde das dann nicht zu einer "rekursiven" Abfrage werden?
Sobald das PropertyChanged-Event ausgelöst wird, dürfte beim Holen dann doch erneut eine Datenbankabfrage abgesetzt werden, die das Event dann wieder auslöst usw., oder?

Gruß
pinki

F
10.010 Beiträge seit 2004
vor 10 Jahren

Da das sowieso der Falsche Punkt für die DB Abfrage ist, sollte sich diese Frage eh nicht stellen.

G
gustavmega Themenstarter:in
78 Beiträge seit 2012
vor 10 Jahren

würde das dann nicht zu einer "rekursiven" Abfrage werden?
Sobald das PropertyChanged-Event ausgelöst wird, dürfte beim Holen dann doch erneut eine Datenbankabfrage abgesetzt werden, die das Event dann wieder auslöst usw., oder?

Da hast Du vollkommen recht und ich habe jetzt eine rekursive Abfrage 😦
Weiß jemand, wie ich das verhindern kann?

Da das sowieso der Falsche Punkt für die DB Abfrage ist, sollte sich diese Frage eh nicht stellen.

hast Du vielleicht eine Idee, wie ich es sonst machen könnte?

Grüße,
G.M.

6.911 Beiträge seit 2009
vor 10 Jahren

Hallo gustavmega,

hast Du vielleicht eine Idee, wie ich es sonst machen könnte?

Dieser Code gehört in eine Methode, welche dann z.B. die Eigenschaft setzt und das UI per INotifyPropertyChanged informiert. In einem Eigenschaft gehört kein Code der recht aufwändig (zeitlich gesehen) od. recht viel Logik beinhält.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

5.658 Beiträge seit 2006
vor 10 Jahren

Abgesehen davon finde ich es etwas zweifelhaft, SQL-Abfragen im Klartext an einen Webservice zu schicken...

Weeks of programming can save you hours of planning

G
gustavmega Themenstarter:in
78 Beiträge seit 2012
vor 10 Jahren

@gfoidl: Da hast Du vollkommen recht, aber leider das Objekt darf keine weitere Methoden haben sondern nur Properties!

@MrSparkle: Das verstehe ich nicht so richtig! Wie kann man es eigentlich sonst machen?

Grüße,
G.M.

5.658 Beiträge seit 2006
vor 10 Jahren

Da hast Du vollkommen recht, aber leider das Objekt darf keine weitere Methoden haben sondern nur Properties!

Diese Einschränkung ergibt für mich keinen Sinn. Ein Setter oder ein Getter ist auch nur eine Methode.

Das verstehe ich nicht so richtig!

Niemand wird daran gehindert, eine Drop-Table-Abfrage an deinen WebService zu schicken oder ein "SELECT passwort, email FROM dbo.benutzer". Noch dazu ist dein Programm durch die Art und Weise wie du die Abfragen erstellst anfällig für SQL-Injection.

Wie kann man es eigentlich sonst machen?

Der Zugriff auf die Datenbank sollte nur im DAL auf dem Server erfolgen. Die Parameter sollten auch nie per String-Operationen zur Abfrage hinzugefügt werden, sondern mit der dafür vorgesehenen SqlCommand.Parameters-Eigenschaft.

Christian

Weeks of programming can save you hours of planning

6.911 Beiträge seit 2009
vor 10 Jahren

Hallo gustavmega,

das Objekt darf keine weitere Methoden haben sondern nur Properties

Wer hat diese Vorgabe erstellt? Der soll sich mal mit Design beschäftigen um zu sehen dass diese Forderung einfach sinnlos ist.

Dieser Teil der Logik - neben dem Einwand von MrSparkle - gehört in eine Methode und das Problem ist (fast) schon erledigt.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"