2017-05-21 10 views
0

werfen Ich versuche herauszufinden, warum dieser Code eine SQL-Ausnahme auslöst. Wenn ich diesen Code ausführe, druckt es "Bad SQL in Kundeneinfügung ps", die die Nachricht in diesem inneren catch-Block ist. Ich habe mehrere vorbereitete Anweisungen mit solchen SQL-Einfügungen sowohl in dieser Klasse als auch anderswo in meiner Anwendung. Sie arbeiten alle gut. Ich habe das immer wieder durchgesehen und ich kann mir nicht vorstellen, warum dieser hier eine Ausnahme macht.SQL in vorbereitete Anweisung SQL-Ausnahme

try { 
       Connection conn = DBconnection.getConnection(); 
       PreparedStatement ps = conn.prepareStatement("SELECT customerId FROM customer WHERE customerName=\"" + name + "\";"); 
       System.out.println(ps.toString()); 
       ResultSet rs = ps.executeQuery(); 

       if (rs.next()) { 
        customerId = rs.getString("customerId"); 
       } 
       try { 

        PreparedStatement customerInsert = DBconnection.getConnection().prepareStatement("INSERT " 
          + "INTO customer (customerName, addressId, active, createDate, createdBy, lastUpdate, lastUpdateBy)" 
          + "VALUES(\"" + name + "\", " + addressId + ", " + active + ", UTC_TIMESTAMP(), \"" + LogInController.getUserName() + "\", UTC_TIMESTAMP(), \"" + LogInController.getUserName() + "\");"); 

        customerInsert.executeUpdate(); 

        System.out.println(customerInsert.toString()); 
        System.out.println(rs.toString()); 

       } catch (SQLException sq) { 
       System.out.println("Bad SQL in customer insert ps"); 
       } 

      } catch (SQLException customerIdException) { 
       System.out.println("Bad SQL in customer ps"); 
      } 

Antwort

1

Sie verwenden PreparedStatement, als ob Sie Statement verwendet haben. Setzen Sie die Parameter nicht in SQL, setzen Sie Platzhalter ? Markierungen. Dann nutzen Sie die verschiedenen setXyz Methoden (setString, setInt, etc.) in den Parametern zu füllen:

PreparedStatement customerInsert = DBconnection.getConnection().prepareStatement(
    "INSERT INTO customer (customerName, addressId, active, createDate, createdBy, lastUpdate, lastUpdateBy)" + 
        "VALUES(?, ?, ?, ?, ?, ?, ?);" 
); 
customerInsert.setString(1, name); 
customerInsert.setInt(2, addressId); 
// ...etc. Notice that the parameter indexes start with 1 rather than 0 as you might expect 
+0

Ich werde es versuchen. Ich habe andere Aussagen, die an anderer Stelle in meiner Klasse und meinem Programm ähnlich sind und die funktionieren. Ich bin mir nicht sicher, was das zugrunde liegende Problem hier ist. Wenn ich das mache und mein Problem behebt, bin ich glücklich und klicke auf das Häkchen. Vielen Dank! Ich bin etwas neu in StackOverflow. – aforbe2

+0

@ aforbe2: Keine Sorge, keine Eile. Wenn Sie andere haben, die in der Form sind, die Sie in Ihrer Frage gezeigt haben, ist es wichtig, sie zu aktualisieren, um das obige Formular zu verwenden, da die Art, wie der Code in der Frage geschrieben wird, ** weit geöffnet ist ** zu SQL-Injection-Angriffen. Keiner von uns möchte diesen Anruf tätigen: http://bobby-tables.com :-) –

+1

Ha ha, danke für den Comic. Das werde ich mir in Zukunft merken. Danke auch für die Freundlichkeit. Ich habe einige Entwickler auf SO gefunden, die ein wenig stachelig sein können. Ich weiß nicht, warum ich eine Ausnahme ausgelöst habe, aber deine Antwort behebt mein Problem und ich ändere alle meine anderen Anweisungen, um set-Methoden zu verwenden. – aforbe2

Verwandte Themen