2016-11-30 1 views
-1

Ich versuche zu lernen, wie man mit einer Datenbank in Java mit MySql arbeitet. Ich habe diesen Fehler:com.mysql.jdbc.MysqlDataTruncation: Datenabkürzung: Abgeschnitten inkorrekt DOUBLE-Wert: 'q'

was bedeutet, ich habe Typ Mismatch, aber ich kann nicht herausfinden, warum. Hier ist mein Code. Ich habe ResultSetMetaData eingefügt, um die Datentypen von Spalten anzuzeigen.

import java.sql.*; 

public class Prep { 
public static void main(String[] args) throws SQLException { 

    try { 

     Connection c=DriverManager.getConnection(host, username, password); 

     PreparedStatement pstmt=c.prepareStatement("update emp2211 set name=? where id=?"); 

     ResultSet rs = pstmt.executeQuery("Select * from emp2211"); 
     ResultSetMetaData rsmd= rs.getMetaData(); 

     System.out.println("Total columns: "+rsmd.getColumnCount()); 
     System.out.println("Column Name of 1st column: "+rsmd.getColumnName(1)); 
     System.out.println("Column Type Name of 1st column: "+rsmd.getColumnTypeName(1)); 
     System.out.println("Column Name of 2nd column: "+rsmd.getColumnName(2)); 
     System.out.println("Column Type Name of 2nd column: "+rsmd.getColumnTypeName(2)); 

     pstmt.setInt(1, 800); 
     pstmt.setString(2, "q"); 

     pstmt.executeUpdate(); 

     while(rs.next()){ 
      System.out.println(rs.getString(1)); 
      System.out.println(rs.getString(2)); 
     } 
     pstmt.close(); 
     c.close(); 

    } catch (Exception e) {   
     System.out.println(e); 
    } 


} 
} 

Das ist mein Ausgang

Total columns: 2 
Column Name of 1st column: id 
Column Type Name of 1st column: INT 
Column Name of 2nd column: name 
Column Type Name of 2nd column: VARCHAR 
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: 'q' 
+0

Sie sollten * * kein 'PreparedStatement' als reguläres' Statement' wiederverwenden. Erstellen Sie ein separates Statement-Objekt für den Aufruf executeQuery ("..."). – Andreas

+0

'Anweisung s = c.createStatement(); \t ResultSet rs = s.executeQuery ("Wählen * aus emp2211"); ' gefällt das? Muss ich jedes Mal ein Statement-Objekt erstellen, wenn ich 'executeQuery' aufrufen muss? – hrittwik

+0

Nein, aber der Aufruf von 'executeQuery' schließt alle vorherigen 'ResultSet' auf demselben [' Statement'] (https://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html) Objekt. Von javadoc: * Standardmäßig kann nur ein ResultSet-Objekt pro Statement-Objekt gleichzeitig geöffnet sein. [...] ** Alle Ausführungsmethoden in der Statement-Schnittstelle schließen implizit das aktuelle ResultSet-Objekt einer Anweisung, wenn eine offene existiert. **. * Ich war überrascht zu sehen, dass 'PreparedStatement.executeUpdate()' das nicht tat. Könnte vom Fahrer abhängig sein. – Andreas

Antwort

2

Sie sind ein String auf eine numerische Spalte Einstellung.

PreparedStatement pstmt=c.prepareStatement("update emp2211 set name=? where id=?"); 
... 
pstmt.setInt(1, 800);  
pstmt.setString(2, "q"); // the second ? is referred to id 

Wahrscheinlich müssen Sie Folgendes tun?

PreparedStatement pstmt=c.prepareStatement("update emp2211 set name=? where id=?"); 
... 
pstmt.setString(1, "q");  
pstmt.setInt(2, 800);  
1

versuchen diesen Code

import java.sql.*; 

public class Prep { 
public static void main(String[] args) throws SQLException { 

    try { 

     Connection c=DriverManager.getConnection(host, username, password); 

     PreparedStatement pstmt=c.prepareStatement("update emp2211 set name=? where id=?"); 

     ResultSet rs = pstmt.executeQuery("Select * from emp2211"); 
     ResultSetMetaData rsmd= rs.getMetaData(); 

     System.out.println("Total columns: "+rsmd.getColumnCount()); 
     System.out.println("Column Name of 1st column: "+rsmd.getColumnName(1)); 
     System.out.println("Column Type Name of 1st column: "+rsmd.getColumnTypeName(1)); 
     System.out.println("Column Name of 2nd column: "+rsmd.getColumnName(2)); 
     System.out.println("Column Type Name of 2nd column: "+rsmd.getColumnTypeName(2)); 

     //this is your error 
     pstmt.setString(1, "q"); 
     pstmt.setInt(2, 800); 
     pstmt.executeUpdate(); 

     while(rs.next()){ 
      System.out.println(rs.getString(1)); 
      System.out.println(rs.getString(2)); 
     } 
     pstmt.close(); 
     c.close(); 

    } catch (Exception e) {   
     System.out.println(e); 
    } 


} 
} 
+0

Erklärung würde die Antwort klären. – Andreas

+1

parameterIndex - der erste Parameter ist 1, der zweite ist 2, .wie dies zB: PreparedStatement pstmt = con.prepareStatement ("UPDATE MITARBEITER SET SALARY =? WHERE ID =?"); pstmt.setBigDecimal (1, 153833.00) pstmt.setInt (2, 110592) –