Comment ne pas ajouter un produit qui existe déja dans une BDD

hina-hina Messages postés 3 Date d'inscription mercredi 11 mars 2015 Statut Membre Dernière intervention 6 mai 2015 - 15 mars 2015 à 10:51
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 15 mars 2015 à 12:15
Bonjour,

j'ai crée une application en utilisant Java Eclipse avec une base de données sous SqlServer.

Lorsque j''insère un produit ou ce dernier existe déjà dans ma base de données il s'ajoute, même si j'utilise le code cité ci-dessous:

Connection connect=null;
System.out.println("-> Chargement du driver");
try {

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
System.out.println(" Driver Chargé\n");

System.out.println("-> Connexion à la base de données");
connect=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;" +
"databaseName=BDD_gestion;user=sa;password=java;");
System.out.println(" Connexion réussie");

state=connect.createStatement();
result=state.executeQuery("select code_produit from produit where code_produit="+t_cod_prod.getText());

if(!t_design.getText().equals("")){
try {
JOptionPane.showMessageDialog(null, " Produit déja saisie. ", "Avertissement", JOptionPane.WARNING_MESSAGE);

} catch (Exception e3) {
e3.printStackTrace();
}

}

}

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 127
15 mars 2015 à 12:15
Bonjour,

1) La concaténation de String sur une requête ça peut faire n'importe quoi.

Exemple : si dans ton label t_cod_prod tu tapes "toto" ça va faire :
select code_produit from produit where code_produit=toto

La requête va planter parce que "toto" n'est pas un identifiant connu.

Pire : dans ton label t_cod_proj je mets
"0; DROP TABLE produit;"
ça fait :
select code_produit from produit where code_produit=0;
DROP TABLE produit;

La requête sur le select va bien passer, celle du drop aussi, et toute ta table va être supprimée...

2) Le code que tu donnes n'utilises pas du tout le résultat de la requête, du coup même si ta requête fonctionnait, ça te permet pas de vérifier quoi que ce soit...

3) La requête peut-être améliorée pour que la recherche s'arrête dès le premier résultat trouvé, par défaut sinon elle va tout parcourir, et comme j'imagine que tu n'as pas d'index, ça va être long.

4) N'oublies pas de fermer les connexions aux bases de données avec les méthodes close, sinon tu vas avoir une fuite de ressources.

5) Réorganises ton code en classes méthodes séparées, tu ne devrait pas avoir dans une même méthode tout qui se mélange comme tu le fais.

Voici ce que ça pourrait donner en codant proprement (je n'ai rien testé)

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DatabaseAccess {

    private static final String DB_DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    private static final String DB_HOST = "localhost:1433";
    private static final String DB_NAME = "BDD_gestion";
    private static final String DB_USER = "sa";
    private static final String DB_PASS = "java";

    private static final String DB_URL = "jdbc:sqlserver://" + DB_HOST + ";" + "databaseName=" + DB_NAME + ";" + "user=" + DB_USER + ";" + "password=" + DB_PASS + ";";

    private static final String TABLE_PRODUCT = "PRODUIT";
    private static final String COLUMN_CODE = "CODE_PRODUIT";

    public static void initDriver() {
        try {
            Class.forName(DB_DRIVER);
        } catch (Exception e) {
            throw new IllegalStateException("Driver not loaded", e);
        }
    }

    private static void closeAll(AutoCloseable... toClose) {
        if (toClose == null)
            return;
        for (AutoCloseable closeable : toClose) {
            try {
                if (closeable != null)
                    closeable.close();
            } catch (Exception e) {
                System.err.println(e);
            }
        }
    }

    private static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(DB_URL);
    }

    private static boolean checkIfExist(String table, String column, int value) throws SQLException {
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;

        String sql = "SELECT TOP 1 " + column + " FROM " + table + " WHERE " + column + "=?";

        try {
            conn = getConnection();
            stmt = conn.prepareStatement(sql);
            stmt.setInt(1, value);
            rs = stmt.executeQuery();
            return rs.first() && rs.getInt(1) == value && !rs.wasNull();
        } finally {
            closeAll(conn, stmt, rs);
        }
    }

    public static boolean checkIfProductCodeExist(int code) throws SQLException {
        return checkIfExist(TABLE_PRODUCT, COLUMN_CODE, code);
    }
}

import javax.swing.JLabel;
import javax.swing.JOptionPane;

public class Test {

    private JLabel t_design = null;

    private static void message(String title, String content, int type) {
        JOptionPane.showMessageDialog(null, content, title, type);
    }

    public static void warning(String content) {
        message("Warning", content, JOptionPane.WARNING_MESSAGE);
    }

    public static void error(Exception e) {
        e.printStackTrace();
        message("Error", e.toString(), JOptionPane.ERROR_MESSAGE);
    }

    public void toto() {
        
        String text = t_design.getText();

        int code = -1;

        try {
            code = Integer.parseInt(text);
        } catch (NumberFormatException e) {
            error(e);
            return;
        }

        try {
            boolean exist = DatabaseAccess.checkIfProductCodeExist(code);
            if (exist)
                warning("Code already exist: " + code);
        } catch (Exception e) {
            error(e);
        }
    }
}

Remarque : Lorsque tu mets un code sur le forum, utilises les balises de coloration syntaxique <code java></code> comme je l'ai fait.
1
Rejoignez-nous