Hirdetés

Keresés

Új hozzászólás Aktív témák

  • td
    senior tag

    A getInt-nél mi a kivétel:

    Én így szoktam

    ResultSet ers = plm.executeQuery();
    while (ers.next()) {
    V_Elem lm = new V_Elem();
    lm.setId(ers.getLong("ID"));

    }

    Egy elemnél pedig simán

    if (rs.next()) {

    }

    Használd a SET SCHEMA=WHUSER utasítást. Vagy tedd az adataidat az APP sémába (Az a Derby alapértelmezett sémája).

    A Insert/Update queryknél használj parametrizált queryt. Átláthatóbb, véd az SQL injekcion ellen.

    pld.

    PreparedStatement ps = conn.prepareStatement("update akarmi set nev=? where id=?");

    ps.setString(1,"Az új név");
    ps.setLong(2, 12); // az adott ID

    ps.execute();

    Na megvan a gond. Idézőjelbe kell tenni a mezőneveket is, de oda már nem kell a user neve. Ez preparedStatement-re is igaz.

    Viszont újabb probléma lépett fel:

    PreparedStatement ps1 = conn.prepareStatement("INSERT INTO \"WHUSER\".\"Orders\" VALUES (?, ?, ?, ?, 0, 0, ?)");
    ps1.setString(1, articleID);
    ps1.setInt(2, quantity);
    ps1.setString(3, customerID);
    ps1.setLong(4, totalcost);
    ps1.setLong(5, trackID);

    if (ps1.execute()) {
    ...

    Megfogadván tanácsodat, alkalmaztam az előkészített lekérdezéseket (tényleg, miket csinálnak a háttérben a setterek?), de az if igaz ága valamiért nem fut le. Több ilyen lekérdezésnél is rendben van, de ennél az egynél valami nem tetszik neki. A furcsa viszont az, hogy az INSERT berakja a sort, tehát az execute()-nak nem kéne hamisat visszaadnia...
    Ez az if azért fontos, mert az INSERT sikerétől függően kell update-elni is. setLong()-gal BIGINT mezőket állítok be, a többi varchar és integer.

  • td
    senior tag

    A getInt-nél mi a kivétel:

    Én így szoktam

    ResultSet ers = plm.executeQuery();
    while (ers.next()) {
    V_Elem lm = new V_Elem();
    lm.setId(ers.getLong("ID"));

    }

    Egy elemnél pedig simán

    if (rs.next()) {

    }

    Használd a SET SCHEMA=WHUSER utasítást. Vagy tedd az adataidat az APP sémába (Az a Derby alapértelmezett sémája).

    A Insert/Update queryknél használj parametrizált queryt. Átláthatóbb, véd az SQL injekcion ellen.

    pld.

    PreparedStatement ps = conn.prepareStatement("update akarmi set nev=? where id=?");

    ps.setString(1,"Az új név");
    ps.setLong(2, 12); // az adott ID

    ps.execute();

    Az exception ez:

    org.apache.derby.client.am.SqlException: Invalid operation to read at current cursor position.

    Ez akkor van, amikor egy sima SELECT * FROM tábla jellegű lekérdezést csinálok. Az rs.getFetchSize() is nullát ad vissza. Viszont ha kiadok előtte egy rs.next()-et, akkor már nem nulla, és kivétel sem keletkezik. És rendesen le is lehet kérni a mezőértékeket, persze ezeket az első sorból adja.

    A SET SCHEMA nem működött sajnos. Az APP-be hogyan tudom betenni? A jobb klikk/Properties... lapon nem lehet átállítani a Schema sort, és amikor a táblát létrehoztam, akkor is csak a WHUSER volt kiválasztható (legalábbis az Owner listából).

    Ezt próbáltam amúgy:

    stmt.execute("SET SCHEMA=WHUSER");
    ResultSet rs = stmt.executeQuery("SELECT * FROM \"WHUSER\".\"Stock\" WHERE ArticleID='" + articleID + "'");

    És ugyanaz lett a kivétel, mint máskor is:
    org.apache.derby.client.am.SqlException: Column 'ARTICLEID' is either not in any table in the FROM list or appears within a join specification and is outside the scope of the join specification or appears in a HAVING clause and is not in the GROUP BY list. If this is a CREATE or ALTER TABLE statement then 'ARTICLEID' is not a column in the target table.

    Csináltam úgy is, hogy a WHUSER-t '-ok közé tettem, de semmi... (kivétel amúgy arra nem volt)

    A másik ötletet (parametrizált query) köszi, majd még kipróbálom azt is. Bár most nem az injection a legnagyobb gondom. ;)

Új hozzászólás Aktív témák