2016-11-30 17 views
-1

MySqlを使用してJavaでデータベースを操作する方法を学習しようとしています。私はこのエラーが発生しています:com.mysql.jdbc.MysqlDataTruncation:データ切り捨て:正しくないDOUBLE値の切り捨て: 'q'

これは、タイプの不一致を意味しますが、私は理由を理解できません。ここに私のコードです。 ResultSetMetaDataを使用して列のデータ型を表示しました。

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); 
    } 


} 
} 

これは、あなたが数値列にStringを設定している私の出力

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

を試してみてください。 'executeQuery(" ... ")'呼び出し用に別々の 'Statement'オブジェクトを作成してください。 – Andreas

+0

'ステートメントs = c.createStatement(); \t ResultSet rs = s.executeQuery( "Select * from emp2211"); ' のようなものですか? 'executeQuery'を呼び出す必要があるたびに' Statement'オブジェクトを作成しなければなりませんか? – hrittwik

+0

いいえ、しかし 'executeQuery'を呼び出すと、同じ[' Statement'](https://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html)上の以前の 'ResultSet'を閉じることになります。オブジェクト。 javadocから:*デフォルトでは、Statementオブジェクトごとに1つのResultSetオブジェクトしか同時に開くことができません。 [...] ** Statementインターフェース内のすべての実行メソッドは、現在のResultSetオブジェクトが現在のResultSetオブジェクトを暗黙的に閉じる** ** *ので、 'PreparedStatement.executeUpdate()'がそれをしなかったことに驚きました。ドライバに依存する可能性があります。 – Andreas

答えて

2

です。

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

おそらく次のものが必要ですか?

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

あなたは* *通常の `` Statement`としてPreparedStatement`を再利用してはならない、このコード

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

解説は解答を明確にします。 – Andreas

+1

parameterIndex - 最初のパラメータは1、2番目のパラメータは2、thisと同じです。PreparedStatement pstmt = con.prepareStatement( "UPDATE EMPLOYEES SET SALARY =?WHERE ID =?"); pstmt.setBigDecimal(1,153833.00) pstmt.setInt(2、110592) –

関連する問題