Avatar billede uvoller Novice
25. februar 2003 - 12:22 Der er 23 kommentarer og
1 løsning

Underlig fejlmeddelse

Jeg er ved at lave en database til et java mail program, i denne er der 2 tabeller:
brugerTabel      BrugerNavn, PassWord, id
PostTabel        post, id
hvor id er linket imellem de 2 tabeller
Min kode ser ud som følgende:

import java.sql.*;
import java.util.*;

public class AdminDB
{
  static Connection connect;

  private static void loadDriver()
  {
    try
    {
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    }
    catch (ClassNotFoundException ex)
    {
      System.out.println("Fejl, kan ikke load'e driveren");
    }
  }

  private static void openDB()
  {
    try
    {
      connect = DriverManager.getConnection("jdbc:odbc:postkasse");
    }
    catch (SQLException se)
    {
      System.out.println("Fejl, kan ikke etablere forbindelse til databasen");
    }
  }

  private static void closeDB()
  {
    try
    {
      connect.close();
    }
    catch (SQLException se)
    {
      System.out.println("Fejl, kan ikke ikke lukkes");
    }
  }

  private static void indsaetmail(String afsender, String Password)
  {
    try
    {
      Statement stm = connect.createStatement();
      stm.executeUpdate("INSERT INTO BrugerTabel (BrugerNavn, PassWord) VALUES ('"+ afsender +"', '" + Password + "')");
    }
    catch (SQLException se)
    {
      System.out.println("Fejl, række kan ikke indsætte Brugernavn i tabellen BrugerTabel");
    }
  }
  private static void hentmail(String brugernavn)
  {
      try
      {
        Statement stm = connect.createStatement();
        ResultSet brugerId = stm.executeQuery("Select id FROM BrugerTabel WHERE BrugerNavn = 'anja' ");
        System.out.println(brugerId);
      }
      catch (SQLException ex)
      {
        System.out.println("Kan ikke finde bruger");
      }
  }
  public static void main(String []args)
  {
    loadDriver();
    openDB();
    indsaetmail("Indsættelse i DB", "Password til DB");
    hentmail("anja");
    closeDB();
  }

}

Jeg kan godt skrive til databasen, men når jeg leder efter et id som referer til et navn får jeg denne fejl meddelse:
sun.jdbc.odbc.JdbcOdbcResultSet@c21495
og den bliver ikke fanget med catch

hvad gør jeg forkert her ??
Avatar billede magoo20000 Nybegynder
25. februar 2003 - 12:25 #1
Den gør da det du baer den om - nemlig at udskrive et Java ResultSet!
Avatar billede erikjacobsen Ekspert
25. februar 2003 - 12:26 #2
Du kan ikke bare skrive den ud med
System.out.println(brugerId);
Du skal løbe dit result igennem med en løkke.
Det er ikke en fejl du får, det er blot det pågældende
objekst egen toString() du ser.
Avatar billede magoo20000 Nybegynder
25. februar 2003 - 12:26 #3
Her sker det: 
        try{
        Statement stm = connect.createStatement();
        ResultSet brugerId = stm.executeQuery("Select id FROM BrugerTabel WHERE BrugerNavn = 'anja' ");
        System.out.println(brugerId); //<-----
      }
Avatar billede uvoller Novice
25. februar 2003 - 12:28 #4
Oki så lærte jeg da det ;?))
Hvad mener du med at jeg skal løbe den igennem en løkke ??
Retunere den resultatet som en String ?
Avatar billede magoo20000 Nybegynder
25. februar 2003 - 12:28 #5
Du kan skrive:

ResultSet res = stm.execute(...Din sql...);
whiile(res.next()){
System.out.println("---> "+res.getString("BrugerNavn") );.....
Avatar billede magoo20000 Nybegynder
25. februar 2003 - 12:31 #6
Du løber igennem dit resultset vha while(res.next()).
next() metoden svarer groft sagt til at benytte i++, når du gennemløbet et array.
Avatar billede magoo20000 Nybegynder
25. februar 2003 - 12:39 #7
Avatar billede uvoller Novice
25. februar 2003 - 12:39 #8
Oki nu får jeg bare min SQL exceptions fejl, jeg har ændret i funktionen så den nu ser sådan ud:

private static void hentmail(String brugernavn)
  {
      try
      {
        Statement stm = connect.createStatement();
        ResultSet brugerId = stm.executeQuery("Select id FROM BrugerTabel WHERE BrugerNavn = 'porky' " );
        while(brugerId.next())
        {
            System.out.println("---> "+brugerId.getString("BrugerNavn") );
        }
      }
      catch (SQLException ex)
      {
        System.out.println("Kan ikke finde bruger");
      }
  }

min DB tabel ser ud som følger:

BrugerNavn    PassWord    id
klaus              klaus            1
porky              porky            2
voller              voller    3
anja              anja            4

men den kan stadigvæk ikke finde id, det kan jeg ikke se hvorfor den ikke kan, Det er en Access DB, skal lige nævnes.
Avatar billede magoo20000 Nybegynder
25. februar 2003 - 12:45 #9
Prøv at skrive din exception ud med
catch (SQLException ex)
      {
        ex.printStackTrace(System.out);
      }
Avatar billede erikjacobsen Ekspert
25. februar 2003 - 12:45 #10
System.out.println("---> "+brugerId.getString("id") );
Avatar billede erikjacobsen Ekspert
25. februar 2003 - 12:46 #11
Det er ikke en SQL fejl, at der evt ikke er en bruger, der hedder
'porky'. I det tilfælde løber du blot ikke din while løkke igennem.
Det er til gengæld en SQL fejl hvis der er syntaksfejl i SQL-sætningen,
eller du refererer felter, der ikke findes.
Avatar billede uvoller Novice
25. februar 2003 - 12:52 #12
Når jeg skriver min exception ud med dit forslag får jeg følgende:
java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1.
            at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6106)
            at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:6263)
            at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(JdbcOdbc.java:2525)
            at sun.jdbc.odbc.JdbcOdbcStatement.execute(JdbcOdbcStatement.java:337)
            at sun.jdbc.odbc.JdbcOdbcStatement.executeQuery(JdbcOdbcStatement.java:252)
            at AdminDB.hentmail(AdminDB.java:80)
            at AdminDB.main(AdminDB.java:97)
Finished executing

Jeg er med på at det ikke er en SQL fejl hvis der ingen bruger er, men i dette tilfælde er der en bruger der hedder porky )
Avatar billede uvoller Novice
25. februar 2003 - 12:53 #13
Grunden til at jeg vil have det skrevet ud er at så er jeg sikker på at jeg finder det rigtige i DB'en, det vil jeg selvfølgelig ikke senere i projektet.
Avatar billede magoo20000 Nybegynder
25. februar 2003 - 12:55 #14
Skal der stå 'porky'... Hmmm...
Prøv med
    try
      {
        Statement stm = connect.createStatement();
        String bruger = "porky";
        ResultSet brugerId = stm.executeQuery("Select id FROM BrugerTabel  WHERE BrugerNavn = ='"+bruger+"'" );
        while(brugerId.next())
        {
            System.out.println("---> "+brugerId.getString("BrugerNavn") );
        }
Avatar billede uvoller Novice
25. februar 2003 - 13:01 #15
hee hee jeg tror bare ikke det skal virke ))
Jeg får stadigvæk meddelsen fra før (
Tak for de hurtige svar er lækkert at arbejde med
Har været inde og se på det link d posted, der skriver de det på samme måde som her, meget underligt syntes jeg.
Avatar billede magoo20000 Nybegynder
25. februar 2003 - 13:07 #16
Har du prøvet med: "Select * from Brugertabel"
Og så før din while kan du prøve System.out.println("Size "+brugerId.size() );
Jeg tror nok den hedder size() ellers kan du lige se i API'en fra SUN.
Avatar billede magoo20000 Nybegynder
25. februar 2003 - 13:19 #17
Du kan evt. læse http://developer.java.sun.com/developer/onlineTraining/Database/JDBC20Intro/JDBC20.html

Og hvis du skal have samme statements udført mange gange er det smart med Prepared Statements.
Avatar billede uvoller Novice
25. februar 2003 - 13:30 #18
Når jeg bruger Select * FROM BrugerTabel får jeg ingen fejlmeddelse, og jeg kan skrive min poster ud en kolonne af gangen, ved at bruge følgende:
System.out.println("---> "+brugerId.getString("BrugerNavn") );
og så ændre BrugerNavn til henholdsvis PassWord og id som de hedder i DB' en
Hvis jeg laver følgende:
ResultSet brugerId = stm.executeQuery("Select * FROM BrugerTabel WHERE BrugerNavn = '*' ");
får jeg bare en meddelse om Finished executing

Vil prøve at se på den nye side også
Avatar billede magoo20000 Nybegynder
25. februar 2003 - 13:34 #19
Jeg mener ikke "Select * FROM BrugerTabel WHERE BrugerNavn = '*' " er lovlig SQL!
Avatar billede erikjacobsen Ekspert
25. februar 2003 - 13:47 #20
Det er det da heller ikke.

        Select * FROM BrugerTabel

giver alle
Avatar billede magoo20000 Nybegynder
25. februar 2003 - 19:38 #21
Spiller det?
Avatar billede arne_v Ekspert
25. februar 2003 - 22:04 #22
"Select * FROM BrugerTabel WHERE BrugerNavn = '*'"

er helt lovlig SQL !

Men den finder altså den record hvor brugernavn faktisk er en stjerne,
hvilket næppe var hensigten.
Avatar billede magoo20000 Nybegynder
26. februar 2003 - 09:48 #23
Ok! Man det giver da samme resultat, som select * from brugertabel? Du har helt ret i, at det ikke er det statement, han har brug.
Avatar billede uvoller Novice
26. februar 2003 - 09:57 #24
Det virker bare fint nu, nu kan jeg hente de data jeg har brug for, tak for hjælpen.
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