# Problem mit Suchen Statement Java und MS-SQL-Server



## Guest (10. Jan 2005)

hab ein problem mit einem suchen statement in einem java programm dass einen artikel in einer tabelle einer ms-sql-server db suchen soll.

so schaut das prepared statement im java quellcode aus:

psArtikelSuchen = c.prepareStatement("SELECT Nr, Matchcode, Bez1, Bez2, Einheit, Gewicht, Verkaufspreis "+
"FROM ArtikelJava WHERE Nr LIKE ? AND Matchcode LIKE ? AND Bez1 LIKE ? AND "+
"Bez2 LIKE ? AND Einheit LIKE ? AND Gewicht LIKE ? AND Verkaufspreis LIKE ?");

das problem dürfte das LIKE sein. scheinbar funktioniert das in ms-sql-server nicht so wie in ms-access. hat jemand eine ahnung wie man den LIKE befehl im ms-sql-server verwendet bzw. ob man dort anstelle von LIKE einen anderen befehl verwendet?


----------



## DP (10. Jan 2005)

einfach mal in der online-hilfe unter select-syntax schauen...


----------



## Guest (10. Jan 2005)

sorry vielleicht bin ich zu doof dazu, kann unter der ms-sql-server online hilfe nix unter select-syntax finden.
kannst mir vielleicht ein wenig auf die sprünge helfen?


----------



## Bleiglanz (11. Jan 2005)

"FROM ArtikelJava WHERE Nr LIKE ? AND Matchcode LIKE ? AND Bez1 LIKE ? AND "+
"Bez2 LIKE ? AND Einheit LIKE ? AND Gewicht LIKE ? AND Verkaufspreis LIKE ?"); 

dir schon klar, dass ? in prepared Statements eine spezielle Bedeutung haben?

einfach mit setString(index,'%wildcardsuche%') setzen?


----------



## Guest (11. Jan 2005)

ja das ist mir schon klar:

so siehts bei mir aus:


```
public Vector ArtikelSuchen(Artikel a)
    {
        Vector artikel = a.toVector();
        Vector gefundeneArtikel = new Vector();
        try
        {         
            psArtikelSuchen.setString(1, a.getNummer());
            psArtikelSuchen.setString(2, a.getMatchcode());
            psArtikelSuchen.setString(3, a.getBezeichnung1());
            psArtikelSuchen.setString(4, a.getBezeichnung2());
            psArtikelSuchen.setString(5, a.getEinheit());
            psArtikelSuchen.setString(6, a.getGewicht());
            psArtikelSuchen.setString(7, a.getVerkaufspreis());            
            
            ResultSet rs = psArtikelSuchen.executeQuery();
    	 
    	    if (rs != null)
    	    {
    	        while (rs.next())
    	        {
    	            processResultSet(gefundeneArtikel, rs);
    	        }
    	    }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        return gefundeneArtikel;       
    }
```

nur was hat das mit % auf sich? in access brauch ich das nicht, brauch ich das bei ms-sql-server?


----------



## KSG9|sebastian (11. Jan 2005)

was ich weis steht % für ein beliebiges zeichen, wie der '*' in windows.

ich hab zwar net wirlich ahnung von mssql, aber wenn du per setString nach nem String suchst, dann reicht es in deinem sql, wenn du 
"SELECT * FROM tabelle" machst, da -so wie ich es verstehe- nur Datensätze zurückgegeben werden, die dem setString entsprechen


----------



## Bleiglanz (11. Jan 2005)

die Frage ist, welche Fehlermeldung kommt

was steht in den diversen Strings

            psArtikelSuchen.setString(6, a.getGewicht());
            psArtikelSuchen.setString(7, a.getVerkaufspreis());    

sind Gewicht und Verkaufpreis wirklich CHAR-Spalten? Der SQL Server ist vielleicht nicht mehr so grosszügig beim Konvertieren


----------



## Guest (11. Jan 2005)

fehlermeldung bekomm ich eben keine, nur bekomm ich auch keine ergebnis zurückgeliefert, also die suche liefert leere spalten.

im access funktioniert die suche. also ich glaub dass es nicht an den datentypen vom ms-sql server liegt, denn mit dem prepared statement neuer artikel funktioniert alles auch mit ms-sql server perfekt, so schauts aus:


```
psNeuerArtikel = c.prepareStatement("INSERT INTO ArtikelJava Values(?, ?, ?, ?, ?, ?, ?)");

 public int neuerArtikel(Artikel a)
    {
        try
        {         
            psNeuerArtikel.setString(1, a.getNummer());
            psNeuerArtikel.setString(2, a.getMatchcode());
            psNeuerArtikel.setString(3, a.getBezeichnung1());
            psNeuerArtikel.setString(4, a.getBezeichnung2());
            psNeuerArtikel.setString(5, a.getEinheit());
            psNeuerArtikel.setString(6, a.getGewicht());
            psNeuerArtikel.setString(7, a.getVerkaufspreis());
            return psNeuerArtikel.executeUpdate();
        }
        catch (SQLException e)
        {
            e.printStackTrace();
            return -1;
        }
    }
```


----------



## Bleiglanz (11. Jan 2005)

1. sind alle Spalten CHAR oder VARCHAR

2. sind alle Spalten NOT NULL

3. verwendest du Wildcards?

wenn in der Spalte eine NULL ist, dann liefert LIKE 'irgendwas' false

wenn irgendwas drin steht, dann liefert LIKE '' auch false

LIKE ohne Wildcards ist wie =, und die Syntax weicht von ACCESS ab, also % statt *


----------



## Guest (11. Jan 2005)

ich glaub das problem liegt bei den wildcards dass ich diese nicht bzw. nicht richtig verwende.

so hab ichs definiert, jedoch weiß ich nicht genau wie ich die wildcards dann in meinem prepared statement fürs
suchen verwenden soll. kannst mir da weiterhelfen?


```
private void actionSuchen(ActionEvent e)
    {
        String arNr = checkString(tfArNr.getText());
        String arMatch = checkString(tfArMatch.getText());
        String arBezeichnung1 = checkString(tfArBez1.getText());
        String arBezeichnung2 = checkString(tfArBez2.getText());
        String arEinheit = checkString(tfArEinheit.getText());
        String arGewicht = checkString(tfArGewicht.getText());
        String arPreis = checkString(tfArPreis.getText());
        Artikel a = new Artikel();
        a.setNummer(arNr);
        a.setMatchcode(arMatch);
        a.setBezeichnung1(arBezeichnung1);
        a.setBezeichnung2(arBezeichnung2);
        a.setEinheit(arEinheit);
        a.setGewicht(arGewicht);
        a.setVerkaufspreis(arPreis);
        Vector data = dbm.ArtikelSuchen(a);
        dm.setDataVector(data, dbm.getArtikelSpaltenNamen());
        setVisible(false);
        dispose();
    }

  private String checkString(String s)
    {
        if( s.trim().length() == 0)
        {
            return "%";
        }
        else return s;
    }
```


_edit KSG9|plak: code-tags_


----------

