ERLEDIGT
JA
JA
ANTWORTEN
9
9
ZUGRIFFE
273
273
EMPFEHLEN
-
29.06.09 19:54 #1
- 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.
-
29.06.09 22:01 #2
- 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
-
30.06.09 11:39 #3
- 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.
-
30.06.09 13:02 #4
- 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
-
30.06.09 18:10 #5
- 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.
-
30.06.09 20:06 #6
- 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
-
30.06.09 21:15 #7
- 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()
NextGeändert von DerStauner (30.06.09 um 21:39 Uhr)
-
01.07.09 08:58 #8
- 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
-
01.07.09 17:55 #9
- 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.
-
01.07.09 21:36 #10
- 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.htmhttp://dirkgoldecker.spaces.live.com
. Microsoft Certified Technology Specialist
. Microsoft Certified Professional Developer
|-> Web Applications





Zitieren
Login





