SQL equals

TryToProg

Mitglied
Hallo

das Folgende Programm soll eine definierte Kundennummer aus einem Pool von Kundennummern finden die in einer SQL Datenbank liegen.

Java:
String[] KundennummerSQLString = new String[100];

				
				String KundennummerEingabeString = KundennummerEingabe.getText();

				
				
				

				Connection myCon;
				Statement myStmt;

				try {

					Class.forName("com.mysql.jdbc.Driver").newInstance();

					myCon = DriverManager.getConnection(
							"jdbc:mysql://localhost:3306/service", "root",
							"");

					myStmt = myCon.createStatement();

					
					
					for ( int i = 0  ; i < KundennummerSQLString.length; i++) {
						
						ResultSet Result = myStmt
								.executeQuery("SELECT Kundennummer FROM service");
						
						while (KundennummerEingabeString.equals(KundennummerSQLString[i])) {
							
					Result.next();
					KundennummerSQLString[i] = Result.getString("Kundennummer");
					System.out.println("" +KundennummerSQLString[i]);
					
						}
						

					}

Normal sollte er mir damit zumindest alle gespeicherten Kundennummern ausgeben, bekomme jedoch gar keine Ausgabe.
 
Die while-Schleife wird nie betreten.
Code:
KundennummerSQLString[i]
ist immer null. Es wird nirgends befüllt.

PS:
Schau dir mal die Code conventions an, die gibts nicht ohne Grund 😉
 
In der ersten Schleife gibt der Out befehl alle kundennummern aus, in der zweite spamt er nur noch die letzte gespeicherte....warum???:L???:L

Java:
for (int i = 0 ; i < KundennummerSQLString.length; i++) {
						ResultSet Result = myStmt
								.executeQuery("SELECT Kundennummer FROM pizzaservice");
					while (Result.next()) {
					KundennummerSQLString[i] = Result.getString("Kundennummer");
					System.out.println("" + KundennummerSQLString[i]);
							
					}}




for (int i = 0 ; i < KundennummerSQLString.length; i++) {
						System.out.println(KundennummerSQLString[i]);
					}
 
Die while-Schleife innerhalb der for-Schleife macht keinen Sinn.
Du führst x mal das SQL Query aus und überschreibst dann das komplette Array. Eine einzelne Schleife reicht da völlig aus.
 
definierte Kundennummer aus einem Pool von Kundennummern

Hört sich ein bisschen merkwürdig an und wird wohl auch Probleme machen, wenn zwei Clients zeitgleich diese Funktion aufrufen. Diese können dann natürlich die gleichen Kundennummer bekommen und das ist wahrscheinlich ein Fehler wenn Du damit z.B. Einträge in die DB machen möchtest, weil halt der zweite Aufrufer eine Contraint-Violation mit der ID bekommt, weil nicht eindeutig.

So etwas "überlässt" man üblicherweise der DB. Zwar kenne ich mich mit mySQL nit soooo gut aus, aber es gibt Auto-Increment Spalten die von der DB, halt automatisch, erhöht werden. So ist sichergestellt das Clients unterschiedliche IDs bekommen, selbst wenn diese zeitgleich vom Programm aufgerufen werden. Über LAST_INSERT_ID() kann man sich auch den zuletzt erzeugten Wert von der AUTOINCREMENTgeben lassen.

Oracle bietet so etwas in der Form von Sequenzen und man kann sich über sequence.netVal() den nächsten eindeutigen Wert geben lassen.

Also ich rate dir derartige Funktionen von der DB machen zu lassen.

<Klugs******er ON>
Dieses bezeichnen wir Informatiker als Check-Then-Act Problem und dies ist bei konkurierenden Zugriffen ein Problem. Denn zwischen der Zeit, wo du geprüft hast, welche Bedingung (Kundennummer) du nehmen sollst, kann diese bereits von einem anderen Client verwendet (Act) verwendet worden sein (und ein Insert mit Kundennummer) gemacht worden sein. Erstere Client versucht dies nun auch und fällt auf die Nase. Natürlich können derartige Zugriffe synchronisiert werden, aber erstens ist dies aufwändig, und zweitens ist genau dafür die DB bereits ausgelegt.
<Klugs******er OFF>
 

Neue Themen


Zurück
Oben