Avatar billede bagnavnet Nybegynder
11. december 2004 - 12:36 Der er 17 kommentarer og
1 løsning

Syntax error on token

Hey,

har set mig blind på den her tror jeg! Kan ikke se hvad jeg har lavet forkert.
-------------------------------
public void indsætVare(Vare v) throws SQLException
                      {
                           
                        stmt.executeUpdate("insert into VARE (VARE_ID, NAVN,PRIS) values('"
                          +v.vare_id+ ",  "+ v.navn + "', " + v.pris + ")");
                      }
-----------------------------------------------------
Får fejl i første linie, første parantes er markeret med rødt. Og dette er fejlen:
---------------------
java.lang.Error: Unresolved compilation problem:
    Syntax error on token "(", ";" expected

    at OracleTest.main(OracleTest.java:31)
Exception in thread "main"
-----------------------
Koden ligger i en try-clause. Nogen der lige kan overskue hvad fejlen er?
Avatar billede mikkelbm Nybegynder
11. december 2004 - 12:38 #1
values('"+v.vare_id+ "',  '"+ v.navn + "', " + v.pris + ")");
Avatar billede mikkelbm Nybegynder
11. december 2004 - 12:39 #2
Du får ikke lukket dine '" + something + "'
Avatar billede mikkelbm Nybegynder
11. december 2004 - 12:40 #3
Hvis vare_id er et tal skal det nok være:

values("+v.vare_id+ ",  '"+ v.navn + "', " + v.pris + ")");
Avatar billede bagnavnet Nybegynder
11. december 2004 - 12:44 #4
har smidt din linie ind, men får fortsat samme fejl. Jeg har kodestykket liggende i en anden klasse hvor jeg ikke får fejl på den, derfor undrer det mig....
Avatar billede mikkelbm Nybegynder
11. december 2004 - 12:48 #5
Jeg kan ikke se andre fejl end at dine '" ikke var lukket ordentligt.
Avatar billede mikkelbm Nybegynder
11. december 2004 - 12:50 #6
Men hmmm - det jeg nævner burde egentlig ikke gi' compiler fejl, men først give fejl når databasen prøver at udføre sql sætningen...
Avatar billede bagnavnet Nybegynder
11. december 2004 - 12:58 #7
Det er i følgende kodestykke jeg førsøger at indsætte koden:
------------------------------

import java.sql.*;
import oracle.jdbc.*;


public class OracleTest {
   
final static String connString = "jdbc:oracle:thin:@don:1521:JacobDB";

    public static void main(String[] args) {
        try {
       
        DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
       
        }
       
               
        catch (SQLException e) {
            System.out.println(e.getMessage());
           
        }
        try{
            Connection conn = DriverManager.getConnection(
              connString,"Handelssystem","Handelssystem");
         
            conn.commit();
                     
    Vare v = new Vare(123456, "Kylling", 1234); 
       
            }       
        catch (SQLException e) {
            System.out.println("nummer zwei");
            System.out.println(e.getMessage());
        }
       
       
    }
}
------------------------------
Vare klassen er således ud:
-----------------------------
import java.sql.SQLException;

public class Vare
{

    int vare_id;   
  String navn;
  double pris;

  public Vare(int vare_id, String navn, double pris)
  {
      this.vare_id = vare_id;
    this.navn = navn;
    this.pris = pris;
  }


   
  public String toString()
  {
    return navn+": "+pris+" kr.";
  }
}
--------------------------------
Hvor indsætter jeg kodestykket? Det har måske noget med placeringen at gøre....
Avatar billede mikkelbm Nybegynder
11. december 2004 - 13:10 #8
Jeg vil ikke indsætte din indsætVare metode i ovenstående kode. Det er jo din main-klasse!
Jeg ville lave en klasse og kalde den noget a la DatabaseManager eller lignende og lade den stå for alt der har med databasen at gøre.
Avatar billede mikkelbm Nybegynder
11. december 2004 - 13:14 #9
Udkast til en databasemanager:

import java.sql.*;

public class DatabaseManager
{
    private final String connString = "jdbc:oracle:thin:@don:1521:JacobDB";
    private Connection conn;
   
    public DatabaseManager()
    {
        try
        {
            DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
        }
       
               
        catch (Exception e) {
            System.out.println(e.getMessage());
           
        }
       
        try
        {
            conn = DriverManager.getConnection(connString,"Handelssystem","Handelssystem");
        }       
        catch (SQLException e) {
            System.out.println("nummer zwei");
            System.out.println(e.getMessage());
        }
    }
   
    public void indsætVare(Vare v) throws SQLException
    {
        conn.createStatement().executeUpdate("insert into VARE (VARE_ID, NAVN,PRIS) values('"
                          +v.vare_id+ ",  "+ v.navn + "', " + v.pris + ")");
    }
}
Avatar billede mikkelbm Nybegynder
11. december 2004 - 13:17 #10
Og så kommer din main-klasse til at ligne noget a la det her:

public class OracleTest
{
    public static void main(String[] args)
    {
        try
        {
            Vare v = new Vare(123456, "Kylling", 1234); 
       
            DatabaseManager dm = new DatabaseManager();
            dm.indsætVare(v);       
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
}
Avatar billede bagnavnet Nybegynder
11. december 2004 - 13:29 #11
Jeg får nu denne fejl:

java.lang.NullPointerException
    at DatabaseManager.indsætVare(DatabaseManager.java:24)
    at OracleTest.main(OracleTest.java:34)
Exception in thread "main"

Min DatabaseManger ser således ud:
--------------------
import java.sql.SQLException;
import java.sql.Statement;


public class DatabaseManager {
   
    private static Statement stmt;
   
    public void indsætVare(Vare v) throws SQLException
              {
     
                stmt.executeUpdate("insert into VARE (VARE_ID, NAVN,PRIS) values("+v.vare_id+ ",  '"+ v.navn + "', " + v.pris + ")");
                System.out.println("varene er:  " +v.vare_id+ ": " +v.navn);
              }
}
Avatar billede mikkelbm Nybegynder
11. december 2004 - 13:35 #12
Du kan jo heller ikke ovenstående!

Dit Statement stmt er jo null i og med at du ikke initialiserer den nogle steder.

Prøv at brug den databasemanager jeg har lavet. Eller i hvert fald brug den som inspiration.

Du skal jo først og fremmest ha' oprettet forbindelse til databasen og ud fra den Connection kan du så hive et Statement ud.
Avatar billede bagnavnet Nybegynder
11. december 2004 - 13:48 #13
det må du undskylde, jeg havde ikke lige fået opdateret siden og set dit udkast.
Godt udkast, for nu virker det;-)


Jeg har lige 2 hurtige.
1. values("+v.vare_id+ ",  '"+ v.navn + "', " + v.pris + ")");
Hvordan skal det læses? Er i tvivl om hvor jeg skal sætte"', bare så jeg selv kan gøre det næste gang.
2. Hvis jeg har oprettet noget som varchar2 og char i databasen, hvad hiver jeg det så ud som? String, int?
Avatar billede mikkelbm Nybegynder
11. december 2004 - 13:51 #14
" + etallerandet + "    == et tal (int, double, long)
'" + etallerandet + "'  == en tekst (String)


varchar == tekst == String
Avatar billede bagnavnet Nybegynder
11. december 2004 - 13:53 #15
Fremragende!
Mange tak for hjælpen, smid et svar.
Avatar billede mikkelbm Nybegynder
11. december 2004 - 13:53 #16
Der er dog et mindre problem i at bruge ovenstående, nemlig at du i den tekst du indsætter ikke må bruge tegn som ' da den vil forstyrre sql sætningen og databasen vil ikke kunne håndtere det.

Hvis du har brug for at indsætte tekster med ' skal du bruge det der hedder et PreparedStatement.

http://java.sun.com/j2se/1.4.2/docs/api/java/sql/PreparedStatement.html
Avatar billede mikkelbm Nybegynder
11. december 2004 - 13:53 #17
svar
Avatar billede bagnavnet Nybegynder
11. december 2004 - 13:54 #18
ok, tak. Jeg kigger nærmere på det.
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