# SQL-Abfrage bricht vor dem Ende ab



## leo1234 (2. Feb 2014)

Hallo Community,

ich habe folgendes Problem: Ich habe eine MSAccess-Datenbank mit einer Tabelle BPw, die fiktive Benutzernamen und Passwörter enthält. Beides habe ich mit einer einfachen Caesar-Verschiebung codiert. In folgendem Text sind benutzername und passwort die zu überprüfenden Werte, die Methode gibt true zurück, wenn das Passwort stimmt:


```
private boolean checkPw(){
		String neupsw="";
		boolean psw=false;
		String query = "SELECT * FROM BPw WHERE Fld1 = '" + Code.Encrypt(benutzername) +"'";
		System.out.println(query);
		ResultSet rs=null;
		try {
	        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
	        String accessFileName = "C:/Database";
	        String connURL="jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ="+accessFileName+".accdb;";
	        Connection con = DriverManager.getConnection(connURL, "","");
	        Statement stmt = con.createStatement();
	        stmt.execute(query); 
	        rs = stmt.getResultSet();
	        if (rs != null) {
				rs.next();
				neupsw=Code.Decrypt(rs.getString("Fld2"));
				if(passwort.equals(neupsw)) psw=true; else psw=false;
			}
			stmt.close();
	        con.close();
		}catch(Exception e){e.printStackTrace();}
		return psw;
	}
```

Wenn ich jeweils die En-/Decrypt Anweisungen lösche und den codierten Namen/Passwort prüfe, funktioniert das Programm. Mit dem (de)codieren jedoch, kommt folgende Fehlermeldung (aeoio ist das codierte Wort):

```
java.sql.SQLException: [Microsoft][ODBC-Treiber für Microsoft Access] Syntaxfehler in Zeichenfolge in Abfrageausdruck 'Fld1 = 'aeoio'.
at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcStatement.execute(Unknown Source)
at communicator.LogIn.checkPw(LogIn.java:107)
at communicator.LogIn.check(LogIn.java:84)
at communicator.LogIn.keyPressed(LogIn.java:134)
at java.awt.Component.processKeyEvent(Unknown Source)
at javax.swing.JComponent.processKeyEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
//und so weiter...
```

Der Fehler tritt bei 
	
	
	
	





```
stmt.execute(query);
```
 auf.

Die Methode Encrypt sieht so aus: 
	
	
	
	





```
public static String Encrypt(String s)
```
, Decrypt genauso.

Durch ein bisschen herumprobieren habe ich herausgefunden, dass bei 
	
	
	
	





```
SELECT * FROM BPw WHERE Fld1 = 'aeoio'
```
 die SQL-Abfrage vor dem letzten Hochkomma beendet wird. Wegen dem "fehlenden" Hochkomma gibt es deswegen einen Syntaxfehler. Auch das maskieren mit \' hilft nichts.

Hat jemand eine Idee hierzu?


----------



## turtle (3. Feb 2014)

Ich muss zugeben auch nicht genau zu wissen, woran es liegen kann.

Ich schlage aber trotzdem vor, den Code zu ändern und besser PreparedStatements zu verwenden. Sieht erstens besser aus im Code und ist zudem meistens schneller. Ausserdem sieht das Zusammenfrickeln von SQL-Texten s******e aus, ist zudem anfällig für SQL-Injection, und, und...


```
PreparedStatement preparedStatement = con.prepareStatement("SELECT * FROM BPw WHERE Fld1 = ?");
		preparedStatement.setString(1, "aeoio");
		ResultSet executeQuery = preparedStatement.executeQuery();
```


----------



## leo1234 (3. Feb 2014)

Danke, jetzt funktionierts!!! :toll:


----------

