Laden...

SQL update

Letzter Beitrag vor 18 Jahren 16 Posts 2.191 Views
SQL update

hi

in dieser Schleife habe ich ein kleines Problem. Bei jedem durchgang sollte immer vom nächsten Datensatz ein Update gemacht werden. So wie ich es hier geschrieben habe updatet diese Schleife immer die ganze Spalte Column1. Wie kann ich diese Schleife modifizieren das bei jedem durchgang der inneren Schleife den nächste Datensatz updatet wird?

mfg


int Zahl1= 3;		
int Zahl2= 10;
int Zahl3= 1;
			
do  			
{				
	for (int h=1; h<Zahl1 ; h++)				
		{
			string UPDATE = "UPDATE tblTable SET Column1 = " + h;
			con.Execute(UPDATE,out recordsEffected, 0);
			Zahl3++;
		}		
} while (Zahl3<Zahl2);

Dein Update-Statement hat keinerlei Begrenzung, über welche Datensätze es laufen soll, also nimmt es auch alle die es findet... Versuch's mal mit 'ner WHERE-Bedingung.

Bart Simpson

Praxis ist wenn alles funktioniert und keiner weiss warum.
Theorie ist wenn man alles weiss, aber nichts funktioniert.

Bei uns wird Theorie und Praxis vereint: Nichts funktioniert und keiner weiss warum...

Hi Mr. Bart Simpson

Das mein query keinerlei begrenzung hat ist mir schon klar.
Das problem ist das Zahl1 in meinem Beispiel dynamisch sein muss. Wenn ich also 5 für Zahl1 nehme, sollen die ersten 5 datensätze gefüllt werden.
wenn ich 3 nehme, die ersten 3 usw.

mfg
w1z4rd2003

Original von w1z4rd2003
Das mein query keinerlei begrenzung hat ist mir schon klar.

Ich glaube, es ist dir doch nicht klar. Wenn du einzelne Datensätze Updaten willst MUSST du eine WHERE-Klausel einsetzen. Was du machst ist n-mal alle Datensätze updaten. Zu sagen, ich will "die ersten drei" Datensätze updaten macht auch keinen Sinn. Eine "Reihenfolge" gibt es in der DB auch nur im Rahmen einer konkreten SELECT-Anfrage.

wie muss ich es indemfall lösen?

wenn ich z.B die Zahl 7 habe und 20 Datensätze in der Tabelle, will ich in einer Spalte das diese folgendermassen nummeriert werden.

1
2
3
4
5
6
7
1
2
3
4
...
...
...

bis zum 20. Datensatz

Wieso willst du die ersten 20 Updaten? Beschreib mal deine Absicht.

Ich versteh nicht, wie du auf diese Anforderung kommst. Was ist dein Vorhaben? Warum willst du das tun?

Eine Lösung wäre:
Zuerst mit SELECT die 20 letzten ids auslesen (SELECT TOP 20...), anschliessend update WHERE id = id1 or id = id2 usw.

.unreal

Original von w1z4rd2003
1
2
3
4
5
6
7
1
2
3
4
...
...
...

bis zum 20. Datensatz

diese Numerierung ist unmöglich, da Zahlen doppelt vorhanden sind!

das heisst ich kann das so nicht machen? hmmm.... 🤔 wie kann ich denn dieses problem lösen? hat jemand eine Idee?

ich habe eine variable und diese sollte der reihe nach in dieser Spalte abgefüllt werden... bis der letzte datensatz erreicht wird

Füge eine "SortierungsID" ein. Diese gibt die Reihenfolge der Zeilen wieder.

Nun selektiere dir alle sätze "Order by SortierungsID".

Wenn du nun die ersten 20 davon updaten möchtest.läust du über die ersten 20 Zeilen deiner Datatable und setzt dir dnymaisch eine Where clause zusammen die dann so aussieht

"Where SortierungsID=1 or SortierungsID=2 or SortierungsID=3 ... or SortierungsID=20"

Mein Stackoverflow Profil
Skype Name : Boas.Enkler (bitte einen hinweis in der Kontaktanfrage damit ich euch vom Spam unterscheiden kann)

hi haggy

danke für dein post... das problem ist das ich schon ein Autonumber habe in dieser Tabelle. kann nicht mehrere autonumber einsetzen. 🙁

ich dachte eben ich könnte eine schleife zusammenbasteln die mir nach jedem datensatz i+1 einfügt bis 7 erreicht wird und danach wieder von 1 anfängt und das bis eine anzahl von datensätze erreicht werden.

WEnn du ja schon einen aufsteigenden key hast kannst du ja darüber selektieren

Select * from Tabelle order by autoid

Das holst du dir in eine DataTable zbsp. DtRows

dann macht do sowas wie

for(int lni = 0;lni<20;lni++)
{
// Jetzt kommt nur pseudocode
Update Tabelle set Feld = Wert where autoid = DtRows[lni][autoid]
}

Wofür brauchst du das eigentlcih genau?

Mein Stackoverflow Profil
Skype Name : Boas.Enkler (bitte einen hinweis in der Kontaktanfrage damit ich euch vom Spam unterscheiden kann)

das mit der ID wäre keine schlechte Idee... das einzige das nicht klappt ist das die ID nicht immer bei 0 oder 1 anfängt... wenn ich ein paar datensätze lösche wird sie weiter nummeriert... und das ganze stimmt nacher nicht mehr überein.

Das spielt in dem Fall doch auch keine rolle

die schleife mit for i = 0 bis 20 bezieht sich ja anur auf die records in der DataTable.

DAnn liest du die ID an der stelle aus und ob da 1,2,3,4 oder 1,4,6,7 rauskommt ist ja egal.

Mein Stackoverflow Profil
Skype Name : Boas.Enkler (bitte einen hinweis in der Kontaktanfrage damit ich euch vom Spam unterscheiden kann)

sorry aber habs nicht so geschnallt... also nochmals...

ich habe momentan folgendes. Ein dataset und ein oledbdataadapter

in meiner tabelle habe ich ein paar spalten die ich mit einem insert statement befülle.


int q = listBox2.Items.Count;
con.Open(conString, null, null, 0);
object recordsEffected;

for(int i=0; i<q; i++)
			{
string INSERT_SQL = "INSERT INTO tblSpiel (Zeit, Spiel, FK_Gruppe_ID) VALUES(" + "'" + txtSpielzeitvon.Text + "'" + "," +  "'" + listBox2.Items[i].ToString() + "'" + ", '" + cmbGruppe.SelectedValue + "'" + ")";
					

con.Execute(INSERT_SQL,out recordsEffected, 0);
fnRefresh();
			}

Somit habe ich ein paar Spalten gefüllt. Sagen wir mal ich habe wie gesagt 20 Datensätze...(könnten aber auch mehr oder weniger sein).

in einer Variable habe ich die Anzahl Spielfelder gespeichert. Nehmen wir mal an es sind 4. Ich muss jetzt mit einem Update befehl für den ersten Datensatz das Spielfeld 1 für das zweite Spiefeld 2, für das dritte Spielfeld 3 für das 4 Spiefeld 4 für das 5 Spiefeld 1 usw.

ich hab mal hier so eine schleife zusammengestellt. Die Ausgaben der MessageBox die kommentiert wurde sind richtig. Aber habe nicht genau geschnallt wie du das meinst mit den DataTable


int Anzahl = dataSet_Spiel1.tblSpiel.Rows.Count;
			int Spiele = 1;
			do  
			{
				for (int h=1; h<int.Parse(Spielfelder)+1 ; h++)
				{
					//MessageBox.Show("Spiel" + Spiele + "Feld" + h);
					string UPDATE = "UPDATE tblSpiel SET Spielfeld = " + h;
					con.Execute(UPDATE,out recordsAffected, 0);
					Spiele++;
					fnRefresh();
				}
			} while (Spiele<Anzahl);
			con.Close();
			oleDbDataAdapter2.Fill(dataSet_Spiel1);
			fnRefresh();

habe ein wenig an meiner schleife gebastellt... bin bis jetzt auf diese Lösung gekommen.

nehmen wir an ich habe 4 spielfelder.
die ersten 4 datensätze werden folgendermassen gefüllt:

Spiel1 Platz (1

Spiel2 Platz (2

Spiel3 Platz (3

Spiel4 Platz (4

das problem ist das es beim fünften durchlauf wieder von anfang an anfängt zu updaten. Das heisst die ersten 4 datensätze werden 4 mal updated. ich möchte aber das es das zweite, dritte und vierte mal nicht die gleiche updatet sondern immer die nächsten vier.

habe probiert mit int p etwas zu codieren aber scheint nicht so wirklick zu funktionieren. vielleicht hat jemand von euch eine idee wie ich das besser lösen könnte

mfg


			string Spielfelder = ((System.Data.DataRowView)this.lstSpielfelder.Items[0])["Spielfelder"].ToString();
			int Anzahl = dataSet_Spiel1.tblSpiel.Rows.Count;
			int Spiele = 1;
			con.Open(conString, null, null, 0);
			do  
			{
				int p = 1;
				 for (int h=1; h<int.Parse(Spielfelder)+1 ; h++)
					{
					object recordsAffected;
					 //MessageBox.Show("Spiel" + Spiele + "Feld" + h);
					 string UPDATE = "UPDATE tblSpiel SET Spielfeld = " + "'" + h + "'" + " WHERE `PK Spielfeld_ID` = " + dataSet_Spiel1.tblSpiel[p]["PK Spielfeld_ID"] ;
					 con.Execute(UPDATE,out recordsAffected, 0);
					 Spiele++;
					 p++; 
					 fnRefresh();
					}

			} while (Spiele<Anzahl);
			con.Close();
			oleDbDataAdapter2.Fill(dataSet_Spiel1);


probier mal das hier

string Spielfelder = ((System.Data.DataRowView)this.lstSpielfelder.Items[0])["Spielfelder"].ToString();

//gesamt anzahl spiele
int anzahl_spiele = dataSet_Spiel1.tblSpiel.Rows.Count;

//anzahl spielfelder
int anzahl_felder = int.Parse(Spielfelder);

con.Open(conString, null, null, 0);

int feld = -1;
for(int spiel=0; spiel<anzahl_spiele; spiel++) {
	feld = (feld+1) % anzahl_felder; //werte 0 bis anzahl_felder-1
	
	object recordsAffected;
	//MessageBox.Show("Spiel" + Spiele + "Feld" + h);
	
	string UPDATE = "UPDATE tblSpiel SET Spielfeld = " + "'" + (feld+1) + "'" + " WHERE `PK Spielfeld_ID` = " + dataSet_Spiel1.tblSpiel[spiel]["PK Spielfeld_ID"] ;
	
	con.Execute(UPDATE,out recordsAffected, 0);
	fnRefresh();
}
con.Close();
oleDbDataAdapter2.Fill(dataSet_Spiel1);

jetzt ist auch nur eine schleife drin
wert für dsa spielfeld wird über modulo gebildet, was in deinem fall werte von 0 bis anzahl_spiele-1 ergibt, dadurch das +1 beim eintragen in die tabelle

da die zeilen im datarow mit dem index 0 anfangen läuft die schleife von 0 bis tblSpiel.Rows.Count-1

alternative mit foreach

string Spielfelder = ((System.Data.DataRowView)this.lstSpielfelder.Items[0])["Spielfelder"].ToString();

//anzahl spielfelder
int anzahl_felder = int.Parse(Spielfelder);

con.Open(conString, null, null, 0);

int feld = -1;
foreach(DataRow row in dataSet_Spiel1.tblSpiel.Rows) {
	feld = (feld+1) % anzahl_felder; //werte 0 bis anzahl_felder-1
	
	object recordsAffected;
	//MessageBox.Show("Spiel" + Spiele + "Feld" + h);
	
	string UPDATE = "UPDATE tblSpiel SET Spielfeld = " + "'" + (feld+1) + "'" + " WHERE `PK Spielfeld_ID` = " + row["PK Spielfeld_ID"] ;
	
	con.Execute(UPDATE,out recordsAffected, 0);
	fnRefresh();
}
con.Close();
oleDbDataAdapter2.Fill(dataSet_Spiel1);

p.s. würd dir empfehlen parameterisierte statements zu benutzen... dann kannst du deinen query zentral irgendwo definieren und mußt hier nur noch die werte für die parameter setzen... ist etwas übersichtlicher und du mußt dich auch nicht mit den formatierungen rumschlagen

ist übrigens ungetestet... sollte aber funktionieren