Datenbankaktualisierung

DerStauner

Erfahrenes Mitglied
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.
 

Anhänge

  • subperiods.jpg
    subperiods.jpg
    74,9 KB · Aufrufe: 12
Benutz doch Parameter in deiner SQL. Je nachdem ob du OLEDB oder SQL verwendest schau mal nach DbParemeter. Damit kannst du dann

Code:
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!
 
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.
 
Und wo ist das Problem? Einfach eine foreach die dir dein i hochzählt und mit dem i-Wert den Parameter erstellen

Code:
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;
}
 
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.
 
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...
 
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
 
Zuletzt bearbeitet:
...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 ;-)
 
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.
 
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
 

Neue Beiträge

Zurück