muuttuja

where osassa

Hei

Kun kysyn käyttäjältä tietoa, jonka perusteella tehdään Select-lauseen Where osa, niin miten muuttuja merkitään???

Tämä ei toimi, parametrejä puuttuu, vaikka muuttujan sisältö osataan kuitenkin lukea oikein.

String sql="SELECT As_nro,Etu_nimi,Suku_nimi FROM Asiakkaat where Etu_nimi = " nimi " ";

Ja sitten virheilmoitus


anna etunimi, ketõ haet?
Ulla
SELECT As_nro,Etu_nimi,Suku_nimi FROM Asiakkaat where Etu_nimi = Ulla
Exception in thread "main" java.sql.SQLException: [Microsoft][ODBC Microsoft Acc
ess -ohjain] Liian võhõn parametreja. Tarvitaan 1.
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6957)
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7114)
at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(JdbcOdbc.java:3110)
at sun.jdbc.odbc.JdbcOdbcStatement.execute(JdbcOdbcStatement.java:338)
at sun.jdbc.odbc.JdbcOdbcStatement.executeQuery(JdbcOdbcStatement.java:2
53)
at jdbc.main(jdbc.java:22)
Jatka painamalla mitä tahansa näppäintä . . .


mainin rivissä on tämmöinen koodi, joka toimii muuten

ResultSet rs = stmt.executeQuery(sql);

3

595

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • fidel1

      Virhe on se, ettet ympäröi tekstimuotoista muuttujaa yksinkertaisilla lainausmerkellä. Eli siis näin:

      "SELECT As_nro,Etu_nimi,Suku_nimi FROM Asiakkaat where Etu_nimi = '" nimi "'"

      Monesti parempi keino on tosin käyttää PreparedStatement-rajapintaa. Eli näin:

      PreparedStatement stmt = conn.prepareStatement(
      "SELECT As_nro,Etu_nimi,Suku_nimi FROM Asiakkaat where Etu_nimi = ?");
      stmt.setString(1, nimi);
      stmt.executeQuery();

      Eli SQL-lauseen muuttuja määritellään kysymysmerkeillä ja PreparedStatement-luokan set*-metodeilla laitetaan näille muuttujille arvot.

      • tietenkin

        hei

        Hipsut ja hipsut :-)

        Kirjassa väitetään ,että toi toinen vaihtoehto olisi nopeampi kyselyissä?

        Osaatko sanoa onko sillä oikeasti käytännön merkistystä, vai milloin sitä olisi parempi käyttää.

        Testailen kiinnostuksen vuoksi, mutta eihän sitä koskaan tiedä milloin pitäisi oikeasti tehdä jotain


      • fidel1
        tietenkin kirjoitti:

        hei

        Hipsut ja hipsut :-)

        Kirjassa väitetään ,että toi toinen vaihtoehto olisi nopeampi kyselyissä?

        Osaatko sanoa onko sillä oikeasti käytännön merkistystä, vai milloin sitä olisi parempi käyttää.

        Testailen kiinnostuksen vuoksi, mutta eihän sitä koskaan tiedä milloin pitäisi oikeasti tehdä jotain

        PreparedStatement-rajapinnan käyttö, eli parametrisoidut kyselyt mahdollistavat sen, että tietokanta-ajuri "kääntää" SQL-kyselyn jo valmiiksi muistiin, jolloin varsinkin jos sama kysely suoritetaan monta kertaa (esim. eri parametreilla), tuota kääntämistä ei tarvitse tehdä uudestaan ja suorituskyky teoriassa paranee. Mutta tämä on täysin riippuvainen käytetystä tietokanta-ajurista ja nopeushyöty ainakin pienissä ohjelmissa on käytännössä mitätön.

        Itse kuitenkin käytän lähestulkoon aina parametrisoituja kyselyitä jo ihan sen takia, että sitä on jotenkin siistimpi käyttää. Lisäksi se on periaatteessa hieman turvallisempaakin. Se estää väärän muotoisten parametrien käytön, joka on tärkeää varsinkin kysyttäessä käyttäjältä hakuehtoja. Jos käyttäjä esim. web-sivulla antaa hakuehdoksi jotain seuraavanlaista:

        kissa'; TRUNCATE ALL TABLES;

        ja tämä tungetaan mitään tarkistamatta select-kyselyn where-ehtoon, saattaa olla, että tietokannassa ei ole enää mitään dataa (tosin tuo truncate-lause ei taida toimia ihan noin). Parametrisoitujen kyselyiden käyttö estää tämän muuttamalla "kissa"-sanan jälkeisen hipsun oikeanlaiseksi (eli kahdeksi hipsuksi: '').

        Sinänsä käyttäjän syötteen tunkeminen suoraan SQL-lauseen osaksi ei ole koskaan järkevää, käytti parametrisointia tai ei. Lisätietoa tästä ns. SQL Injectionista antaa esim. Wikipedia: http://en.wikipedia.org/wiki/SQL_injection


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Muovikassikartelli

      Kauppaketjut ovat yhdessä sopineet muovikassin yksikköhinnaksi 59 senttiä. Milloin viranomaiset puuttuvat tähän kartell
      Talousrikokset
      32
      2098
    2. Aidon persun tunnistaa Marinin palvonnasta

      Oli kyse sitten Halla-ahosta tai Putinista. Ensimmäisenä aidolle persulle tulee mieleen Marin.
      Maailman menoa
      46
      1715
    3. Hallintooikeus..

      "Asemakaavapäätös pysyy voimassa.Poikkeamista ja rakentamista koskevat luvat hylättiin" kertoo Pyhäjärven Sanomat netti.
      Pyhäjärvi
      112
      1476
    4. Olen rakastunut

      varattuun joka ei eroa. Miten tunteista eroon? Tämä ei ole tavanomaista. On elämäni suuri rakkaus.
      Ikävä
      104
      1226
    5. Ootko A-nainen vielä vihainen?

      Siitä että en uskaltanut kohdata itseäni silloin kun olit kukassa? Olen tajunnut että tein tosi tökerösti sua kohtaan ja
      Ikävä
      104
      1024
    6. Jos se joskus oli molemminpuolista

      niin hyvin me molemmat onnistuttiin pitämään toinen epätietoisena.
      Ikävä
      76
      978
    7. Mikä on kaivattusi

      ammatti?
      Ikävä
      59
      855
    8. Teit yllättävän siirron

      Olet tähän saakka ollut tietyllä tapaa varovainen. Voi kai sanoa, että olemme kunnioittaneet toistemme rajoja. Tiedän,
      Ikävä
      34
      842
    9. Laita nyt se viesti

      Tiedän että haluat tavata. Kirjoitat, pyyhit, kirjoitat... Lähetä se viesti 😗
      Ikävä
      52
      789
    10. Kaipaatko nainen

      Semmoista tosi hankalaa ja arkaa miestä? Pitäisitkö hänet aina omanasi jos saisit hänet? Miten huomioisit hänen herkkyyd
      Ikävä
      101
      743
    Aihe