Avatar billede hotmoller Nybegynder
17. marts 2004 - 19:10 Der er 10 kommentarer

Problemer med sql fra java

Hej eksperter.

Jeg har lavet et java-program der connecter til en database (access). Jeg ønsker herefter at køre nogle updates, hvorved jeg vha. af sql-sætninger opretter tabeller og indsætter værdier.
Mit problem er at jeg ikke rigtig kan få dette til at spille. Jeg har held til at oprette en tabel i kontruktøren på min database-klasse, men når jeg efterfølgende kalder min update-metode der skal indsætte værdier, sker der ingenting.

Søg efter '@', så finder i hurtigt mine executeUpdates.

Endvidere vil jeg høre, om man børe åben og lukke forbindelsen til databasen for hvert execute.

mvh/ hotmoller

Min kode ser ud som følger:

// klasse DatabaseConnection

import java.sql.*;

public class DatabaseConnection{
   
   
    private Statement s;
    private Connection con;
   
    public DatabaseConnection(){
   
        //4. Load JDBC-ODBC-driveren
        try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

            //5. opret forbindelse til databasen "myDB" (myDB er navnet på datakilden og altsaa ikke navnet på access-filen)
            con= DriverManager.getConnection("jdbc:odbc:myDB");

            //create Statement object
            s= con.createStatement();

            //create table chatUsers
            s.executeUpdate(
           
                    "CREATE TABLE chatUsers" +
                    "(userName varchar(15));"
                           
       
        /*            "CREATE TABLE chatUsers"+
                    "(userName varchar(15)," +
                    "name varchar(15)," +   
                    "sirName varchar(15), " +
                    "passWord varchar(15))"*/
                       
            );                   



                        // @ dette insert virker
            s.executeUpdate("INSERT INTO chatUsers VALUES('dres');");
           

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
   
    }

    // *************************************************************
    //  execute update
    // *************************************************************
   
    public void writeUserInfo(String userName, String name, String sirName, String passWord){
           
        try {
           
            s = con.createStatement(); // byg et nyt statement             
                          // @ dette insert virker ikke
            s.executeUpdate("INSERT INTO chatUsers VALUES('hans');"); // , 'Andreas' , 'Holst' , 'heps'); ");        //'" + name + "','" + sirName + "','" + passWord + "');");
            con.commit(); // sikre commit
       
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
   
    }
   
    // *************************************************************
    //  execute query
    // *************************************************************
   
    public void getUserInfo(String userName, String name, String sirName, String passWord){
       
    /*    //hent rækkerne og udskriv dem på skærmen
        ResultSet rs;
        try {
            rs = s.executeQuery("SELECT * FROM vare");
       
            while (rs.next()){
                           
                int nr= rs.getInt("nr");
                String navn= rs.getString("navn");
                System.out.println(nr+ " "+ navn);
           
            }
           
        }catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    */
    }           

   
    // *************************************************************
    //  closes DB [TODO. ikke sikker på om man skal åbne og lukke
    //     forbindelsen for hvert execute. Hvis ja, da gør metode private]
    // *************************************************************

    public void closeCon(){
   
        // kan ikke huske hvor tit man skal åbne og lukke forbindelsen
        try {
            con.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
   
    }
   

}

//---------------------------------

// klasse TestDBConnection

public class TestDBConnection {

    public static void main(String[] args) {
       
        DatabaseConnection dc = new DatabaseConnection();
       
        dc.writeUserInfo("atom", "Andreas", "Holst", "hepshey");
   
    }
}
Avatar billede riversen Nybegynder
17. marts 2004 - 20:26 #1
prøv s.close() når du har foretaget det du skal.
Avatar billede hotmoller Nybegynder
17. marts 2004 - 20:50 #2
hej riversen.

Kan jeg få dig til at præcisere ?

Har prøvet at placere efter jeg har lavet mine updates hhv. i konstruktøren og i metoden.

Jeg kan ikke finde close() i api'et for klassen Statement, hvor kommer denne fra?!

tak!
Avatar billede riversen Nybegynder
17. marts 2004 - 21:04 #3
close() ligger i java.sql.Statement interfacet.
Avatar billede hotmoller Nybegynder
17. marts 2004 - 21:13 #4
Jeg er en småkage.

Jeg vil gerne have dig til at præcisere hvor du vil placere close() henne i koden - da det ikke virker for mig.

mht. hvor close er placeret henne i api'et, så har jeg kun kigget i klassen Statement og ikke i interfacet (småkage^2)
Avatar billede riversen Nybegynder
17. marts 2004 - 21:41 #5
klassen Statement har ikke noget med sql at gøre :-)

s.close() som sidste linie i din konstruktør fx.
Avatar billede riversen Nybegynder
17. marts 2004 - 21:50 #6
// @ dette insert virker
            s.executeUpdate("INSERT INTO chatUsers VALUES('dres');");


går ud fra dette ikke virker jf. din forklaring i spørgsmålet, selvom kommentaren siger, at det virker.
Avatar billede hotmoller Nybegynder
17. marts 2004 - 22:01 #7
Hej riversen.

Jeg er da alt for upræcis i dag.

Det burde have fremgået at mit "executeUpdate" virker i konstruktøren, men ikke virker nede i metoden "writeUserInfo". Dette forstår jeg ikke.

Jeg beklager at jeg roder sådan i det :|
Avatar billede arne_v Ekspert
17. marts 2004 - 23:49 #8
con.commit() skal nok ikke være der da du default kører med auto commit.

Man plejer ikke at angive semikolon.

Får du en exception ? Hvis ja - hvilken ?

Nej - du skal absolut ikke lukke connection for hvert statement.
Avatar billede hotmoller Nybegynder
18. marts 2004 - 00:15 #9
Hej arne.

Nu har jeg fået det til at virke nogenlunde. Jeg vil dog gerne have dig til at præcisere, hvornår jeg skal hhv. åbne og lukke forbindelsen, hvadenten det er for Connection eller mit Statement.

Jeg tror jeg er nået frem til, hvad det er der har ligget til grund for forvirringen. Hvis jeg skriver en række værdier til databasen fra programmet, så kan jeg ikke se den sidste værdi der er skrevet.

F.eks. forsøger jeg mig med:

        dc.writeUserInfo("a", "d", "e", "h");
        dc.writeUserInfo("b", "c", "f", "g");
        dc.writeUserInfo("c", "c", "f", "g");
        dc.writeUserInfo("d", "c", "f", "g");

  |
  -- > og kan så kun se følgende resultat i databasen efterfølgende:

userName name    sirName    passWord
a      d    e      h
b      c    f      g
c      c    f      g

Har du en forklaring på dette????

Jeg har trimmet mit program til følgende:

import java.sql.*;

public class DatabaseConnection{
   
   
    private Statement s;
    private Connection con;
   
    public DatabaseConnection(){
   
        //4. Load JDBC-ODBC-driveren
        try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

            //5. opret forbindelse til databasen "myDB" (myDB er navnet på datakilden og altsaa ikke navnet på access-filen)
            con= DriverManager.getConnection("jdbc:odbc:myDB");

            //create Statement object
            s = con.createStatement();
            //create table chatUsers
            s.executeUpdate(
           
                    "CREATE TABLE chatUsers"+
                    "(userName varchar(15)," +
                    "name varchar(15)," +   
                    "sirName varchar(15), " +
                    "passWord varchar(15))"
                       
            );                   
   
            s.close();

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
   
    }
   
    public void writeUserInfo(String userName, String name, String sirName, String passWord){
           
        try {
           
            s = con.createStatement(); // byg et nyt statement
            //s.executeUpdate("INSERT INTO chatUsers VALUES('hans');"); // , 'Andreas' , 'Holst' , 'heps'); ");        //'" + name + "','" + sirName + "','" + passWord + "');");
            //s.executeUpdate("insert into chatUsers values('hans', 'Andreas' , 'Holst' , 'heps');");        //'" + name + "','" + sirName + "','" + passWord + "');");
           
            String updateString = "insert into chatUsers values('"+ userName + "' , '" + name + "' , '" + sirName + "' , '" + passWord + "');";
           
           
            System.out.println(updateString);
           
            s.executeUpdate(updateString);
           
           
           
            // test
            s.close();
       
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
   
    }
   
    // *************************************************************
    //  execute query
    // *************************************************************

    public static void main(String[] args) {
   
        DatabaseConnection dc = new DatabaseConnection();
   
        // test
           
        dc.writeUserInfo("a", "d", "e", "h");
        dc.writeUserInfo("b", "c", "f", "g");
        dc.writeUserInfo("c", "c", "f", "g");
        dc.writeUserInfo("d", "c", "f", "g");
    }
}
Avatar billede arne_v Ekspert
18. marts 2004 - 07:09 #10
Ikke umiddelbart.

Prøvt evt at kalde con.close() når du er færdig.

For en single treaded applikation åbner du connection ved start
og lukker til slut.
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