webForumDet fria alternativet

Sql connection

4 svar · 364 visningar · startad av Choronzon

ChoronzonMedlem sedan aug. 20011 346 inlägg
#1

Kan nån förklara för mig varför det bara fungerar i det första av kodexemplen? Det andra genererar NullpointerException vid den fetmarkerade raden.. Något jag inte förstår, eftersom dom gör exakt samma sak..

import java.sql.*;

public class HelloMySQL {
    Connection connection;
    private void displaySQLErrors(SQLException e) {
        System.out.println("SQLException: " + e.getMessage());
        System.out.println("SQLState:     " + e.getSQLState());
        System.out.println("VendorError:  " + e.getErrorCode());
    }
    
    public HelloMySQL() {
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            System.out.println("Driver loaded");
        } catch (Exception  e) {
            System.err.println("Unable to find and load driver");
            System.exit(1);
        }
    }
    
    public void connectToDB() {
        try {
            Connection connection = null;
            String url = "jdbc:mysql://localhost/cbbook";
            String user = "cbuser";
            String password = "cbpass";
            connection = DriverManager.getConnection(url, user, password);
            System.out.println("Connected");
            Statement statement = connection.createStatement( );
            statement.executeQuery("SHOW TABLES");
            ResultSet rs = statement.getResultSet( );
            while (rs.next( ))
                System.out.println(rs.getString(1) + "<br />");
            rs.close( );
            statement.close( );
            connection.close( );
            System.out.println("Connection closed");
        } catch(SQLException e) {
            displaySQLErrors(e);
        }
    }
    
    public static void main(String[] args) {
        HelloMySQL hello = new HelloMySQL();
        hello.connectToDB();
    }
}
    \----------------------------------------------------------------
import java.sql.*;

public class HelloMySQL {
    Connection connection;
    private void displaySQLErrors(SQLException e) {
        System.out.println("SQLException: " + e.getMessage());
        System.out.println("SQLState:     " + e.getSQLState());
        System.out.println("VendorError:  " + e.getErrorCode());
    }
    
    public HelloMySQL() {
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            System.out.println("Driver loaded");
        } catch (Exception  e) {
            System.err.println("Unable to find and load driver");
            System.exit(1);
        }
    }
    
    public void connectToDB() {
        try {
            Connection connection = null;
            String url = "jdbc:mysql://localhost/cbbook";
            String user = "cbuser";
            String password = "cbpass";
            connection = DriverManager.getConnection(url, user, password);
            System.out.println("Connected");
        } catch(SQLException e) {
            displaySQLErrors(e);
        }
    }
    
    public void executeSQL() {
        try {
            [b]Statement statement = connection.createStatement();[/b]
            statement.executeQuery("SHOW TABLES");
            ResultSet rs = statement.getResultSet( );
            while (rs.next()) {
                System.out.println(rs.getString(1) + "<br />");
            }
            rs.close( );
            statement.close( );
            connection.close( );
        } catch(SQLException e) {
            displaySQLErrors(e);
        }
    }
    
    public static void main(String[] args) {
        HelloMySQL hello = new HelloMySQL();
        hello.connectToDB();
        hello.executeSQL();
    }
}
ViktorMedlem sedan aug. 20021 752 inlägg
#2

Tråd flyttad från "Java 2 Enterprise Edition".

/Viktor

ViktorMedlem sedan aug. 20021 752 inlägg
#3

Du deklarerar två variabler med samma namn, dels connection för klassen och sedan en till connection för funktionen connectToDB. När du sedan tilldelar variabeln connection ett värde i connectToDB så är det den lokala variabeln som tilldelas ett värde och inte klass variabeln som hela tiden är null. För att specificera att du vill använda klass variabeln och inte den lokala så skriver du this framför,

public void connectToDB() {
        try {
            Connection connection = null;
            String url = "jdbc:mysql://localhost/cbbook";
            String user = "cbuser";
            String password = "cbpass";
            [b]this.[/b]connection = DriverManager.getConnection(url, user, password);
            System.out.println("Connected");
        } catch(SQLException e) {
            displaySQLErrors(e);
        }
    }

men nu tror jag inte att det är det som du vill så det lättaste för dig är att du bara tar bort din lokala deklaration av variabeln och låter klass variabeln vara kvar,

public void connectToDB() {
        try {
            String url = "jdbc:mysql://localhost/cbbook";
            String user = "cbuser";
            String password = "cbpass";
            connection = DriverManager.getConnection(url, user, password);
            System.out.println("Connected");
        } catch(SQLException e) {
            displaySQLErrors(e);
        }
    }

så ska det nog fungera sen :)

/Viktor

LimeMedlem sedan sep. 2001961 inlägg
#4

Utom att det är fult och innefektivt att göra sådär om man inte gör en disconnect också när man är klar med klassen.

Om man inte vill hålla på och skapa och släppa connections så är det bättre att skapa en ConnectionPool.

Sedan vill jag också tipsa om, eftersom det ser ut som om du är lite newbie på databaser, att så fort som möjligt börja använda dig av PreparedStatement istället för bara Statement. Effektivare, skapar färre fel och mer portabelt mellan databashanterare.

Hatar databaser idag... Blev tvungen att göra en konvertering för att få sökningen på nya produktnummer att fungera på vår offline-applikation. Det är iofs bra men det tråkiga är att det tar 12 timmar att generera om det... och nästa release skall göras 18.00 ikväll...

ChoronzonMedlem sedan aug. 20011 346 inlägg
#5

Tack ska ni ha, det tar sig ..:)

Viktor; this funkade ju fint!

Lime skrev:

Utom att det är fult och innefektivt att göra sådär om man inte gör en disconnect också när man är klar med klassen.

Om man inte vill hålla på och skapa och släppa connections så är det bättre att skapa en ConnectionPool.

Sedan vill jag också tipsa om, eftersom det ser ut som om du är lite newbie på databaser, att så fort som möjligt börja använda dig av PreparedStatement istället för bara Statement. Effektivare, skapar färre fel och mer portabelt mellan databashanterare.

..

Vill du får du väldigt gärna förklara lite närmare, ang. disconnect och connectionPool skulle uppskattas!

Jo, kommer nog alltid känna mig som en newbie känns det som. Man skrapar lite här och där, men sammanhanget uteblir. Hoppas att det inte blir så den här gången. Ska kolla in PreparedStatements! Tack :)

129 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)