Como tratar string para passar para select

Monto de forma dinamica uma select, o problema é que as vezes um dos campos string que montam a select vem com caracteres tipo ",’,(,), etc.
Como eu posso fazer para tratar esse string de forma que até esses caracteres sejam inseridos no banco sem danificar a minha select.

P.S.: eu não posso limitar a string pois em alguns casos ela precisa obrigatoriamente conter esses caracteres.

Use PreparedStatement.
Dessa forma é o driver JDBC que irá se preocupar com esses problemas, não você.

Mas eu estou usando o PreparedStatement, mas quando faço o execute() dá erro de select mal formada. Tipo faltando virgula, essas coisas.

Tem alguma coisa em especial para fazer no PreparedStatement?

[quote=petter]Mas eu estou usando o PreparedStatement, mas quando faço o execute() dá erro de select mal formada. Tipo faltando virgula, essas coisas.

Tem alguma coisa em especial para fazer no PreparedStatement?[/quote]

Vou colcar um exemplo para vc comparar com seu select , já que sem vê-lo fica difícil de te ajudar.
Um abraço.

Retirado de : http://java.sun.com/docs/books/tutorial/index.html

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

public class TransactionPairs {

  public static void main(String args[]) {

    String url = "jdbc:mySubprotocol:myDataSource";
    Connection con = null;
    Statement stmt;
    PreparedStatement updateSales;
    PreparedStatement updateTotal;
    String updateString = "update COFFEES "
        + "set SALES = ? where COF_NAME like ?";

    String updateStatement = "update COFFEES "
        + "set TOTAL = TOTAL + ? where COF_NAME like ?";
    String query = "select COF_NAME, SALES, TOTAL from COFFEES";

    try {
      Class.forName("myDriver.ClassName");

    } catch (java.lang.ClassNotFoundException e) {
      System.err.print("ClassNotFoundException: ");
      System.err.println(e.getMessage());
    }

    try {

      con = DriverManager.getConnection(url, "myLogin", "myPassword");

      updateSales = con.prepareStatement(updateString);
      updateTotal = con.prepareStatement(updateStatement);
      int[] salesForWeek = { 175, 150, 60, 155, 90 };
      String[] coffees = { "Colombian", "French_Roast", "Espresso",
          "Colombian_Decaf", "French_Roast_Decaf" };
      int len = coffees.length;
      con.setAutoCommit(false);
      for (int i = 0; i < len; i++) {
        updateSales.setInt(1, salesForWeek[i]);
        updateSales.setString(2, coffees[i]);
        updateSales.executeUpdate();

        updateTotal.setInt(1, salesForWeek[i]);
        updateTotal.setString(2, coffees[i]);
        updateTotal.executeUpdate();
        con.commit();
      }

      con.setAutoCommit(true);

      updateSales.close();
      updateTotal.close();

      stmt = con.createStatement();
      ResultSet rs = stmt.executeQuery(query);

      while (rs.next()) {
        String c = rs.getString("COF_NAME");
        int s = rs.getInt("SALES");
        int t = rs.getInt("TOTAL");
        System.out.println(c + "     " + s + "    " + t);
      }

      stmt.close();
      con.close();

    } catch (SQLException ex) {
      System.err.println("SQLException: " + ex.getMessage());
      if (con != null) {
        try {
          System.err.print("Transaction is being ");
          System.err.println("rolled back");
          con.rollback();
        } catch (SQLException excep) {
          System.err.print("SQLException: ");
          System.err.println(excep.getMessage());
        }
      }
    }
  }
} 

Cara, vi o exemplo mas o erro persiste, consegui localizar com clareza onde ele ocorre, em alguns momentos a minha string para montar a select vem com algumas palavras que usam apostrofo '. É isso que causa erro de mal formação na select.
O código que eu uso é isso:

package controleweb;

import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import jxl.Cell;
import jxl.NumberCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;



/**
 *
 * @author petter
 */
public class Recebidos {
    
    private static Connection conn;
    private static int i = 0;
    private static String stringa1;
    private static String stringb2;
    private static double douc3;
    private static String stringd4;
    private static String stringe5;
    private static String stringf6;
    private static String stringg7;
    private static String stringh8;
    private static String stringi9;
    private static String stringj10;
    private static String stringl11;
    private static int intm12;
    private static int resultado;
    private static String normalizeIP;
    private static int rs2;
    private static int rs3;
    
    public static String normalizeIP (String ip) throws UnknownHostException {
         InetAddress addr = InetAddress.getByName (ip);
         return addr.getHostAddress();
     }
  
    /**
     * Creates a new instance of Enviados
     */
    public static void main(String[] args ) throws IOException, BiffException, 
                                                   ClassNotFoundException, SQLException {
     
     //Dados para a conexão ao banco de dados
      String driverName = "oracle.jdbc.driver.OracleDriver";
      String serverName = "server"; 
      String username = "user"; 
      String password = "pass"; 
      String url = "jdbc:oracle:thin:@"+serverName ;
        
      //Conexão com o banco de dados        
      Class.forName(driverName);
      Connection conn = DriverManager.getConnection(url, username, password);
      
      //Pega o último valor do campo ID para auto-incremento
      Statement stm = conn.createStatement();
      ResultSet rs = stm.executeQuery("select max(ECO_ID) eco_id from email_controle");
      while(rs.next()){
       rs2 = rs.getInt("eco_id");
      }
      
      /* pega o arquivo do Excel */
      Workbook workbook = Workbook.getWorkbook(new File("recebidos.xls"));  
      
      /* pega a primeira planilha dentro do arquivo XLS */
      Sheet sheet = workbook.getSheet(0); 
     
      //Pega a quantidade de linhas da planilha
      int linhas = sheet.getRows();
      
      //Laço para fazer o looping para gravar todas as linhas da planilha
      for(i = 0; i < linhas; i++){
      /* pega os valores das células como se numa matriz */
      Cell a1 = sheet.getCell(0,i);
      Cell b2 = sheet.getCell(1,i);
      Cell c3 = sheet.getCell(2,i);
      Cell d4 = sheet.getCell(3,i);
      Cell e5 = sheet.getCell(4,i);
      Cell f6 = sheet.getCell(5,i);
      Cell g7 = sheet.getCell(6,i);
      Cell h8 = sheet.getCell(7,i);
      Cell i9 = sheet.getCell(8,i);
      Cell j10 = sheet.getCell(9,i);
      Cell l11 = sheet.getCell(10,i);

      /* pega os conteúdos das células */
      stringa1 = a1.getContents();
      stringb2 = b2.getContents();
      
      NumberCell nc = (NumberCell) c3;
      douc3 = nc.getValue();
      int intc3;
      intc3 = (int)douc3;
      
      stringd4 = d4.getContents();
      normalizeIP = normalizeIP (stringd4);
      
      stringe5 = e5.getContents();
      stringf6 = f6.getContents();
      stringg7 = g7.getContents();
      stringh8 = h8.getContents();
      stringi9 = i9.getContents();
      stringj10 = j10.getContents();
      stringl11 = l11.getContents();
      intm12 = 2;
      
      //Incrementa o número da ID conforme o último registro pesquisado
      if(rs2 < 1){
           rs2 = 1;
       }else{
           rs2 = rs2 + 1;
           
       System.out.println("Registro atual em gravação: " + i);
       }
      
     /*Executa o insert para inserir os dados no banco de testes MySQL*/     
     PreparedStatement ps = conn.prepareStatement("INSERT INTO EMAIL_CONTROLE(ECO_ID, ECO_DATA," +
          "                                                       ECO_HORA, ECO_TAM, ECO_DE," +
          "                                                       ECO_PARA, ECO_CC, " +
          "                                                       ECO_ASSUNTO, ECO_ANEXO, ECT_ID," +
          "                                                       ECO_IP) "+
             "VALUES('"+rs2+"', to_date('"+stringa1+"','DD/MM/YYYY'),'"+stringb2+"','"+intc3+"'" +
          "         ,'"+stringg7+"','"+stringh8+"','"+stringi9+"','"+stringj10+"','"+stringl11+"'" +
          "         ,'"+intm12+"','"+normalizeIP+"')");
         
     ps.executeUpdate(); 
     conn.commit();
     }
     workbook.close();
     
     rs3 = rs2 + i;
     
     //Gera mensagens com dados sobre a atualização do banco
     if(linhas == i){
         System.out.println("*******************************************************");
         System.out.println("*** Atualização de utilização de e-mail (recebidos) ***");
         System.out.println("*******************************************************");
         System.out.println("Banco de dados atualizado referente ao dia " + stringa1 + ".");
         System.out.println("Total de registros gravados: " + linhas + ".");
         System.out.println("Registros ID gravados de " + rs2 + " até " + rs3);
         System.out.println("Aplicativo finalizado !");
         System.out.println("");
     }
    }    
}

É o seguinte , vc não pode fazer sua qury de insert desta maneira ae.
Vc deve passar seus parametros value desta forma (?,?,?,?)
depois vc seta cada parametro desta forma
set.NomeParametro(valor);
Abaixo segue mais um exemplo.

PreparedStatement ps =

   con.prepareStatement("insert into VEHICLE " +

                   "(NAME, PRICE, CURRENCY) " +

                   "values (?, ?, ?)");

try {

   ps.setString (1, "VW Polo");

   ps.setInt(2, 15000);

   ps.setString(3, "EUR");

   ps.addBatch();

   ps.setString (1, "BMW 323");

   ps.setInt(2, 30000);

   ps.setString(3, "EUR");

   ps.addBatch();

...

   ps.executeBatch();

} finally {

   ps.close();

}

Modifica seu código e roda novamente.
Para vc usar da forma que vc está querendo precisa usar um statement assim…

try {
      con = DriverManager.getConnection(url, 
                   "myLogin", "myPassword");
      stmt = con.createStatement();              
      stmt.executeUpdate("insert into SUPPLIERS " +
                   "values(49, 'Superior Coffee', '1 Party Place', " +
         "'Mendocino', 'CA', '95460')");
      stmt.executeUpdate("insert into SUPPLIERS " +
        "values(101, 'Acme, Inc.', '99 Market Street', " +
        "'Groundsville', 'CA', '95199')");
      stmt.executeUpdate("insert into SUPPLIERS " +
                   "values(150, 'The High Ground', '100 Coffee Lane', " +
         "'Meadows', 'CA', '93966')");
      ResultSet rs = stmt.executeQuery(query);
      System.out.println("Suppliers and their ID Numbers:");
      while (rs.next()) {
        String s = rs.getString("SUP_NAME");
        int n = rs.getInt("SUP_ID");
        System.out.println(s + "   " + n);
      }
      stmt.close();
      con.close();
    } catch(SQLException ex) {
      System.err.println("SQLException: " + ex.getMessage());
    }

Se tiver alguma dúvida , dá uma lida aqui

Retirando o SQL do seu código Java
http://www.guj.com.br/java.tutorial.artigo.115.2.guj