Avatar billede coolfisk Nybegynder
21. november 2003 - 21:46 Der er 17 kommentarer og
1 løsning

Database + java

Er igang med at afprøve et eks, bestående af 3 klasser:

Har tilføjet KUNDER.mdb til Data Sources (ODBC). 

import java.util.*;

public class BenytDatabaseforbindelse
{
  public static void main(String[] arg)
  {
    try {
      Databaseforbindelse dbf = new Databaseforbindelse();
      dbf.opretTestdata(); // fjern hvis tabellen allerede findes
      Vector  v = dbf.hentAlle();
      System.out.println("Alle data: "+v);
      dbf.sletAlleData();

      dbf.indsæt( new Kunde("Kurt",1000) );
     
      System.out.println("Alle data nu: "+ dbf.hentAlle());

    } catch(Exception e) {
      System.out.println("Problem med database: "+e);
      e.printStackTrace();
    }
  }
}

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

public class Databaseforbindelse
{
  private Connection forb;
  private Statement stmt;

  public Databaseforbindelse() throws Exception
  {
 
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    Connection forb = DriverManager.getConnection("jdbc:odbc:KUNDER");
    Statement stmt = forb.createStatement();

  }

  public void sletAlleData() throws SQLException
  {
    stmt.execute("truncate table KUNDER");
  }

  public void opretTestdata() throws SQLException
  {
    try { // hvis tabellen allerede eksisterer opstår der en SQL-udtagelse
        stmt.executeUpdate(
        "create table KUNDER (NAVN varchar(32), KREDIT float)" );
    } catch (SQLException e) {
      System.out.println("Kunne ikke oprette tabel: "+e);
    }
    stmt.executeUpdate("insert into KUNDER values('Jacob', -1799)");
    stmt.executeUpdate("insert into KUNDER values('Brian', 0)");
  }

  public void indsæt(Kunde k) throws SQLException
  {
    stmt.executeUpdate("insert into KUNDER (NAVN,KREDIT) values('"
      + k.navn + "', " + k.kredit + ")");
  }

  public Vector hentAlle() throws SQLException
  {
    Vector alle = new Vector();
    ResultSet rs = stmt.executeQuery("select NAVN, KREDIT from KUNDER");
    while (rs.next())
    {
      // brug kolonneindeks i stedet for kolonnenavn
      Kunde k = new Kunde( rs.getString(1), rs.getDouble(2));
      alle.addElement(k);
    }
    return alle;
  }
}


public class Kunde
{
  String navn;
  double kredit;

  public Kunde(String n, double k)
  {
    navn = n;
    kredit = k;
  }

  public String toString()
  {
    return navn+": "+kredit+" kr.";
  }
}


Programmet melder denne fejl:

java.lang.NullPointerException

    at Databaseforbindelse.opretTestdata(Databaseforbindelse.java:40)

    at BenytDatabaseforbindelse.main(BenytDatabaseforbindelse.java:20)

Problem med database: java.lang.NullPointerException
Avatar billede roo104 Nybegynder
21. november 2003 - 22:21 #1
Der er noget galt her, prøv:

private Connection forb;
  private Statement stmt;

  public Databaseforbindelse() throws Exception
  {

    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    forb = DriverManager.getConnection("jdbc:odbc:KUNDER");
    stmt = forb.createStatement();
Avatar billede coolfisk Nybegynder
21. november 2003 - 23:02 #2
siger nu:

Kunne ikke oprette tabel: java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Table 'KUNDER' already exists.

java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1.

    at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6879)

    at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7036)

    at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(JdbcOdbc.java:3065)

    at sun.jdbc.odbc.JdbcOdbcStatement.execute(JdbcOdbcStatement.java:338)Problem med database: java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 1.



    at sun.jdbc.odbc.JdbcOdbcStatement.executeQuery(JdbcOdbcStatement.java:253)

    at Databaseforbindelse.hentAlle(Databaseforbindelse.java:55)

    at BenytDatabaseforbindelse.main(BenytDatabaseforbindelse.java:21)
Avatar billede roo104 Nybegynder
22. november 2003 - 11:31 #3
hvilke linje er Databaseforbindelse.java:55
og BenytDatabaseforbindelse.java:21
Avatar billede roo104 Nybegynder
22. november 2003 - 11:36 #4
prøv også lige
forb = DriverManager.getConnection("jdbc:odbc:KUNDER","","");
Avatar billede roo104 Nybegynder
22. november 2003 - 11:42 #5
Noget andet er den måde du skriver din Vector ud på Vector  v = dbf.hentAlle();
System.out.println("Alle data: "+v);

Vector er et dynamisk array, så når du skriver det vil du bare få noget meget mærkeligt ud. Du kan fx gøre sådan her:

for(int i = 0 ; i < v.size() ; i++) {
System.out.println(v.elementAt(i));
}
Avatar billede coolfisk Nybegynder
22. november 2003 - 12:05 #6
siger nu:

java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.

    at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6879)

    at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7036)

    at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(JdbcOdbc.java:3065)

Jacob: -1799.0 kr.

Brian: 0.0 kr.

Problem med database: java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.

    at sun.jdbc.odbc.JdbcOdbcStatement.execute(JdbcOdbcStatement.java:338)

    at Databaseforbindelse.sletAlleData(Databaseforbindelse.java:33)

    at BenytDatabaseforbindelse.main(BenytDatabaseforbindelse.java:27)
Avatar billede coolfisk Nybegynder
22. november 2003 - 12:06 #7
Det er et eksempel min lære har udleveret!? Bare underligt det ikke virker, mon han selv har testet det ;)
Avatar billede roo104 Nybegynder
22. november 2003 - 12:14 #8
Jeg kan se det er en del fra bogen www.javabog.dk, der bruger han vist en oracle database.

Men sjovt at den faktsk henter data, men stadig laver fejl.
I din main idkommenter:
//dbf.opretTestdata();
//dbf.indsæt( new Kunde("Kurt",1000) );

melder den så stadig fejl ?
Avatar billede coolfisk Nybegynder
22. november 2003 - 12:18 #9
Jacob: -1799.0 kr.

Brian: 0.0 kr.

java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.

    at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6879)

    at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7036)

    at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(JdbcOdbc.java:3065)

Problem med database: java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'.

    at sun.jdbc.odbc.JdbcOdbcStatement.execute(JdbcOdbcStatement.java:338)

    at Databaseforbindelse.sletAlleData(Databaseforbindelse.java:33)

    at BenytDatabaseforbindelse.main(BenytDatabaseforbindelse.java:27)
Avatar billede coolfisk Nybegynder
22. november 2003 - 12:21 #10
har udkommenteret dbf.sletAlleData();... og nu er der ingen fejl, så det må være i den kode...
Avatar billede coolfisk Nybegynder
22. november 2003 - 12:22 #11
public void sletAlleData() throws SQLException
  {
    stmt.execute("truncate table KUNDER");
  }

kan man ikke slette tabellen således?
Avatar billede coolfisk Nybegynder
22. november 2003 - 12:31 #12
Hvad skriver man hvis man f.eks. kun vil slette rækken med  Brian, 0kr?
Avatar billede roo104 Nybegynder
22. november 2003 - 13:20 #13
delete from kunder where navn = 'brian'
eller
delete from kunder where kredit = 0
eller
delete from kunder where navn = 'brian' and kredit = 0

Kender ikke access, men normalt når man vil slette en tabel er det:
drop table tabelnavn

fx:
drop table kunder
Avatar billede roo104 Nybegynder
22. november 2003 - 13:21 #14
truncate er vist noget med at samle så vidt jeg ved
Avatar billede coolfisk Nybegynder
22. november 2003 - 13:21 #15
Mange tak for hjælpen... :)
Avatar billede roo104 Nybegynder
22. november 2003 - 13:22 #16
ahhh slet alle er bare "delete from kunder", så sletter den alt
Avatar billede arne_v Ekspert
22. november 2003 - 13:41 #17
TRUNCATE TABLE tabelnavn;

er en ikke standard SQL sætning men alligevel meget udbredt (ikke kun Oracle men
også MS SQLServer har den).

Den sletter alle records ligesom:

DELETE FROM tabelnavn;

men den kan ikke rolles back og den kører ikke delete triggers.

Eller på mere jævnt dansk:

Brugere og applikationer bør bruge DELETE FROM.

Database administartorer kan bruge TRUNCATE TABLE når de skal rydde op
og har travlt.
Avatar billede coolfisk Nybegynder
22. november 2003 - 14:08 #18
Så var det derfor :) ... mange 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