Hirdetés

2024. május 4., szombat

Gyorskeresés

Útvonal

Fórumok  »  Szoftverfejlesztés  »  Java programozás (kiemelt téma)

Hozzászólások

(#1251) loszerafin válasza loszerafin (#1250) üzenetére


loszerafin
senior tag

Help->Check for Updates->Install JIndent

(#1252) pawee


pawee
tag

sziasztok
nekem kellene írnom egy kötprogit java-ban, persze nem szeretnék senkit megkérni erre, csak segítséget.
ez a feladat:
A programnak egy WEB-szerverhez kell csatlakoznia, és a felhasználó által kért oldalt kell lementenie egy file-ba. Az ismertebb hibakódok esetén magyarul írjuk ki a hibát. A program támogassa a GET és POST típusú paraméterek átadását, Cookie-k küldését/fogadását is.(+)

a kérdés pedig az lenne, hogy a hibakódokat hogy kapom meg a szervertől?
milyen az a get post típusú param. átadás?

Minden input az ördögtől érkezik!

(#1253) Lortech válasza pawee (#1252) üzenetére


Lortech
addikt

GET és POST a HTTP GET ÉS HTTP POST metódusok. Annyi a dolgod, hogy a kapcsolat felállításnál / lekérésnél beállítod valamelyiket. A lényegi különbség, hogy GET esetén maga az URI tartalmazza a paramétert ( pl index.php?x=10), POST esetben pedig a lekérés törzsébe kell tenni. Ha a HttpURLConnection osztállyal csinálod, akkor ennek a setRequestMethod metódusával kell beállítanod.
Cookie kezelés annyi, hogy a lekérés fejlécében (header) kell elhelyezni a cookiet ("Cookie"), eredménynél pedig kiszedni a headerből ("Set-Cookie").
Hibakódot úgy kapod meg, hogy a lekérés küldése után a HttpURLConnection példányod getResponseCode() függvényét meghívod és megvizsgálod, hogy milyen HTTP válaszkódot ad vissza. A HttpURLConnection osztály tartalmazza az összes lehetséges válaszkódot statikus mezők formájában, pl: HttpURLConnection.HTTP_OK (200-as kód) azt jelenti, hogy teljesíthető volt a lekérés.

Thank you to god for making me an atheist

(#1254) szilu84


szilu84
tag

sziasztok,
ha létrehozok egy képet az alábbi módon:
BufferedImage bi=null;
bi = new BufferedImage(640,480,BufferedImage.TYPE_3BYTE_BGR);
akkor ez hogy tudom lementni egy BMP fájlba?
üdv

(#1255) Lortech válasza szilu84 (#1254) üzenetére


Lortech
addikt

Az ImageIO.write metódussal.

Thank you to god for making me an atheist

(#1256) Sanyix


Sanyix
őstag

Hi!

Egy olyan dolgot kellene csinálnom, hogy egy adatbázis táblát jelenítek meg jsf-el. Lekérdezési eljárások minden megvan, csak meg kéne jeleníteni. Tud valaki segíteni hogy oldhatom ezt meg?

szövegértelmezés, az ÉRTELMEZÉS a fontos, mert az olvasás mindenkinek megy, de az ÉRTELMEZÉS már komoly probléma a magyaroknál. Gondold ezt át mielőtt marhaságot írsz...

(#1257) shev7 válasza Sanyix (#1256) üzenetére


shev7
veterán

vagy keresel egy neked tetszo kesz komponenst, vagy kezzel megcsinalod a html outputot.

''Gee, Brain, what do you want to do tonight?'' ''The same thing we do every night, Pinky: Try to take over the world!''

(#1258) Sanyix válasza shev7 (#1257) üzenetére


Sanyix
őstag

Milyen kész komponens? Ami van arról szinte semmi leírás nincs, és semmilyen adatot nem is fogad el.

szövegértelmezés, az ÉRTELMEZÉS a fontos, mert az olvasás mindenkinek megy, de az ÉRTELMEZÉS már komoly probléma a magyaroknál. Gondold ezt át mielőtt marhaságot írsz...

(#1259) shev7 válasza Sanyix (#1258) üzenetére


shev7
veterán

"ami van"? melyikre gondolsz?

''Gee, Brain, what do you want to do tonight?'' ''The same thing we do every night, Pinky: Try to take over the world!''

(#1260) Sanyix válasza shev7 (#1259) üzenetére


Sanyix
őstag

van ilyen f:selectitems, meg h:datatable. pl f.selecteditems-hez láttam egy példaprograomot, egy list<selectitem> bemenete, de persze kipróbálva nem működik, mert mindenre azt írja hogy arraylist (még arra is ami nem), és selectitemet vár el (aminek semmi érdelme, mert egyenként máshogy is be tudom rakni a lista elemeit...

szövegértelmezés, az ÉRTELMEZÉS a fontos, mert az olvasás mindenkinek megy, de az ÉRTELMEZÉS már komoly probléma a magyaroknál. Gondold ezt át mielőtt marhaságot írsz...

(#1261) shev7 válasza Sanyix (#1260) üzenetére


shev7
veterán

ha tablazatot akarsz megjeleniteni akkor h:datatable a baratod

Ezt probaltad? Most talaltam. A beannek legyen egy getStudents() metodusa ami arraylisttel ter vissza, az arrazlistben levo objektumoknak meg legyen getName() metodusa, akkor mukodni fog.

<f:view>
<h:form>
<:dataTable border="1" value="#{StudentBean.students}" var="line">
<h:column>
<h:outputText value="#{line.name}" />
</h:column>
</h:dataTable>
</h:form>
</f:view>

MOD: de egy csomo jobban konnyebben hasznalhato library van, pld a tomahawk.

[ Szerkesztve ]

''Gee, Brain, what do you want to do tonight?'' ''The same thing we do every night, Pinky: Try to take over the world!''

(#1262) Sanyix válasza shev7 (#1261) üzenetére


Sanyix
őstag

Naggyonzseer :D

h datatablet kipróbáltam, bár picit átírtam, de műxik jól. Tomahawkot ma nemtudom, mert itt a munkahelyen paranoiás védelem van, pdf-en kívül semmit sem lehet letölteni, csak otthonról tudom emailben egy kis trükkel becsempészni. De mindegy, most ez is tökéletes :)

szövegértelmezés, az ÉRTELMEZÉS a fontos, mert az olvasás mindenkinek megy, de az ÉRTELMEZÉS már komoly probléma a magyaroknál. Gondold ezt át mielőtt marhaságot írsz...

(#1263) Sanyix válasza Sanyix (#1262) üzenetére


Sanyix
őstag

Hopp viszont érdekes dolgot csinál. Szóval ennek az alapja egy hibernates adatbáziskezelő programocska, ami már rég kész van, csak most így jsf-es felületet csinálok neki. Szóval az van, hogy a Mrbean nevű beanben mindenféle eljárás, elég egyszerűek, csak már meglévő adatbáziskezelő osztályból veszi ki az adatokat, indít eljárást, szóval csak egy közvetítő. Az már kész van egy ideje, hogy a jsf-es felületen lehet felvinni új rekordot, vagy frissíteni meglévőt.
Most az van, hogyha a valami műveletet hajtottam végre webes felületről, ha nyomok egy frissítés a böngészőben, újra végrehajtja az előző művelet. Most 3x rányomtam a frissítésre, és 3x rekordot hozott létre ugyanazokkal az adatokkal. Hogy lehetne azt elérni hogy ne lehessen frissíteni, vagya jsf mindig 0-ról induljon?

szövegértelmezés, az ÉRTELMEZÉS a fontos, mert az olvasás mindenkinek megy, de az ÉRTELMEZÉS már komoly probléma a magyaroknál. Gondold ezt át mielőtt marhaságot írsz...

(#1264) shev7 válasza Sanyix (#1263) üzenetére


shev7
veterán

amikor frissitesz bongeszoben, a bongeszo a legutolso kerest kuldi el ujra a szervernek. Ha az a keres egy uj rekord felvetele volt akkor ujra egy uj rekord felvetelet fogja kerni

''Gee, Brain, what do you want to do tonight?'' ''The same thing we do every night, Pinky: Try to take over the world!''

(#1265) Sanyix válasza shev7 (#1264) üzenetére


Sanyix
őstag

Hát ezaz! De az lenne az egyik cél, hogy hülyebiztos legyen. Így meg nem igazán az...

szövegértelmezés, az ÉRTELMEZÉS a fontos, mert az olvasás mindenkinek megy, de az ÉRTELMEZÉS már komoly probléma a magyaroknál. Gondold ezt át mielőtt marhaságot írsz...

(#1266) Sanyix


Sanyix
őstag

Ja és még egy kis probléma van. Ha létrehozok egy új rekordot, a leutolsó módosítás nem jelenik meg a datatable-ban, csak akkor ha nyomok egy újratöltést, viszont ha kilistázom egy sima outputtextel a listát amiből a táblát is generálja, ott megjelenik az új objektum, de a jsp kódban alatt lévő datatableban meg nem. Ezt nemnagyon értem...

szövegértelmezés, az ÉRTELMEZÉS a fontos, mert az olvasás mindenkinek megy, de az ÉRTELMEZÉS már komoly probléma a magyaroknál. Gondold ezt át mielőtt marhaságot írsz...

(#1267) pawee


pawee
tag

na eddig eljutottam nagyjábó megyeget a dolog, már scak annyit szertnék kérni segítségül hogy a HTTP kódokat hogytom kierőszakolni, és a fájlokat lementeni a szerverről?

public class ddd {

public static void main(String[] args) {
// TODO Auto-generated method stub

try {

String data = URLEncoder.encode("key1", "UTF-8") + "=" + URLEncoder.encode("value1", "UTF-8");
data += "&" + URLEncoder.encode("key2", "UTF-8") + "=" + URLEncoder.encode("value2", "UTF-8");


String hostname = "startlap.hu";
int port = 80;
InetAddress addr = InetAddress.getByName(hostname);
Socket socket = new Socket(addr, port);

String path = "/";
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8"));
wr.write("POST "+path+" HTTP/1.0\r\n");
wr.write("Content-Length: "+data.length()+"\r\n");
wr.write("Content-Type: application/x-www-form-urlencoded\r\n");
wr.write("\r\n");


wr.write(data);
wr.flush();
// System.out.println(socket.toString());

BufferedReader rd = new BufferedReader(new InputStreamReader(socket.getInputStream()));
/**String line;

while ((line = rd.readLine()) != null) {

}**/
wr.close();
rd.close();

} catch (Exception e) {
}

Minden input az ördögtől érkezik!

(#1268) Lortech válasza pawee (#1267) üzenetére


Lortech
addikt

Ez így nagyon messze van.. Ha socket osztállyal akarod megoldani, akkor a HTTP protokoll szükséges részeit neked kell implementálnod. Nem véletlenül mondtam a HttpURLConnection tippet.
Itt egy példa fájl letöltés : [link]

Itt a HttpURLConnection osztály leírása. Ott a lényeg a getResponseMessage() és a getResponseCode(), ami a HTTP válaszkódot tartalmazza.

Thank you to god for making me an atheist

(#1269) Sanyix


Sanyix
őstag

Most ott tartok, hogy az adattáblába az adatok mell kellene egy gomb, amit ha megnyom a júzer, a táblázat ugyanabban a sorában lévő egyik adatot beírja egy h:inputtext-be. Ez javascriptel úgylátom megoldható lenne, ha a datatableban a gombokat úgy generálná, hogy annak az action értékében látszódna az a bizonyos adat. Szóval az kéne hogy van egy lista, id-kkel, és ha rákattintok a lista valamelyik sorában lévő gombra, a mellette lévő id-t berakja az inputtextbe, azért hogy ne a listán kelljen keresgélni az id-t és bemásolni, hanem a sorban való kattintással bekerüljön. Erre tud valaki megoldást?

szövegértelmezés, az ÉRTELMEZÉS a fontos, mert az olvasás mindenkinek megy, de az ÉRTELMEZÉS már komoly probléma a magyaroknál. Gondold ezt át mielőtt marhaságot írsz...

(#1270) shev7 válasza Sanyix (#1269) üzenetére


shev7
veterán

hat minden sorba raksz egy gombot, gondolom nincs vele problema... minden sorban tudod az id-t (mivel ki is iratod ha jol ertem). Nem jsf-eztem egy ideje, de nem latom akadalyat...

''Gee, Brain, what do you want to do tonight?'' ''The same thing we do every night, Pinky: Try to take over the world!''

(#1271) Sanyix válasza shev7 (#1270) üzenetére


Sanyix
őstag

Ja mostmár megoldottam, jsf-be ennyi megy.
<h:commandButton value="Gomb" onclick="document.getElementById('azid_').value= #{adatok.id}" />

Viszont jsf-ben nem látszódnak normálisan az id-k erre van egy j4j nevű csomag aminek van egy proxyid nevű izéje... csakhát megint le kéne tölteni, és itt azt nem lehet.

szövegértelmezés, az ÉRTELMEZÉS a fontos, mert az olvasás mindenkinek megy, de az ÉRTELMEZÉS már komoly probléma a magyaroknál. Gondold ezt át mielőtt marhaságot írsz...

(#1273) Bobbysolo


Bobbysolo
tag

Sziasztok!
Kellene nekem egy ingyenes, könnyen kezelhető program, ami Java kódból tud osztálydiagramot csinálni. (Eclipse plugin is lehet akár.)
Mi a legjobb erre a célra?
Köszönöm előre is!
Bobbysolo

(#1274) SamIam


SamIam
csendes tag

Hali
Megtudná valaki mondani, hogy ez miért csak számokkal működik?

ResultSet rs = st.executeQuery("SELECT * FROM MUNKAK WHERE "+lek.getMezo()+" LIKE "+lek.getErtek()+"");

String lenne mind a kettő (Mezo, Ertek), de csak akkor keresi ki az AB-ból, ha ott számok vannak rögzítve.

Köszi, ha van segítség.

(#1275) Sanyix válasza SamIam (#1274) üzenetére


Sanyix
őstag

Mert ezt így sztem nem lehet csinálni. Ismeretlenek helyére ?-t kell írni, majd st.setvalamitípus(abehelyettesítendőérték,hanyadikkérdőjel), de asszem el is lehet neveznia változókat kérdőjel meg sorszámozás helyett, és preparedstatementet kéne használni. Valahogy így van. De adatbázisozásra ajánlom a hibernate.org pakkot, elég jó dolog, csak picit szokatlan elsőre. Abban ennyi egy lekérdezés:

Session session = getSessionFactory().getCurrentSession();
try {
session.beginTransaction();
Query query = session.createQuery("from Email where id=:qid");
//logger.trace(query);
query.setInteger("qid", id);
result = query.list();
session.getTransaction().commit();
logger.info("Sikeres lekérdezés!");
} catch (HibernateException e) {
e.printStackTrace();
logger.error("Hiba lekérdezésnél!");
}

És ennyi egy új rekord létehozása, és persze törődik a hibákkal is, így nemnagyon lehet belerondítani az adatbázisba.

try {
tx= sess.beginTransaction();
Adatok adt = new Adatok(veznev,kernev, sqldate);
sess.save(adt);
tx.commit();
} catch (HibernateException e) {
logger.error("Hiba az adatbázisműveletnél!");
tx.rollback();
return false;
}

Ja és a megírt kód működik akármilyen adatbázison, amihez van driver (én 40 félét találtam, tehát van nemkevés :D ).

[ Szerkesztve ]

szövegértelmezés, az ÉRTELMEZÉS a fontos, mert az olvasás mindenkinek megy, de az ÉRTELMEZÉS már komoly probléma a magyaroknál. Gondold ezt át mielőtt marhaságot írsz...

(#1276) SamIam válasza Sanyix (#1275) üzenetére


SamIam
csendes tag

Nah, ezt értem, de számokkal működik. Ha karakterek vannak akkor nem. A rekord létrehozás, módosítás, törlés viszont bármilyen típussal jó.
Konzolra iratva a változók az elvárt értékeket hozzák. SQL-ben lekérdezve (behelyettesítve), persze minden OK.
??

(#1277) ZéZé@PH válasza SamIam (#1276) üzenetére


ZéZé@PH
aktív tag

Mert az adatbázis felé a programozónak kell gondoskodnia a típuskonverzióról, legalábbis általában. :)
Nem tudom milyen adatbázis szervert használsz, de Oracle-nél azonnal hibát dob ha számot vár de varchar-t kap.
Egyébként valóban paraméteres lekérdezéseket érdemes használni,már csak biztonsági okból is.

''Elménk nem megtöltésre váró edény, hanem lángra lobbantandó tűz!'' Plutarkosz

(#1278) SamIam válasza ZéZé@PH (#1277) üzenetére


SamIam
csendes tag

MySql szerver, lokálban. A SELECT-ben "" közé tett változó karaktereket (string) jelent, asszem. Számokkal működik..!? AB-ben varchar a tipus, java visszatérés tipusa String.
Biztonság nem fontos: 1 gépen megy csak, 1 user-rel (én). (hülyeség ellen nincs orvosság).
???

(#1279) Sanyix


Sanyix
őstag

Van egy táblázatom, jsf-ben genrált, a táblázat soraiban lévő gombokra kattintva kattinva javascript betölti a generált beviteli mezőkbe az adatokat. De, dátumnál ilyen yyyy-MM-dd formátumot használ, nekem meg a - helyett . kéne. Át is lehet állítani, kimenetnél, de csak a kimenetre. De ilyen másolgatásnál megint a kötőjelest másolja Mit lehet ezzel csinálni?

szövegértelmezés, az ÉRTELMEZÉS a fontos, mert az olvasás mindenkinek megy, de az ÉRTELMEZÉS már komoly probléma a magyaroknál. Gondold ezt át mielőtt marhaságot írsz...

(#1280) shev7 válasza SamIam (#1278) üzenetére


shev7
veterán

akkor mar csak az van hatra, hogy te is " koze tedd :D

''Gee, Brain, what do you want to do tonight?'' ''The same thing we do every night, Pinky: Try to take over the world!''

(#1281) SamIam válasza shev7 (#1280) üzenetére


SamIam
csendes tag

De " között vannnak. Vagy így nem megfelelő? Akkor számokkal miért megy a lekérdezés?
Lehet, hogy nagyon béna vagyok, de nem így lenne a legegyszerűbb? Az objektumok értéke konzolra kiiratva mindig az elvárt.
???

(#1282) Sanyix válasza SamIam (#1281) üzenetére


Sanyix
őstag

Ezt nem értem. Szóval úgy kell, hogy "" között legyen az egész sql parancs, és ' ' között a stringek, de a számok nem.

szövegértelmezés, az ÉRTELMEZÉS a fontos, mert az olvasás mindenkinek megy, de az ÉRTELMEZÉS már komoly probléma a magyaroknál. Gondold ezt át mielőtt marhaságot írsz...

(#1283) ZéZé@PH válasza SamIam (#1281) üzenetére


ZéZé@PH
aktív tag

Hmm, szerintem az sql parancs jó bár a +"" a végén tök felesleges.
Szerintem a hiba inkább a getMezo() és a getErtek() fügvénnynél van.

[ Szerkesztve ]

''Elménk nem megtöltésre váró edény, hanem lángra lobbantandó tűz!'' Plutarkosz

(#1284) shev7 válasza SamIam (#1281) üzenetére


shev7
veterán

het ha a lek.getMezo() idezojelek kozott adja vissza a stringet akkor idezojelek kozott van.

de tenyleg sok szivastol mentened meg magad ha prepared statementeket hasznalnal.

Ezt irtad:

"SELECT * FROM MUNKAK WHERE "+lek.getMezo()+" LIKE "+lek.getErtek()+""

ez kene helyette:

"SELECT * FROM MUNKAK WHERE \""+lek.getMezo()+"\" LIKE \""+lek.getErtek()+"\""

''Gee, Brain, what do you want to do tonight?'' ''The same thing we do every night, Pinky: Try to take over the world!''

(#1285) Sanyix válasza SamIam (#1281) üzenetére


Sanyix
őstag

és az nem lenne egyszerűbb, hogy prepared statement, és:

PreparedStatement stm= conn.prepareStatement ("SELECT * FROM MUNKAK WHERE ? LIKE ?";
stm.setString(1,getMezo());
stm.setInt(2,getErtek()); //persze nemtudom itt milyen típusnak kell lenni, ezt te tudod
ResultSet rs =stm.commit();

[ Szerkesztve ]

szövegértelmezés, az ÉRTELMEZÉS a fontos, mert az olvasás mindenkinek megy, de az ÉRTELMEZÉS már komoly probléma a magyaroknál. Gondold ezt át mielőtt marhaságot írsz...

(#1286) td


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

}

}

}

[ Szerkesztve ]

''Pre-visualization hardware by AMD Opteron processors.''

(#1287) SamIam


SamIam
csendes tag

Köszi mindenkinek. Végül ez lett a jó megoldás (ha érdekes valakinek):
ResultSet rs = st.executeQuery("SELECT * FROM MUNKAK WHERE "+lek.getMezo()+" LIKE '%"+lek.getErtek()+"%'");
affene gondolta, hogy mysql ' " " ' és %-t akar .
Azért a prepared-et is kipróbálom majd.
Még egy: cégnek mi volna ingyenes AB?

[ Szerkesztve ]

(#1288) ZéZé@PH válasza SamIam (#1287) üzenetére


ZéZé@PH
aktív tag

% jel tetszőleges karaktersorozatot jelöl, ha azt akarod hogy résszóra is működjön a keresés akkor elengedhetetlen. Még egy tipp: LOWER sql függvény csupa kis betűs szóvá alakít. Ha csupa kis betűst hasonlítasz össze csupa kis betűssel, akkor azt is megoldottad, hogy ne legyen a keresésed case sensitive.

Én a mysql-en kívül nem tudok másik ingyenes sql-es adatbázist. Használnak még ugye Oracle-t meg a Microsoft sql-es adatbázisát, de ezek nem ingyenesek.

''Elménk nem megtöltésre váró edény, hanem lángra lobbantandó tűz!'' Plutarkosz

(#1289) szilu84 válasza SamIam (#1287) üzenetére


szilu84
tag

PostgreSql

(#1290) btotyi válasza td (#1286) üzenetére


btotyi
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();

(#1291) btotyi válasza SamIam (#1287) üzenetére


btotyi
tag

Derby(JavaDB)/Cloudscape, FireBird, Oracle Express, vagy DB2 ExpressC vagy SAPDB(MAxDB) és természetesen a PostgreSQL

[ Szerkesztve ]

(#1292) td válasza btotyi (#1290) üzenetére


td
senior tag

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

[ Szerkesztve ]

''Pre-visualization hardware by AMD Opteron processors.''

(#1293) td válasza btotyi (#1290) üzenetére


td
senior tag

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.

''Pre-visualization hardware by AMD Opteron processors.''

(#1294) btotyi válasza td (#1293) üzenetére


btotyi
tag

A ps1.execute csak akkor add vissza true-t ha a visszatérési objektum resultset. Mivel az insert nem azt ad vissza igy persze, hogy false.

Setterek: A preparedstatement leküldi az SQL-t a szervernek előkészítésre. Az lefordítja, felkészül. A setterek beállítják a paramétereket, az execute pedig végrehajtja. A korábban említett előnyök mellett nagy hasznát veheted kötegelt adattöltésnél. Ilyenkor query egyszer előkészít, sokszor végrehajt, nagyon gyorsan.

Erre szolgál a tranzakció.

try {
// Disable auto commit
connection.setAutoCommit(false);

// Do SQL updates...

// Commit updates
connection.commit();
} catch (SQLException e) {
// Rollback update
connection.rollback();
}

[ Szerkesztve ]

(#1295) btotyi válasza td (#1293) üzenetére


btotyi
tag

Javítva:

A ps1.execute csak akkor add vissza true-t ha az ELSŐ visszatérési objektum resultset. Mivel az insert nem azt ad vissza igy persze, hogy false.

(#1296) td válasza btotyi (#1294) üzenetére


td
senior tag

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()) ?

[ Szerkesztve ]

''Pre-visualization hardware by AMD Opteron processors.''

(#1297) btotyi válasza td (#1296) üzenetére


btotyi
tag

Nem igazán értem mért akarod a visszatérési értéket kezelni. Ha az insert sikeresen lefut akkor úgyis a következő sorra (update) lép. Ha nem (pl kulcs megsértés vagy null érték not null-os mezőbe) kivétel keletkezik akkor pedig rollback így az insertben felvitt rekordo(ka)t eldobja.

Ha szüksége van az insert utáni értékre pld. a kapott id-t tovább kell vinni, akkor vagy tárolt eljárás vagy generator/sequence használata javaslott, természetesen egy tranzakció belül.

(#1298) td válasza btotyi (#1297) üzenetére


td
senior tag

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.

''Pre-visualization hardware by AMD Opteron processors.''

(#1299) btotyi válasza td (#1298) üzenetére


btotyi
tag

1290-es közepe :)

Tranzakciót pedig mindig használsz csak automatikusan hívja a java. (autocommit=true)

[ Szerkesztve ]

(#1300) td válasza btotyi (#1299) üzenetére


td
senior tag

Jaja. :D

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

''Pre-visualization hardware by AMD Opteron processors.''

Útvonal

Fórumok  »  Szoftverfejlesztés  »  Java programozás (kiemelt téma)
Copyright © 2000-2024 PROHARDVER Informatikai Kft.