2016-06-14 4 views
0

Ich benutze MySQL und beschlossen, meine eigene Datenbank Helper-Klasse, die mir Android-wie syntaktische SQL geben würde jedoch, wenn ich versuche, eine Update-Anweisung mit einem PreparedStatement, wenn ich den Code ausführe, findet keine Änderung in der Datenbank statt, aber es wird keine Ausnahme ausgelöst. Ich überprüfte meine Verbindungszeichenfolge, stellte sicher, dass meine .jars in Ordnung waren, dreifach prüfte meine Syntax, aber nichts. Code:java.sql.PreparedStatement.executeUpdate() funktioniert nicht mit MySQL-Datenbank

DatabaseHelper.java:

public class DatabaseHelper { 

String dbHost = "localhost"; 
String dbPort = "3306"; 
String dbName = "nakomangdb"; 
String dbUsername = "root"; 
String dbPassword = "sqldb"; 
String connectionString = "jdbc:mysql://" + dbHost + ":" + dbPort + "/" + dbName; 
Connection connection; 
PreparedStatement preparedStatement; 

public DatabaseHelper() { 
} 

public void closeDatabase() { 
    try { 
     if (!connection.isClosed()) 
      connection.close(); 
    } catch (SQLException ex) { 
     ex.printStackTrace(); 
    } 

} 

public void openDatabase() { 
    try { 
     Class.forName("com.mysql.jdbc.Driver"); 
     connection = DriverManager.getConnection(connectionString, dbUsername, dbPassword); 
     connection.setAutoCommit(true); 
    } catch (ClassNotFoundException | SQLException ex) { 
     ex.printStackTrace(); 
    } 
} 

public void update(String table, String[] set, Object[] to, String whereClause, Object[] whereArgs) { 
    StringBuilder sql = new StringBuilder("update "); 
    sql.append(table); 
    sql.append(" set "); 

    for (int i = 0; i < set.length; i++) { 

     sql.append(set[i]); 
     sql.append(" = ?"); 

     if (i != (set.length - 1)) { 
      sql.append(", "); 
     } 

    } 
    sql.append(" "); 

    int argCount = to.length; 

    try { 

     if (whereClause != null) { 
      sql.append(whereClause); 
      sql.append(";"); 

      preparedStatement = connection.prepareStatement(sql.toString()); 

      for (Object s : whereArgs) { 
       preparedStatement.setObject(argCount++, s); 
      } 

     } else { 

      sql.append(";"); 
      preparedStatement = connection.prepareStatement(sql.toString()); 

     } 

     argCount = 0; 

     for (Object s : to) { 
      preparedStatement.setObject(argCount++, s); 
     } 

     preparedStatement.executeUpdate(); 

     preparedStatement.close(); 

    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 

} 

} 

Telefonvorwahl:

protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 

    DatabaseHelper dbHelper = new DatabaseHelper(); 

    dbHelper.openDatabase(); 
    dbHelper.update("customer", 
      new String[]{"fullName"}, 
      new Object[]{"vernon"}, 
      "where ID=?", 
      new Object[]{1}); 
    dbHelper.closeDatabase(); 
    response.getWriter().append("Done!"); 
} 
+0

Haben Sie Ihr Serverprotokoll zu StackTrace überprüft? – DiogoSantana

+0

Ich habe gerade, und ich bekomme eine java.sql.SQLException: Parameter Index außerhalb des Bereichs (0 <1), was keinen Sinn macht, da argCount ist nie 0, ich überprüft, ist die Reihenfolge, in der die PrepaaredStatement.setXXX-Methoden sind Materie genannt? Muss ich unbedingt die Arg-Positionen 1,2,3 usw. in dieser Reihenfolge setzen, oder kann ich 3,4,1,2 setzen? – BiGGZ

+1

_ "argCount ist nie 0" _ - Entschuldigung, das ist falsch. 'argCount' wird auf Null initialisiert und' argCount ++ 'ist *** post *** Inkrement. –

Antwort

1

Parameterindex außerhalb des zulässigen Bereichs (0 < 1), die wegen argCount macht keinen Sinn ist nie 0

Oh ja ist es. Die Ausnahme lügt nicht.

Ich habe

überprüfen wieder. Lesen Sie Ihren Code. Ich zitiere:

argCount = 0; 

ist die Reihenfolge, in der die PrepaaredStatement.setXXX Methoden Materie genannt werden?

No.

muss ich streng Arg- Positionen 1,2,3 usw. in dieser Reihenfolge

No.

oder i 3 gesetzt , 4,1,2?

Ja.

Das Problem ist, dass argCount sollte initialisiert werden, um 1, nicht Null, oder Sie sollten ++argCount anstatt argCount++ verwenden.

Ihre Hilfsklasse wäre viel einfacher, wenn die Datenbank im Konstruktor geöffnet wäre. Sie können das Statement-bezogene Zeug auch an den Konstruktor übergeben und dort auch vorbereiten lassen.

autoCommit=true ist die Standardeinstellung. Die Class.forName() Zeile wurde seit 2007 nicht benötigt.

Verwandte Themen