2013-02-14 3 views
3

Je suis nouveau sur java. Je veux insérer le chemin de fichier choisi de FileChooser dans la base de données. Mais quand j'essaie de le faire, le chemin est correct jusqu'à l'instruction de requête, et après l'avoir entré dans la base de données, il supprime toutes les barres obliques inverses présentes dans le chemin du fichier.Insérer le chemin du fichier dans la base de données supprime

filepath=f.getCanonicalPath(); 
// some database statements.... 
String query="insert into table1 values('" + filepath + "')"; 

Si mon chemin de fichier choisi est:

"C: \ users \ documents \ hello.txt";

Il insère comme:

"C: Usersdocumentshello.txt"

+1

pouvez-vous nous montrer plus de votre code? Je crois que l'utilisation de 'StringEscapeUtils.escapeSql' ou du bon code prepare/bind/execute java résoudrait votre problème. – Najzero

+1

@Najzero: Vous ne devriez pas avoir à * échapper * quelque chose si vous utilisez le SQL paramétré de manière appropriée. –

+1

@JonSkeet c'est correct. Changé à ou - et lier/paramétrer les requêtes est le moyen préféré - modifier, cela manque une référence de tables bobby. – Najzero

Répondre

9

Fondamentalement, vous ne devriez pas mettre votre valeur directement dans SQL comme ça.

Vous devez utiliser PreparedStatement et définir le paramètre avec votre valeur. Aucune échappée requise, et aucun risque d'attaques par injection SQL.

String query = "insert into table1 values(?)"; 

PreparedStatement statement = connection.prepareStatement(query); 
try { 
    statement.setString(1, filePath); 
    statement.executeUpdate(); 
} finally { 
    statement.close(); 
} 

Tout vous vous trouvez temps de construction SQL dynamiquement en fonction de l'entrée utilisateur, vous devez faire un pas en arrière et fortement considérer paramétrées SQL à la place. (L'exception étant si votre application est fondamentalement un outil de développement SQL ...)

+0

Jon Skeet J'utilise mysql donc, PreparedStatement montre son paquet sous java.sql – sincerekamal

+1

@ user2057804: Le paquet 'java.sql' est l'interface JDBC commune que le pilote MySQL va prendre en charge. Utiliser MySQL n'est * pas * une raison pour ne pas utiliser PreparedStatement. –

+0

Merci à tous pour les réponses immédiates. Mes remerciements spéciaux à [Najzero] (http://stackoverflow.com/users/1563305/najzero) pour m'avoir fait connaître ** StringEscapeUtils ** qui m'a aidé enfin, ce qui est facile aussi. :) – sincerekamal

Questions connexes