# Like-Klausel; NPE bzw. leeres ResultSet



## @x.l (13. Jul 2007)

Hallo,

ich stelle mit Hilfe eines Servlets eine Abfrage an eine Access-DB. Dabei verwende ich die LIKE - Klausel für eine Wortgruppe (Bsp: "suche den Text"), d.h. also mit Leerzeichen. 
(Anm.: Die Verwendung von * anstelle von % in der Like-Klausel hatte mich auch verwundert, aber nach ein paar Tests direkt in Access zeigte sich, dass das der richtige Weg ist.)

Ich bekomme diese (scheinbar) leichte Aufgabe, aber einfach nicht gebacken, entweder bekomme ich eine NullPointerException (NPE) oder das erhaltene ResultSet ist leer.

Hier mal, dass was ich so alles ausprobiert habe:

1. Verwendung eines PreparedStatement:


```
pstm = connection.prepareStatement("SELECT * FROM TabName WHERE TabName.ColName LIKE '*?*';");
pstm.setString(1, identifier);
rs = pstm.executeQuery();
```

Der Aufruf _pstm.setString()_ produziert eine NPE! Darauf hin habe ich mehrere Kombinationen von _'*?*'_ probiert, sobald ich aber etwas anderes nehme (Bsp. Anführungszeichen, Kombination aus Anführungszeichen und Hochkommas, ...) funktioniert zwar (meist) die Zeile _pstm.setString()_, aber dafür liefert _executeQuery_ eine SQLException (Access meldet falsche Syntax -> was ja auch stimmt)

2. Verwendung von Statement


```
stm = connection.createStatement();
String query = "SELECT * FROM TabName WHERE TabName.ColName LIKE '*" + identifier + "*';";
rs = stm.executeQuery(query);
```

Dies funktioniert zwar, jedoch ist das ResultSet leer! (Die direkte Abfrage in Access liefert jedoch mehrere Ergebnisse, d.h. die Abfrage müsste korrekt sein.)

Ich bin für jede Anregung dankbar, wie man dieses Problem lösen könnte!

Grüße
   Axel


----------



## SlaterB (13. Jul 2007)

wenn etwas nicht funktioniert, warum um alles in der Welt dann Variablen verwenden?
test doch erst mal 
String query = "SELECT * FROM TabName WHERE TabName.ColName LIKE '*anton*';"; 
rs = stm.executeQuery(query); 
oder was immer dein Teststring ist

-------

fürs Prepared noch eine Variante (erst testen wenn auch Preperad mit festen String anton funkioniert!):
pstm = connection.prepareStatement("SELECT * FROM TabName WHERE TabName.ColName LIKE ?;"); 
pstm.setString(1, "*"+identifier+"*");


----------



## @x.l (13. Jul 2007)

Habe beides probiert (habe auch keine Variable verwendet), zwar habe ich keine NPE, das ResultSet blieb dennoch leer!
 ???:L


----------



## Guest (13. Jul 2007)

% statt * verwenden.


----------



## @x.l (16. Jul 2007)

Die Lösung war die Kombination von _SlaterB _und _Gast_:



```
pstm = connection.prepareStatement("SELECT * FROM TableName " +
                                   "WHERE TableName.ColName LIKE ?;");
            
pstm.setString(1, "%Zu suchende Wortgruppe%");
```

Danke!


----------

