Avatar billede mik28 Seniormester
04. december 2004 - 17:27 Der er 51 kommentarer og
1 løsning

JSP/SQL problem

Jeg vil gerne lave denne forespørgsel i min database

SELECT
p.under_produktnavn, p.id
from under_produktgruppe p, under_produktgruppe_produkt_rel pr
where pr.under_produktgruppe_id = 1;

Det gør jeg så således, men af en eller anden grund så kikser det. Det mærkelige er at hvis jeg fjerner p.id så virker det. Jeg har prøvet at køre forespørgslen direkte på databasen og der virker hele udtrykket.

ResultSet rs    = d.select("SELECT p.id, p.under_produktnavn from under_produktgruppe p, under_produktgruppe_produkt_rel pr where pr.under_produktgruppe_id = ? and pr.produkt_id = p.id", vi);
Avatar billede arne_v Ekspert
04. december 2004 - 17:29 #1
Kan du uddybe "kikser det" ?
Avatar billede mik28 Seniormester
04. december 2004 - 17:29 #2
Avatar billede mik28 Seniormester
04. december 2004 - 17:31 #3
Jeg kan prøve at fjerne p.id så du kan se at det så virker
Avatar billede arne_v Ekspert
04. december 2004 - 17:33 #4
Jeg fik en NullPointerException, hvilket antyder en variabel der ikke har
fået en værdi.

Stack trace sagde:

under_005fproduktgruppe_jsp.java:78

så det er vel bare at finde under_005fproduktgruppe_jsp.java ovre i
work dir og se hvad linie 78 er ?
Avatar billede mik28 Seniormester
04. december 2004 - 17:37 #5
okay, det underlige er bare at der kun er en variable, og det eneste jeg gør er at hente en værdi til fra databasen
Avatar billede mik28 Seniormester
04. december 2004 - 17:44 #6
Jeg ville kunne forstå det hvis det ikke virkede når jeg kørte det op imod databasen direkte, men der virker det fint :-)
Avatar billede mik28 Seniormester
04. december 2004 - 17:48 #7
under_005fproduktgruppe_jsp.java:78

er starten på den whileløkke jeg bruger til at løbe resultsettet igennem med
Avatar billede arne_v Ekspert
04. december 2004 - 17:50 #8
Hvis du får en null pointer exception i den, så må rs vel være null !?

Sker der en exception uden at du får exception teksten skrevet ud ?
Avatar billede mik28 Seniormester
04. december 2004 - 17:50 #9
ResultSet rs    = d.select("SELECT p.id, p.under_produktnavn from under_produktgruppe p, under_produktgruppe_produkt_rel pr where pr.under_produktgruppe_id = ? and pr.produkt_id = p.id", vi);

virker ikke
Avatar billede mik28 Seniormester
04. december 2004 - 17:51 #10
ResultSet rs    = d.select("SELECT p.under_produktnavn from under_produktgruppe p, under_produktgruppe_produkt_rel pr where pr.under_produktgruppe_id = ? and pr.produkt_id = p.id", vi);

Virker
Avatar billede arne_v Ekspert
04. december 2004 - 17:56 #11
Det har jeg forstået.

Men fejlen indikeret at det opstår ved at d.select returnerer null i det første
tilfælde.

Det kan den nok kun hvis der sker en SQLException inde i d.select.

Hvis vi kendte den SQLException så var det nok nemmere at se fejlen.
Avatar billede mik28 Seniormester
04. december 2004 - 18:18 #12
den siger at bjorndb.p doesn't exist
Avatar billede mik28 Seniormester
04. december 2004 - 18:20 #13
Select fejlede: java.sql.SQLException: General error,  message from server: "Tab
le 'bjorndb.p' doesn't exist"
Avatar billede arne_v Ekspert
04. december 2004 - 18:49 #14
Det ser godt nok mystisk ud.

p burde jo eksistere lige meget i begge queries

Der er ikke noget snavs som f.eks. en tab karakter fremfor mellemrum i linien ?
Avatar billede mik28 Seniormester
04. december 2004 - 18:55 #15
Nope. Det ser præcis således ud

select p.id, p.under_produktnavn from under_produktgruppe p, under_produktgruppe_produkt_rel pr where pr.under_produktgruppe_id = 1 and pr.produkt_id = p.id

Jeg bruger jo også p.id tilsidst
Avatar billede mik28 Seniormester
04. december 2004 - 18:55 #16
kan det hænge sammen med alle de _ jeg bruger
Avatar billede mik28 Seniormester
04. december 2004 - 19:03 #17
Jeg fatter det simpelthen hat. Her er den klasse som jeg bruger til at skabe forbindelsen til databasen

package util;
import java.util.Vector;
import java.sql.*;


public class Databaseforbindelsemysqlprepared
{
    private Connection conn ;
    private PreparedStatement pstmt;
       
    public Databaseforbindelsemysqlprepared(String data, String driver)
    {
       
        try
        {
            Class.forName(driver);
            conn = DriverManager.getConnection(data, "", "");

        }
        catch(Exception s)
        {
            System.out.println("SQL dataforbindelse fejlede"+s);
        }   
    }
   
    public ResultSet select(String sql, Vector params)
    {
        ResultSet r = null;
        try
     
        {
    //    System.out.println("SQL=" + sql);
        PreparedStatement pstmt = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,
                                      ResultSet.CONCUR_UPDATABLE);
         
            for (int i=0; i < params.size(); i++) {
        //    System.out.println("arg " + (i + 1) + "=" + (String)params.elementAt(i));
            pstmt.setString(i+1, (String)params.elementAt(i));
            } 
     
        r = pstmt.executeQuery();
 
        }
        catch(SQLException s)
        {
            System.out.println("Select fejlede: "+s);
        }     
        return r;
    }
   
    public void insertUpdate(String sql, Vector params)
    {
        try
        {
            PreparedStatement pstmt = conn.prepareStatement(sql);         
            for (int i=0; i < params.size(); i++) {
            pstmt.setString(i+1, (String)params.elementAt(i));
            } 
            pstmt.executeUpdate();

        }
        catch(SQLException s)
        {
            System.out.println("update/insert fejlede");
        }       
    }
   
    public void close()
    {
        try
        {
            conn.close();
        }
        catch(SQLException s)
        {
            System.out.println("Close fejlede");
        }
       
    }
}
Avatar billede mik28 Seniormester
05. december 2004 - 11:49 #18
Jeg syntes efterhånden at jeg har prøvet alt. Jeg kan heller ikke hive p.id ud alene
Avatar billede mik28 Seniormester
05. december 2004 - 11:56 #19
Det bliver mere og mere spooky. Det er kun feltet id som giver problemer. Jeg har prøvet at tilføje et nyt felt og det virker bare
Avatar billede arne_v Ekspert
05. december 2004 - 13:55 #20
Ja - jeg forstår det heller ikke
Avatar billede mik28 Seniormester
05. december 2004 - 14:09 #21
Det er et meget dårligt tegn at du ikke forstår det :-)
Avatar billede erikjacobsen Ekspert
05. december 2004 - 14:17 #22
Der er nok en god forklaring. Det plejer der jo ;)

Hvad er typen af dit produktnavn? Og hvordan ser det ud, der hvor du henter
tingene fra dit resultset?
Avatar billede mik28 Seniormester
05. december 2004 - 14:19 #23
Der er ingen god forklaring på det her
Avatar billede mik28 Seniormester
05. december 2004 - 14:20 #24
og hvis der er er jeg meget interesseret i at vide hvad den skulle være
Avatar billede mik28 Seniormester
05. december 2004 - 14:27 #25
<tr><td><%= rs.getString("under_produktnavn") %></td><td><%= rs.getString("test") %></td></tr>
Avatar billede mik28 Seniormester
05. december 2004 - 14:28 #26
test er så bare for at se om jeg kan hente noget andet end id ud
Avatar billede mik28 Seniormester
05. december 2004 - 14:29 #27
Avatar billede arne_v Ekspert
05. december 2004 - 14:33 #28
SELECT p.id, p.under_produktnavn from under_produktgruppe p, under_produktgruppe_produkt_rel pr where pr.under_produktgruppe_id = ? and pr.produkt_id = p.id

giver:
  java.sql.SQLException: General error,  message from server: "Table 'bjorndb.p' doesn't exist"

SELECT      p.under_produktnavn from under_produktgruppe p, under_produktgruppe_produkt_rel pr where pr.under_produktgruppe_id = ? and pr.produkt_id = p.id

virker

Og der er ikke tabs eller andre non printable karakterer i den version som giver fejl ?
Avatar billede arne_v Ekspert
05. december 2004 - 14:33 #29
Har du prøvet:

SELECT `p.id`, p.under_produktnavn from under_produktgruppe p, under_produktgruppe_produkt_rel pr where pr.under_produktgruppe_id = ? and pr.produkt_id = p.id

?
Avatar billede mik28 Seniormester
05. december 2004 - 14:35 #30
det virker heller ikke
Avatar billede mik28 Seniormester
06. december 2004 - 17:40 #31
Jeg forstår det simpelhen ikke. Det vil bare ikke virke. Jeg kan ikke skrive

ResultSet rs    = d.select("select p.id, p.under_produktnavn from under_produktgruppe p, under_produktgruppe_produkt_rel pr where pr.under_produktgruppe_id = ? and pr.produkt_id = p.id", vi);

men godt

ResultSet rs    = d.select("SELECT id,under_produktnavn from under_produktgruppe", vi);
Avatar billede mik28 Seniormester
06. december 2004 - 18:02 #32
der er 200 points til den person som kan løse mysteriet :-)
Avatar billede mik28 Seniormester
06. december 2004 - 19:40 #33
Jeg har fundet en løsning, ikke at jeg fatter hvorfor det virker. Når man laver et index på en tabel i MySQL kan man åbenbart lave et primært og et newindex. Jeg havde sat det til at være primært, men efter jeg satte det til newindex så virker det med auto increment og det hele
Avatar billede mik28 Seniormester
06. december 2004 - 19:40 #34
Lukker
Avatar billede erikjacobsen Ekspert
06. december 2004 - 21:32 #35
Som jeg sagde, der er altid en løsning, hvis du blot vil give os de relevante oplysninger ;)
Avatar billede mik28 Seniormester
06. december 2004 - 22:10 #36
Det har jeg da også gjort. Kan du forklare mig hvad problemet var?
Avatar billede erikjacobsen Ekspert
06. december 2004 - 22:13 #37
Du havde slet ikke fortalt alt, før du selv fandt din løsning. Så kan vi kun gætte.
Men det er fint nok du fandt ud af det!
Avatar billede mik28 Seniormester
06. december 2004 - 22:15 #38
Det ville jeg sætte pris på. Jeg har intet ændret i min JAVA. Jeg har blot konstateret at jeg ikke kunne hente data fra id feltet hvis der var defineret et index i tabellen. Det er så en sandhed med modifikationer jeg kunne jo godt skrive select id from o.s.v men ikke select u.id from o.s.v. Hvordan skulle man kunne vide at man ikke må definerer indexet på en tabel som primary index, men skal definerer det som noget andet???? Det giver i min verden ingen mening
Avatar billede mik28 Seniormester
06. december 2004 - 22:16 #39
Hvad manglede du at vide?
Avatar billede mik28 Seniormester
06. december 2004 - 22:18 #40
Det som generer mig mest er at den løsning jeg har fundet virker, men jeg fatter ikke hvad forskellen skulle være fra det andet jeg havde lavet
Avatar billede erikjacobsen Ekspert
06. december 2004 - 22:20 #41
Fx hvordan din tabel var konstrueret. Jeg bad om typen på det ene felt, og det ville
du ikke svare på. I nogle tilfælde har det betydning. Men glem det, intet problem for
mig. Slut herfra.
Avatar billede arne_v Ekspert
06. december 2004 - 22:21 #42
Jeg forstår det heller ikke.

Normalt vil man antage at tilstedeværelsen af index påvirker performance af SELECT
men ikke funktionaliteten af SELECT.
Avatar billede mik28 Seniormester
06. december 2004 - 22:21 #43
det er såmend bare en int
Avatar billede mik28 Seniormester
06. december 2004 - 22:25 #44
Der er et index på tabellen nu og det virker.

Når jeg oprettet tabellen, iøvrigt med MySQL front så oprettet den automatisk et felt som hedder Id med et Primary Index på. Hvis jeg bare lader det index være det så virker det ikke, så det fjerner jeg, og opretter et nyt som jeg kalder noget andet. Det giver ingen mening at det skulle gøre en forskel, men det gør det altså
Avatar billede mik28 Seniormester
06. december 2004 - 22:29 #45
nogen gange kan man blot sige NÅ!!
Avatar billede mik28 Seniormester
06. december 2004 - 22:33 #46
Jeg er bare så glad for at det virker. Tak for hjælpen :-)
Avatar billede mik28 Seniormester
06. december 2004 - 22:37 #47
Tabellen er oprettet således for at det skal virke

CREATE TABLE `under_produktgruppe` (
  `id` int(6) unsigned NOT NULL auto_increment,
  `under_produktnavn` varchar(40) default NULL,
  KEY `NewIndex` (`id`)
) TYPE=InnoDB;
Avatar billede mik28 Seniormester
06. december 2004 - 22:46 #48
Det eneste jeg efterlyser er hvorfor det kun virker i det tilfælde
Avatar billede arne_v Ekspert
06. december 2004 - 22:49 #49
Og hvordan så den ud, når den ikke virkede ?
Avatar billede mik28 Seniormester
06. december 2004 - 22:50 #50
KEY `Primary Index` (`id`)
Avatar billede arne_v Ekspert
06. december 2004 - 22:57 #51
Hvad med den "normale" form:


CREATE TABLE `under_produktgruppe` (
  `id` int(6) unsigned NOT NULL auto_increment,
  `under_produktnavn` varchar(40) default NULL,
  PRIMARY KEY (`id`)
) TYPE=InnoDB;

?
Avatar billede mik28 Seniormester
06. december 2004 - 23:02 #52
aner det ikke :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester