tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
9
ZUGRIFFE
273
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    DerStauner DerStauner ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    228
    hi,

    ich habe folgende Tabelle (siehe Anhang). Ich lösche einige Zeilen, wo PeriodCode=2010, z. B. die Zeilen, wo SubPeriodCode zwischen 5 und 9 ist. Und jetzt möchte ich die Spalte SubPeriodCode wieder mit Zahlen beginnend mit 1 auffüllen.

    Das machte ich bisher so:

    for i=0 to dgvsubperiods.rowcount-1
    cmd.commandtext="update SubPeriods set SubPeriodCode=i+1 where PeriodCode='2010'
    cmd.executenonquery
    next i

    das Problem damit ist natürlich, dass ich nach dem Update so eine Tabelle bekomme, wo die SubPeriodCodes alle den gleichen Wert haben. das ist ja logisch, weil die Zeilen den letzten Wert von i+1 bekommen.

    Frage: wie aktualisiere (erneut numeriere) die SubPeriodCodes, wo PeriodCode='2010'?

    Danke.
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken Datenbankaktualisierung-subperiods.jpg  
     

  2. #2
    M4st3r M4st3r ist offline Mitglied Brokat
    Registriert seit
    Jan 2005
    Ort
    Frankfurt am Main
    Beiträge
    297
    Benutz doch Parameter in deiner SQL. Je nachdem ob du OLEDB oder SQL verwendest schau mal nach DbParemeter. Damit kannst du dann

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    cmd.Parameters.Clear();
    cmd.commandtext="update SubPeriods set SubPeriodCode=@code where PeriodCode=@pCode"
     
    DbParameter p = createParameter("@code", "paramValue")
    cmd.Parameters.Add(p);
    p = createParameter("@pCode", "paramValue")
    cmd.Parameters.Add(p);
     
    cmd.executenonquery

    machen - so in der Art - du musst nur die Methode createParameter implementieren die dir den entssprechenden Parameter-Typ zurückgibt. Da hilft dir aber die MSDN, Bing oder Google weiter!
     
    http://dirkgoldecker.spaces.live.com

    . Microsoft Certified Technology Specialist
    . Microsoft Certified Professional Developer
    |-> Web Applications

  3. #3
    DerStauner DerStauner ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    228
    aber das würde wieder resultieren, dass ich in SubPeriodCode in allen Zeilen (wo PeriodCode=2010) den letzten Wert des letzten Parameters habe. oder ich habe es nicht richtig verstanden.

    also ich möchte so ein update machen, wo ich zwei Spalten habe, die erste Spalte bleibt immer das gleiche, und die Werte der zweiten Spalte sollten sich ändern. Und dazu muss ich unbedingt eine where Klausel angeben, sonst würde das update statement die ganze Tabelle ändern.
     

  4. #4
    M4st3r M4st3r ist offline Mitglied Brokat
    Registriert seit
    Jan 2005
    Ort
    Frankfurt am Main
    Beiträge
    297
    Und wo ist das Problem? Einfach eine foreach die dir dein i hochzählt und mit dem i-Wert den Parameter erstellen

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    int _SubPeriodCode = 2010;
     
    for(i = 0; i < whatever; i++)
    {
    cmd.Parameters.Clear();
    cmd.commandtext="update SubPeriods set SubPeriodCode=@subPeriodCode where PeriodCode=@pCode"
     
    DbParameter p = createParameter("@subPeriodCode", _SubPeriodCode)
    cmd.Parameters.Add(p);
    p = createParameter("@pCode", i)
    cmd.Parameters.Add(p);
     
    cmd.executenonquery;
    }
     
    http://dirkgoldecker.spaces.live.com

    . Microsoft Certified Technology Specialist
    . Microsoft Certified Professional Developer
    |-> Web Applications

  5. #5
    DerStauner DerStauner ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    228
    du hast es in deinem Beispiel umgekehrt geschrieben. in deinem Beispiel wird subperiodcode überall 2010 sein, wo periodcode 1, 2, usw ist (was niemals zutreffen wird)

    ich möchte es gerade umgekehrt haben: überall, wo periodcode 2010 ist, sollen die subperiodcodes 1, 2, usw sein. aber das kann ich mit einer for-Schleife nicht machen.

    als erstes werden alle subperiodcodes 1 sein, wo periodcode 2010 ist. im 2. Durchlauf werden alle subperiodcodes 2 sein, wo periodcode 2010 ist, usw. aber ich möchte das nicht. eine where Klausel muss ich trotzdem angeben.
     

  6. #6
    M4st3r M4st3r ist offline Mitglied Brokat
    Registriert seit
    Jan 2005
    Ort
    Frankfurt am Main
    Beiträge
    297
    Sorry, aber das schöne ist doch, dass du die Parameter und die SQL so zusammen bauen kannst wie du sie brauchst. Ich will dir ja keinen fertigen Code hinstelle sondern nur andeuten wie du es machen könntest...
     
    http://dirkgoldecker.spaces.live.com

    . Microsoft Certified Technology Specialist
    . Microsoft Certified Professional Developer
    |-> Web Applications

  7. #7
    DerStauner DerStauner ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    228
    ok, ich werde mir darüber den Kopf zerbrechen. ich werde mich dann melden, wenn ich den code habe. Übrigens habe ich nichts dagegen, wenn jemand nur Andeutungen macht, wie ich etwas machen soll. Damit entwickelt sich mein Programmierwissen.

    und hier die Lösung:

    For i = 0 To dgvSubPeriods.RowCount - 1
    cmd.CommandText = "UPDATE SubPeriods SET SubPeriodCode=" & i + 1 & " WHERE PeriodCode='" & txtPeriodCode.Text & "'" & _
    " AND SubPeriodCode-(" & i + 1 & ")=0"
    cmd.ExecuteNonQuery()
    Next
    Geändert von DerStauner (30.06.09 um 21:39 Uhr)
     

  8. #8
    M4st3r M4st3r ist offline Mitglied Brokat
    Registriert seit
    Jan 2005
    Ort
    Frankfurt am Main
    Beiträge
    297
    ...und wenn dir jetzt jemand in txtPeriodCode in etwa sowas reinschreibt:

    '; DELETE * FROM SubPeriods; --

    ist alles weg und das ist noch die harmloseste aller Möglichkeiten!

    Lies dich in die Parameter ein, damit verhinderst du Sql-Injection und dein Programmierwissen entwickelt sich
     
    http://dirkgoldecker.spaces.live.com

    . Microsoft Certified Technology Specialist
    . Microsoft Certified Professional Developer
    |-> Web Applications

  9. #9
    DerStauner DerStauner ist offline Mitglied Gold
    Registriert seit
    Oct 2007
    Beiträge
    228
    ehrlich gesagt habe ich bisher auf die Benutzung von parameters verzichtet und alles mit & gemacht.

    die Parametisierung ist wirklich einfach, nicht aufwendig, aber verursacht zuviel Codezeile.

    und ausserdem bin ich der Meinung, dass man ein Programm niemals so schreiben kann, dass es gegen alle Arten von Users gewappnet ist.

    und ich denke, wenn in txtperiodcode.text sowas steht, wie du es geschrieben hast, dann passiert nichts (vielleicht denke ich es falsch), weil es keine PeriodCode ist, das dem angegebenen Wert entspricht.
     

  10. #10
    M4st3r M4st3r ist offline Mitglied Brokat
    Registriert seit
    Jan 2005
    Ort
    Frankfurt am Main
    Beiträge
    297
    Kann man nicht, da hast du recht, aber man kann es versuchen! Hast du die Zeichen ' und ; vor dem DELETE gesehen? Damit wird das Update-Statement beendet und ein Delete der Tabelle gemacht. Machst du String-Concatination z.B. für einen Login für ein Programm kann man sowas machen:

    select count(*) from users where UserName='"& userName &"' AND UserPassword='"& password &"'

    wenn du dann pech hast bekommst du als Strings sowas:

    userName = "' OR '1'='1";
    password = "' OR '1'='1";

    und schon hast du ein Problem. Die 3-4 Codezeilen um Parameter einzubauen bringen keinen um und machen dein Programm um einiges sicherer.

    Falls es dich interessiert lies dir das mal durch: http://www.aspheute.com/artikel/20011030.htm
     
    http://dirkgoldecker.spaces.live.com

    . Microsoft Certified Technology Specialist
    . Microsoft Certified Professional Developer
    |-> Web Applications