Zmienna w zapytaniu MySQL

0

Cześć,
czy ktoś mógłby zerknąć okiem i podpowiedzieć mi, dlaczego zapytanie nie zwraca mi numeru klienta i salda (44. linijka kodu) dla pobranego od użytkownika numeru klienta?
Przy pobraniu wszystkich danych [quote](ResultSet myRs = myStmt.executeQuery("select * from klienci") [/quote] dostaję informację zwrotną.

Kod: http://wklej.to/csrSY

Bartek

0

Nie znam Javy ale wydaje mi się że coś takiego jak napisałeś :

 ResultSet myRs = myStmt.executeQuery("SELECT * FROM klienci WHERE numer_klienta=+'podany_numer_klienta'"); 

ywśle do serwera zapytanie : SELECT * FROM klienci WHERE numer_klienta=+'podany_numer_klienta'

co jest głupotą oczywiście.

Powinno być raczej:
```java
 ResultSet myRs = myStmt.executeQuery("SELECT * FROM klienci WHERE numer_klienta="+podany_numer_klienta);

I podany_numer_klienta pewnie trzeba na stringa wcześniej rzutować.

0

dzięki, działa :)

0

A może by tak zastosować parametryzację zapytania, żeby zapobiec atakowi typu Sql Injection za pomocą Twojej aplikacji:
http://stackoverflow.com/questions/14913605/mysql-queries-parameters-and-passing-values

Jestem co prawda dużo bardziej CSharpowcem ale rzuciło mi się to w oczy o razu jakoś. ;)

0

Z pewnością z czasem nauczę się i tego ;)
Teraz jednak borykam się z podstawowymi problemami.
Mam problem z aktualizacją rekordu w bazie danych. Nie do końca rozumiem schemat połączenia z bazą. Utworzyłem sobie "tak o" obiekt "MyRs2" dla "case: 2".
Linijka 55. - proszę o pomoc.
http://wklej.to/iR54j
Całość się wykonuje, jednak nie zmienia wartości w bazie - MySQL wyrzuca błędy.

Bartek

0

Obstawiam, że chodzi o :

SET stan_konta="+(myRs2.getInt("stan_konta")+podana_kwota_wplaty) +"WHERE numer_klienta="+podany_numer_klienta); 

przed WHERE powinna być spacja bo "zlewa" się z wartością którą chcesz przypisać do stanu konta.

Na przyszłość:

  1. Podaj treść błędu
  2. Zapnij debugera tak żeby zobaczyć jakie dokładnie zapytanie jest wysyłane do bazy i sprawdź czy wszystko jest ok.

No i nie wiem czy dobrze robisz że w pętli

while (myRs2.next()) { }

zmieniasz wartość:

ResultSet myRs2 = myStmt.executeUpdate("UPDATE klienci SET stan_konta="+(myRs2.getInt("stan_konta")+podana_kwota_wplaty) +"WHERE numer_klienta="+podany_numer_klienta);
0

Ok, dzięki, jednak konsola dalej zwraca błąd:

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
Duplicate local variable myRs2
Type mismatch: cannot convert from int to ResultSet

at jdbcdemo.Driver.main(Driver.java:54)

http://wklej.to/fW0tf

0

Chyba powinienem założyć konto...
Udało mi się dojść najdalej do

***  Witamy w banku Krzak S.A.  *** 

 Menu główne: 
 1. Sprawdź saldo 
 2. Wpłać gotówkę
Twój wybór: 2
Wprowadź numer klienta: 69856
Twój numer klienta: 69856. Twój obecny stan konta: 899 PLN
Wprowadź kwotę wpłaty: 3
java.sql.SQLException: Operation not allowed after ResultSet closed
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:998)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:937)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:872)
	at com.mysql.jdbc.ResultSetImpl.checkClosed(ResultSetImpl.java:740)
	at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1034)
	at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2577)
	at jdbcdemo.Driver.main(Driver.java:57)
 

Z kodem http://wklej.to/Tr0nr

0

Dwa razy zadeklarowana zmienna myRs2, ale to nic bo metoda executeUpdate w klasie Statement zwraca int, a nie obiekt typu ResultSet. Masz zamień to na takie coś:

 
	case 2:
					int podana_kwota_wplaty;
					System.out.print("Wprowadź numer klienta: ");					    
					podany_numer_klienta = odczyt_numer_klienta.nextInt();
					ResultSet myRs2 = myStmt.executeQuery("SELECT * FROM klienci WHERE numer_klienta="+podany_numer_klienta);
					 while (myRs2.next()) {
							System.out.println("Twój numer klienta: " + myRs2.getInt("numer_klienta") + ". Twój obecny stan konta: " + myRs2.getInt("stan_konta") + " PLN");
							System.out.print("Wprowadź kwotę wpłaty: ");
							Scanner odczyt_kwota_wplaty = new Scanner(System.in);
							podana_kwota_wplaty = odczyt_kwota_wplaty.nextInt();
							myStmt.executeUpdate("UPDATE klienci SET stan_konta="+(myRs2.getInt("stan_konta")+podana_kwota_wplaty) +" WHERE numer_klienta="+podany_numer_klienta);

							System.out.println("Dokonałeś wpłaty w wysokości " + podana_kwota_wplaty + " PLN. Nowy stan konta: " + (myRs2.getInt("stan_konta")+podana_kwota_wplaty) + " PLN");

						} 	
					
//69856	
				break;
0

Mam wrażenie, że wysłany przez Ciebie kod niczym się nie różni, jednak i tak nie działa.
Nie wiem jak, bo nie do końca jeszcze rozumiem mechanizm działania, ale wpadłem na pomysł dodania linii, utworzenie nowego "Statement" po "case: 2"

Statement myStmt2 = myConn.createStatement();

I śmiga! :)
Dziękuję, temat do zamknięcia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1