Keresés

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

  • td

    senior tag

    válasz btotyi #1299 üzenetére

    Jaja. :D

    Az autocommit az mikor történik meg? A kapcsolat lezárásakor? Vagy minden egyes lekérdezés után?

  • td

    senior tag

    válasz btotyi #1297 üzenetére

    Semmi különös okom nincs rá, csak a meglévő kódot minimálisan szerettem volna módosítani. Tranzakciót egyébként nem használok benne, szóval az insert eredménye az benne maradna a táblában (végül is ez csak amolyan demonstráció-progi, nem akarom túlvariálni, mert a lényeg nem ezen van, de még lehet, hogy beleteszem).

    Amúgy meg rájöttem (olvastam), hogy egy rs = psmt.executeQuery(), aztán if (rs.next()) is megteszi.

  • td

    senior tag

    válasz btotyi #1294 üzenetére

    Köszi, ilyen szinten ismerem a settereket. Csak arra lettem volna kíváncsi, hogy mivel véd az SQL injection ellen, de ha így végiggondolom, akkor meg is van a válasz szerintem.

    A másikat akkor hogy lehet jól működővé tenni? Merthogy false-ot ad vissza, ha az első eredmény egy update count vagy ha nincs eredménye az SQL-nek.

    if (rs.getUpdateCount()) ?

    vagy:

    if (rs.getMoreResults()) ?

  • td

    senior tag

    válasz btotyi #1290 üzenetére

    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

    válasz btotyi #1290 üzenetére

    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. ;)

  • td

    senior tag

    Sziasztok!

    NetBeans/Java adatbáziskezelésben otthon van valaki közületek? Az IDE-hez adott Derby-t használnám az egyszerűség kedvéért, de - alapvetően két okból kifolyólag - nem boldogulok vele.

    Egyszerű csatlakozás és lekérdezés/adatmódosítás lenne a programban, konkrétan redelések rögzítése (ill. egy limitellenőrzés is).

    A DBConnect kapcsolódik az adb-hez, a másik kettő metódus egy-egy webszolgáltatást valósít meg. Ami nem megy, és mindig kivételt dob, az a két következő fajta hívás:

    rs.first()
    rs.getInt() / ill. rs.getString()

    Valami nagyon nem stimmel nálam ezzel a ResultSet objektummal... :F

    A másik gondot az SQL-utasítások okozzák. Arra már rájöttem, hogy valami oknál fogva nem elég a táblanevet megadni, hanem minősíteni kell a user nevével, amire létrehoztam még az IDE-ben, és idézőjelek közé kell írni. Tehát pl. Stock helyett "WHUSER"."Stock". Ezt onnan szedtem, hogyha a Databases alatt nyomok a táblán egy View Data-t, akkor a NetBeans is ilyen formában adja meg.

    Viszont ettől még a SELECT * FROM ... jellegű lekérdezéseknél bonyolultabbak nem mennek, ott is reklamál, itt például:

    int rows2 = stmt.executeUpdate("UPDATE \"WHUSER\".\"Orders\" SET OrderedByCustomer=" + orderedByCustomer + " WHERE ArticleID='" + articleID + "'");

    ...ez a gondja: org.apache.derby.client.am.SqlException: 'OrderedByCustomer' is not a column in table or VTI 'WHUSER.Orders'.

    A táblanév az már jól van hivatkozva, de a mezőnév nem tetszik neki, és a táblához hasonló hivatkozással sem megy (WHUSER.Orders.OrderedByCustomer, persze idézőjelekkel).
    Nem tudom, milyen SQL-t használ ez a rendszer, de elég fura dolgai vannak.

    Hálás lennék, ha valaki tudna ebben segíteni!

    (MOD: ja, és még egy dolog. Azért jó lenne, ha valami rs.next() jellegű lépegetést is meg tudnék oldani, mert egy JSP-ben meg az árucikkeket szereném kiválaszthatóvá tenni egy legördülő listával.)

    Idemásolom a kódot, vannak kommentek is. ;)

    package com.sun.customerorderhandler;

    import javax.ejb.Stateless;
    import javax.jws.WebMethod;
    import javax.jws.WebParam;
    import javax.jws.WebService;

    import java.sql.*;
    import javax.xml.ws.WebServiceRef;


    @Stateless()
    @WebService()
    public class CustomerOrderHandler {

    @WebServiceRef(wsdlLocation = "http://localhost:8080/AmountPriceQueryService/AmountPriceQuery?wsdl")
    private com.sun.customerorderhandler.AmountPriceQueryService service;

    static long CUSTOMERLIMIT = 60000;

    public Connection DBConnect() throws java.sql.SQLException {

    return DriverManager.getConnection("jdbc:derby://localhost:1527/FurnitureWarehouse","whuser","whpass");

    }

    /**
    * Web service operation
    */
    @WebMethod
    public long checkCustomerLimit(@WebParam(name = "customerID") String customerID, @WebParam(name = "totalCost") long totalCost) {
    // TODO implement operation

    Connection conn;

    try {

    conn = DBConnect();

    Statement stmt = conn.createStatement();

    ResultSet rs = stmt.executeQuery("SELECT SUM(TotalCost) FROM Orders WHERE CustomerID=" + customerID + " AND Paid=0");

    rs.first();

    long owsTotal = rs.getInt(1); // egyetlen oszlop van

    conn.close();

    return (owsTotal + totalCost) - CUSTOMERLIMIT; // ha a limit fole megy, pozitiv lesz

    }
    catch (Exception e) {

    return 9999999; // mintha a limit fole ment volna

    }

    }

    /**
    * Web service operation
    */
    @WebMethod
    public long placeOrder(@WebParam(name = "articleID") String articleID, @WebParam(name = "quantity") int quantity, @WebParam(name = "customerID") String customerID) {
    // TODO implement operation

    Connection conn;

    try {

    conn = DBConnect();

    Statement stmt = conn.createStatement();

    ResultSet rs = stmt.executeQuery("SELECT * FROM Stock WHERE ArticleID=" + articleID);

    rs.first();

    int price = rs.getInt("Price");
    int orderedByCustomer = rs.getInt("OrderedByCustomer");

    long totalCost = quantity * price; // a rendeles teljes ara

    orderedByCustomer++; // vevok altal rendelt, kiszallitatlan mennyiseg

    long trackID = Math.round(Math.random()*1000000000); // 10.000.000

    int rows1 = stmt.executeUpdate("INSERT INTO Orders VALUES ('" + articleID + "', " + quantity + ", '" + customerID + "', " + totalCost + ", 0, 0, " + trackID + ")");

    int rows2 = stmt.executeUpdate("UPDATE Orders SET OrderedByCustomer=" + orderedByCustomer + " WHERE ArticleID='" + articleID + "')");

    conn.close();

    if (rows1 == 0) return 0; // ha nem tudta rogziteni a rendelest

    return trackID; // egyebkent a nyomonkovetesi azonosito visszaadasa

    }

    catch (Exception e) {

    return 0; // ha sikertelen volt a muvelet

    }

    }

    }

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

Hirdetés