2016-04-03 4 views
0

Ich bin ein Anfänger in der Android-Entwicklung. Dies ist ein Teil meines Anmelde-Codes in meiner ersten Android-Studio-App: Der Code wird direkt nach der ersten Ausführungs-Abfrage-Zeile in den Fang-Code aufgenommen und führt meine zweite Abfrage nicht aus. Wenn ich die Datenbank überprüfe, wird ein Benutzer hinzugefügt, aber kein Fan.Code beenden versuchen und in den Fang nach dem ersten executeQuery gehen?

Irgendeine Idee warum? Jede Hilfe wird geschätzt.

try { 
     Connection con = connectionClass.CONN(); 
     if (con == null) { 
      z = "Error in connection with SQL server"; 
     } else { 
      Statement stmt = con.createStatement(); 
      String query1 = "INSERT INTO Usertb Values ('" + userid + "', '" + Password + "', '" + 1 + "')"; 
      stmt.executeQuery(query1); 
      String query = "INSERT INTO Fan Values ('" + FirstName + "', '" + LastName + "','" + Age + "', '" + Email + "', '" 
          + null + "', '" + i + "', '" + null + "')"; 
      rs = stmt.executeQuery(query); 
      if (rs.next()) { 
       z = "Sign Up successfull"; 
       isSuccess = true; 
      } 
     } 
    } catch (Exception ex) { 
     isSuccess = false; 
     z = "Exceptions"; 
    } 
+2

Ist es schwer zu sagen, ohne auf die Ausnahme/Fehler-Trace zu schauen. Bitte fügen Sie es in Ihre Frage ein. – user2004685

+0

@ user2004685 Ich habe keinen Fehler angezeigt es fängt nur eine Ausnahme und sagt nicht warum. – Christine

+1

Starten Sie die Protokollierung der Ausnahme oder drucken Sie sie zumindest auf der Konsole aus, um zu sehen, was in Ihrem "Fang" -Block vor sich geht. – user2004685

Antwort

1

Man muss executeUpdate (INSERT/UPDATE) anstelle von executeQuery verwenden.

String sql = "INSERT INTO Usertb(userid, passw, n) VALUES (?, PASSWORD(?), ?)"; 
    try (PreparedStatement stmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { 
     stmt.setString(1, userName); 
     stmt.setString(2, password); 
     stmt.setInt(3, 1); 
     int updateCount = stmt.executeUpdate(query1); // 1 when 1 record inserted 

     if (updateCount != 0) { 
      // If you want to use an autincrement primary key: 
      try (ResultSet rsKeys = stm.getGeneratedKeys()) { 
       if (rsKeys.next()) { 
        long id = rsKeys.getLong(1); 
       } 
      } 
     } 
    } // Closes stmt 

Außerdem ist es sehr wichtig, vorbereitete Anweisungen zu verwenden SQL-Injection- zu verhindern. Es kümmert sich auch um einfache Anführungszeichen und Backslash in den Strings.

Zusätzlich wird gezeigt, wie AUTOINCR-Felder verwendet werden, um einen datenbankgenerierten Schlüssel, z. B. für den zweiten INSERT, abzurufen.

Für die zweite Verwendung eine neue PreparedStatement.

Passwörter sollten besser verschlüsselt in der Datenbank gespeichert werden, sollte jemand die Daten stehlen. Sie könnten in dieses Thema schauen. Meine Lösung ist ziemlich minimal, suche nach Seeding und anderen Verschlüsselungsfunktionen.

+0

Ich habe versucht, executeQuery durch executeUpdate zu ersetzen, und prepared Anweisungen verwendet. Jetzt wird es nicht mehr zum Benutzer hinzugefügt und zeigt weiterhin sqlException. – Christine

+0

Kommentieren Sie die zweite Aussage. Wenn das funktioniert (wie Sie bereits gesagt haben), dann ist das Problem mit der zweiten Aussage. Diese Null wird wahrscheinlich nicht als solche funktionieren. Ein Stacktrace im Allgemeinen benennt den genauen Fehler. –

+0

Ich habe versucht, nur die erste Abfrage mit update und vorbereitete stmt und kommentierte die zweite.Es hat den Benutzer nicht zur Datenbank hinzugefügt und auch eine sqlException gezeigt. – Christine

Verwandte Themen