/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Java og SQL spørgsmål
Fra : Mikael Nørrelund And~


Dato : 20-09-02 18:21

Jeg er ved at udvikle et lille program til en elektriker, men er gået
lidt i stå.

Meningen er, at kunden skal kunne søge på et ord og så kunne aflæse
varenr samt beskrivelse*. Søger man på et ord som fx afbryder, så er
der flere varenumre med dette ord i beskrivelsen.
Jeg modtager fint et resultset, som jeg lægger ned i en vektor.
I denne vektor kan jeg bare kun se et element, selvom der burde
ligge flere. Dette ene element er den første vare i tabellen med
angivne ord i beskrivelsen.

Hvad har jeg mon glemt eller gjort galt?

Her er min SQL:
SELECT * FROM Vare WHERE Beskrivelse LIKE '%afbryder%'

Javakoden vil jeg ikke skrive, da der er ret meget ;)
Men det virker fint, når jeg henter alle poster i en tabel.

Er der nogen der kan hjælpe mig, med at guide mig hen til problemet?

Jeg håber på svar ;)

Mvh.
Mikael Nørrelund

*
Jeg har en en Access database med et par enkelte tabeller, en af
tabellerne hedder Vare. Den indeholder kolonnerne varenr og
beskrivelse.


 
 
Morten (20-09-2002)
Kommentar
Fra : Morten


Dato : 20-09-02 19:32

Mikael Nørrelund Andersen (slet NLUTD) wrote:
> Jeg er ved at udvikle et lille program til en elektriker, men er gået
> lidt i stå.
>
> Meningen er, at kunden skal kunne søge på et ord og så kunne aflæse
> varenr samt beskrivelse*. Søger man på et ord som fx afbryder, så er
> der flere varenumre med dette ord i beskrivelsen.
> Jeg modtager fint et resultset, som jeg lægger ned i en vektor.
> I denne vektor kan jeg bare kun se et element, selvom der burde
> ligge flere. Dette ene element er den første vare i tabellen med
> angivne ord i beskrivelsen.
>
> Hvad har jeg mon glemt eller gjort galt?
>
> Her er min SQL:
> SELECT * FROM Vare WHERE Beskrivelse LIKE '%afbryder%'
>
> Javakoden vil jeg ikke skrive, da der er ret meget ;)
> Men det virker fint, når jeg henter alle poster i en tabel.

Nu er det jo Java kode de flesteh her i gruppen er kyndige i. Mon
ikke du kan lave en lille test case der reproducerer det essentielle
i din kode?

Hvilken metode bruger du til at indsætte i din vektor?

Laver du en
if(resultSet.next())
i stedet for en
while(resultSet.next())?

Bruger du set/setElementAt/add(int, Object) metoderne i steder for
add(Object)?

Det er jo lidt svært for os at gætte..

Morten


Mikael Nørrelund And~ (21-09-2002)
Kommentar
Fra : Mikael Nørrelund And~


Dato : 21-09-02 11:20

Morten <morten@kikobu.com> skrev:
> Mon ikke du kan lave en lille test case
>der reproducerer det essentielle i din kode?

Jo, det prøver jeg lige.

>Hvilken metode bruger du til at
>indsætte i din vektor?
>
>Laver du en
> if(resultSet.next())
>i stedet for en
> while(resultSet.next())?

Ja, jeg bruger en if-sætning.
Jeg tror bare ikke problemet ligger der,
da jeg sagtens kan hente alle data fra èn
tabel - bare ikke udvalgte posts i tabellen.
Jeg er dog sikker på SQL'en er rigtig.
<http://www.devdaily.com/java/edu/pj/jdbc/jdbc0003/>

SQL:
SELECT * FROM Vare WHERE Beskrivelse LIKE ´%afbryder%´

>Bruger du set/setElementAt/add(int,
>Object) metoderne i steder for
>add(Object)?

Jeg bruger addElement(Object).

Hele opbygningen af mit program er som følger:
GUI -> Handler -> Domæne klasse -> Domæne DB Facade
-> PersistentFacade -> DB

Ja, jeg programmerer OO og har en smule systemudvikling
som baggrund for programmet.

PersistentFacaden sørger for forbindelse til DB og har
nogle generelle CRUD metoder i sig.
Domæne DB Facade, sørger for kommunikation mellem domæne
klasserne og PersistentFacaden, således man nemt kan
udskifte nogle af modulerne.
Domæneklassen indeholder specifikke metoder, men sender
bare objekter afsted, som skilles ad i Domæne DB Facaden.
Handleren er bindeled mellem GUI og Domæneklasserne,
således GUI'en ikke kender til dem og omvendt.

Jeg håber dette måske hjælper, jeg vil nu prøve at
udskrive resultsettet meget tidligere i forløbet og
derved prøve at spore mig frem til fejlen.

Mvh.
Mikael

PS.
Jo, jeg ved godt opbygningen af systemet er lidt overkill
til de få opgaver der skal laves.

Nenad (22-09-2002)
Kommentar
Fra : Nenad


Dato : 22-09-02 01:26

> >Laver du en
> > if(resultSet.next())
> >i stedet for en
> > while(resultSet.next())?
>
> Ja, jeg bruger en if-sætning.
> Jeg tror bare ikke problemet ligger der,

Prøv at bruge en while løkke i stedet for, det kunne måske hjælpe.

MVH Nenad.



Mikael Nørrelund And~ (22-09-2002)
Kommentar
Fra : Mikael Nørrelund And~


Dato : 22-09-02 18:33

Nenad <nebl@mail.dk> skrev:
> Prøv at bruge en while løkke i stedet for,
> det kunne måske hjælpe.

Tak for svar, men det hjalp desværre ikke.

Således kommunikere jeg med min DB:

------------------------------------------------------

public Vector persistentSelect(
String felter, String tabel, String where)
{
openConnection();
statement = null;
rs = null;
resultVector = new Vector();
query = "";

try {
query = "SELECT " + felter + " FROM " + tabel +
" WHERE " + where;

statement = connection.createStatement();
rs = statement.executeQuery(query);
ResultSetMetaData rsmd = rs.getMetaData();

if(rs.next()){
resultVector = lavVector(rs, rsmd);
//Her oprettes vektoren, se længere nede...
}
else
resultVector.addElement("Søgning tom.");

JOptionPane.showMessageDialog(null, "" +
resultVector );
statement.close();
shutDown();
}
catch( SQLException dub ) {
dub.printStackTrace();
}

return resultVector;
}//Slut persistentSelect

------------------------------------------------------

private Vector lavVector(ResultSet rs,
ResultSetMetaData rsmd) throws SQLException{

Vector rows = new Vector();

for ( int i = 1; i <= rsmd.getColumnCount(); ++i )
switch( rsmd.getColumnType( i ) ) {
case Types.VARCHAR:
rows.addElement( rs.getString( i ) );
break;
case Types.LONGVARCHAR:
rows.addElement( rs.getString( i ) );
break;
case Types.INTEGER:
rows.addElement( new Integer( rs.getInt( i ) ) );

break;
default:
System.out.println( "Type var: " +
rsmd.getColumnTypeName( i ) );
}//switch slut

return rows;
}
---------------------------------------------------------------

Er der mon noget galt i disse metoder, som er prøvet lavet
generelle, så man kan bruge dem til mange forskellige
forespørgsler?

Mvh.
Mikael


Jonathan Stein (22-09-2002)
Kommentar
Fra : Jonathan Stein


Dato : 22-09-02 20:22

Mikael Nørrelund Andersen wrote:

> Således kommunikere jeg med min DB:
> ------------------------------------------------------
> public Vector persistentSelect(
> ...

Ja, den returnerer en Vector med den første række fra databasen.

Hvad vil du opnå. En Vector med alle felter fra alle rækker? Eller en
Vector af Vectorer, der hver indeholder en række? Eller?

M.v.h.

Jonathan

--
Nyt alternativ til egen server: JSP Enterprise hotel med adgang til
Enterprise Java Beans, egen Java Virtual Machine og egen IP-adresse
(giver mulighed for eget SSL-certifikat).
http://www.jsp-hotel.dk/



Mikael Nørrelund And~ (22-09-2002)
Kommentar
Fra : Mikael Nørrelund And~


Dato : 22-09-02 20:50

Jonathan Stein <jstein@image.dk> skrev:
>> public Vector persistentSelect(
>> ...
>
> Ja, den returnerer en Vector med
>den første række fra databasen.

Hmm, måske har jeg fået byttet rundt på noget.

Hvad med denne, den bør returnere en vektor med
alle elementer fra en tabel.

---
public Vector persistentSelectTabel(String felter, String tabel,
String where){
openConnection();
statement = null;
rs = null;
resultVector = new Vector();
query = "";

try {
query = "SELECT " + felter + " FROM " + tabel + " WHERE " +
where;

statement = connection.createStatement();
rs = statement.executeQuery(query);
ResultSetMetaData rsmd = rs.getMetaData();

if(rs.next()){
resultVector = lavVectorTabel(rs, rsmd);
}
else
resultVector.addElement("Søgning tom.");

statement.close();
shutDown();
}
catch( SQLException dub ) {
dub.printStackTrace();
}

return resultVector;
}
---

> Hvad vil du opnå. En Vector med alle felter
> fra alle rækker? Eller en Vector af Vectorer,
> der hver indeholder en række? Eller?

Jeg vil gerne have en Vektor indeholdende
Vektorer med poster fundet med en given
søgekriterie.

Fx alle rækker hvor kolonnen Beskrivelse
indeholder bogstaverne "sikr" i samme
rækkefølge.

Jeg vil mene min SQL bør se således ud:
SELECT * FROM Vare WHERE Beskrivelse LIKE ´%sikr%´

Men jeg forstår det ikke er problemet?

Mvh.
Mikael


Jonathan Stein (22-09-2002)
Kommentar
Fra : Jonathan Stein


Dato : 22-09-02 23:25

Mikael Nørrelund Andersen wrote:

> > Ja, den returnerer en Vector med den første række fra databasen.
>
> Hmm, måske har jeg fået byttet rundt på noget.
>
> Hvad med denne, den bør returnere en vektor med
> alle elementer fra en tabel.
> ...
> resultVector = lavVectorTabel(rs, rsmd);

- hvordan ser din "lavVectorTabel" ud?

> > Hvad vil du opnå. En Vector med alle felter
> > fra alle rækker? Eller en Vector af Vectorer,
> > der hver indeholder en række? Eller?
>
> Jeg vil gerne have en Vektor indeholdende
> Vektorer med poster fundet med en given
> søgekriterie.

Så er det jo sådan set fint nok, at din "lavVector" returnerer en
Vector med én række - du skal bare kalde den for hver række i tabellen.

> Jeg vil mene min SQL bør se således ud:
> SELECT * FROM Vare WHERE Beskrivelse LIKE ´%sikr%´
>
> Men jeg forstår det ikke er problemet?

Ja - din SQL ser fin ud, men du kommer ikke uden om at lave en løkke,
hvor du løber gennem record-sættet. Lige nu kalder du "lavVector" på
første række - og så rykker du aldrig videre i dit datasæt.

M.v.h.

Jonathan

--
Nyt alternativ til egen server: JSP Enterprise hotel med adgang til
Enterprise Java Beans, egen Java Virtual Machine og egen IP-adresse
(giver mulighed for eget SSL-certifikat).
http://www.jsp-hotel.dk/



Mikael Nørrelund And~ (23-09-2002)
Kommentar
Fra : Mikael Nørrelund And~


Dato : 23-09-02 07:49

Jonathan Stein <jstein@image.dk> skrev:
> - hvordan ser din "lavVectorTabel" ud?

---
private Vector lavVectorTabel
(ResultSet rs,ResultSetMetaData rsmd) throws SQLException{

Vector vec = new Vector();

do {
vec.addElement(lavVector(rs,rsmd));
}while(rs.next());

return vec;

}//lavVectorTabel slut
---

> Ja - din SQL ser fin ud, men du
>kommer ikke uden om at lave en løkke,
>hvor du løber gennem record-sættet.
>Lige nu kalder du "lavVector" på
>første række - og så rykker du
>aldrig videre i dit datasæt.

Faldt lige over, at en forespørgsel i
Access med kriteriet LIKE skal se
sådan ud:

SELECT * FROM Vare WHERE Vare.Beskrivelse LIKE '*søgeord*';

Det virker perfekt i Access ift. den før,
hvor jeg brugte %.
Det virker bare ikke gennem Java!

/Mikael

PS.
Mange tak for den tid du/I bruger på mit
problem ;)


Mikael Nørrelund And~ (23-09-2002)
Kommentar
Fra : Mikael Nørrelund And~


Dato : 23-09-02 08:33

Jonathan Stein <jstein@image.dk> skrev:
>Lige nu kalder du "lavVector" på
>første række - og så rykker du
>aldrig videre i dit datasæt.

Nu virker det!
Mange mange tak for hjælpen.
---
private Vector lavVector(
ResultSet rs, ResultSetMetaData rsmd) throws SQLException{

Vector rows = new Vector();

while( rs.next() )
{
for ( int i = 1; i <= rsmd.getColumnCount(); ++i )
switch( rsmd.getColumnType( i ) ) {
case Types.VARCHAR:
rows.addElement( rs.getString( i ) );
break;
case Types.LONGVARCHAR:
rows.addElement( rs.getString( i ) );
break;
case Types.INTEGER:
rows.addElement( new Integer(
rs.getInt( i ) ) );
break;
default:
System.out.println( "Type var: " +
rsmd.getColumnTypeName( i ) );
}//switch slut
}//while slut
---

Jeg har bare indsat den yderste while-løkke.

Endnu engang mange tak for hjælpen.

Mvh.
Mikael


Mikael Nørrelund And~ (23-09-2002)
Kommentar
Fra : Mikael Nørrelund And~


Dato : 23-09-02 08:33

Jonathan Stein <jstein@image.dk> skrev:
>Lige nu kalder du "lavVector" på
>første række - og så rykker du
>aldrig videre i dit datasæt.

Nu virker det!
Mange mange tak for hjælpen.
---
private Vector lavVector(
ResultSet rs, ResultSetMetaData rsmd) throws SQLException{

Vector rows = new Vector();

while( rs.next() )
{
for ( int i = 1; i <= rsmd.getColumnCount(); ++i )
switch( rsmd.getColumnType( i ) ) {
case Types.VARCHAR:
rows.addElement( rs.getString( i ) );
break;
case Types.LONGVARCHAR:
rows.addElement( rs.getString( i ) );
break;
case Types.INTEGER:
rows.addElement( new Integer(
rs.getInt( i ) ) );
break;
default:
System.out.println( "Type var: " +
rsmd.getColumnTypeName( i ) );
}//switch slut
}//while slut
---

Jeg har bare indsat den yderste while-løkke.

Endnu engang mange tak for hjælpen.

Mvh.
Mikael


Mikael Nørrelund And~ (23-09-2002)
Kommentar
Fra : Mikael Nørrelund And~


Dato : 23-09-02 08:33

Jonathan Stein <jstein@image.dk> skrev:
>Lige nu kalder du "lavVector" på
>første række - og så rykker du
>aldrig videre i dit datasæt.

Nu virker det!
Mange mange tak for hjælpen.
---
private Vector lavVector(
ResultSet rs, ResultSetMetaData rsmd) throws SQLException{

Vector rows = new Vector();

while( rs.next() )
{
for ( int i = 1; i <= rsmd.getColumnCount(); ++i )
switch( rsmd.getColumnType( i ) ) {
case Types.VARCHAR:
rows.addElement( rs.getString( i ) );
break;
case Types.LONGVARCHAR:
rows.addElement( rs.getString( i ) );
break;
case Types.INTEGER:
rows.addElement( new Integer(
rs.getInt( i ) ) );
break;
default:
System.out.println( "Type var: " +
rsmd.getColumnTypeName( i ) );
}//switch slut
}//while slut
---

Jeg har bare indsat den yderste while-løkke.

Endnu engang mange tak for hjælpen.

Mvh.
Mikael


Søg
Reklame
Statistik
Spørgsmål : 177500
Tips : 31968
Nyheder : 719565
Indlæg : 6408518
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste