c#
  • asp.net
  • vb.net
  • 2012-04-14 9 views 1 likes 
    1

    Lösung:Welches ist eine bessere Lösung? 1

    Dim i As Integer = CInt(_table.Rows(0).Item(3)) 
    Do While i - 2 > 0 
           _tableBackLogs.Merge(Global.DataAccess.GetDataTable("SELECT SubjectID,SubjectName,Grade FROM SubjectPI WHERE RegNo='" & CInt(HttpContext.Current.Session("userName")) & "' AND Status='Fail' AND Semester='" & i - 2 & "'")) 
           i = i - 2 
          Loop 
    

    solutin 2:

    If i = 1 Then 
           Global.DataAccess.GetDataTable("SELECT SubjectID,SubjectName,Grade FROM SubjectPI WHERE RegNo='" & CInt(HttpContext.Current.Session("userName")) & "' AND Status='Fail' AND Semester='" & i & "'") 
          ElseIf i = 2 Then 
           Global.DataAccess.GetDataTable("SELECT SubjectID,SubjectName,Grade FROM SubjectPI WHERE RegNo='" & CInt(HttpContext.Current.Session("userName")) & "' AND Status='Fail' AND Semester='" & i - 2 & "'") 
          ElseIf i = 3 Then 
           Global.DataAccess.GetDataTable("SELECT SubjectID,SubjectName,Grade FROM SubjectPI WHERE RegNo='" & CInt(HttpContext.Current.Session("userName")) & "' AND Status='Fail' AND Semester='" & i - 2 & "'") 
           'On and on....upto i=8 
          End If 
    

    dem man eine bessere Lösung in Bezug auf Leistung und Geschwindigkeit der Ausführung ist ??

    UPDATE: Ich speichere die Daten in einem DATATABLE .... und dann mit einem ListView.

    +0

    Global.DataAccess.GetDataTable' ist eine Funktion, die eine 'DataTable' zurückgibt – user1150440

    +0

    Die beiden Lösungen sind nicht vergleichbar. In der ersten erhalten Sie eine unpräzise Anzahl von Datensätzen und fügen diese wiederholt zusammen (mehr als ein Semester). In der zweiten erhalten Sie nur die Datensätze für ein bestimmtes Semester (aber das ich Werte sind ein bisschen seltsam). By the way, es ist nicht mit der Frage verbunden, aber dieser Code unterliegt Sql Injection – Steve

    +0

    @Steve OKay danke ... aber wenn die zweite Lösung war etwas wie diese "Global.DataAccess.GetDataTable (" SELECT SubjectID, SubjectName, Klasse FROM SubjectPI WHERE RegNr = '"& CInt (HttpContext.Current.Session (" Benutzername ")) &"' AND Status = 'Nicht bestanden' AND (Semester = 1 ODER Semester = 2 ODER Semester = 3 ")' 'Hier Ich versuche, die Daten von drei Semestern zusammen zu bekommen ... der SQL-Befehl kann falsch sein, aber ich hoffe, Sie bekommen, was versucht zu erklären ... was ist mit dieser Lösung? – user1150440

    Antwort

    1
    Which one is a better solution in terms of performance and speed of execution?? 
    

    Nun, ganz abgesehen von der Sorge über die String-Verkettung, der beste Ansatz wird sein, die alle Daten in der minimalen Anzahl der Anrufe auf die Datenbank zu erhalten benötigt.

    Sie sollten Ihren Code ändern, um zu ermitteln, welche Semester benötigt werden, und dann alles in einer eindeutigen Abfrage zusammenfassen.
    Also, wie Sie gesagt haben, in Ihrem Kommentar wäre (Semester=1 OR Semester=2 OR Semester=3") besser.

    Aus Ihrem Code gehe ich davon aus, dass semester ein Varchar-Feld ist. Das ist schlecht, denn wenn es sich um eine Nummer handelt, könnten Sie eine bessere Abfrage mit minimalen und maximalen Werten schreiben. (Auch wenn Sie sicherstellen können, dass die Semester in fortlaufender Reihenfolge sind.). (Semester >= 1 AND Semester <= 3)

    Die beste Leistung, die Sie daraus erzielen können, ist jedoch, wenn in Ihrer Datentabelle die richtigen Indizes vorhanden sind.

    +0

    Hey Steve ... Entschuldigung für die späte Antwort ... "Semester" ist ein "Integer" -Feld .. ich mache es mit der 'do while'-Schleife, denn wenn ich in Zukunft etwas ändern muss ... werde ich haben Um eine Menge von Aussagen mit dem 'IF END IF' Pfad zu ändern ... ich stimme zu," der beste Ansatz wird sein, alle Daten zu bekommen ded in der minimalen Anzahl von Anrufen an die Datenbank "akzeptiere Ihre als Antwort. – user1150440

    1

    Ein Prinzip des Schreibens von Software ist: Do not Repeat Yourself (DRY). Lösung 1 ist also definitiv besser. Andernfalls treten Probleme mit der Codewartung auf. Ich bezweifle, dass Sie irgendeinen messbaren Geschwindigkeitsunterschied zwischen den zwei Lösungen bekommen werden.

    +0

    Danke für die schnelle Antwort :) – user1150440

    2

    Gibt es einen Grund, nicht "IN" zu verwenden, um alle diese Semesterzahlen in einer Abfrage zu erfassen, wie in so etwas?

    Global.DataAccess.GetDataTable("SELECT SubjectID,SubjectName,Grade 
        FROM SubjectPI 
        WHERE RegNo='" & CInt(HttpContext.Current.Session("userName")) & 
          "' AND Status='Fail' 
           AND Semester IN ('8', '6', '4', '2'))"); 
    

    Denn wenn man kann Verwendung "IN", tun. "Wiederhole dich nicht", ja sicher, ya betcha.

    +0

    weil der Wert von "i" nicht festgelegt ist ...'i' ändert sich mit anderen Bedingungen. – user1150440

    +0

    Das hindert Sie nicht daran, "IN" zu verwenden. Sie bauen Ihre Abfrage bereits aus Teilstrings auf. Erstellen Sie eine Funktion, die die richtige Zeichenfolge für das "IN" generiert, und verwenden Sie diese als Teil Ihrer Abfrage-Erstellung. – mjfgates

    +0

    Okay Chef ..am mache es gerade jetzt :) Danke für die Antwort. – user1150440

    Verwandte Themen