执行更行语句后的异常:
你选择的客户ID号是:10,12发生异常:com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: '10,12'请联系网站管理员!~ 用到的这张表的结构为:mysql> desc test;
+-------+---------------+------+-----+---------+-------+
| Field | Type          | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| del   | enum('N','Y') | YES  |     | N       |       |
| id    | int(10)       | NO   | PRI | 0       |       |
| cname | varchar(20)   | YES  |     | NULL    |       |
+-------+---------------+------+-----+---------+-------+
3 rows in set (0.09 sec)JSP页面更新语句:
Connection con;
PreparedStatement ps; 
try { 
Class.forName("com.mysql.jdbc.Driver");
String uri="jdbc:mysql://localhost:3306/deltest?characterEncoding=utf-8";
        con=DriverManager.getConnection(uri,"root","tdy218");
        String sql="update test set  del='Y'   where  id  in('"+s_id+"')"; //这一句应该是没问题的。       
           ps=con.prepareStatement(sql);
           if(ps.execute()){out.print("<br>操作成功完成!~");}
           else{out.print("<br>删除操作失败!~");}     }
catch(SQLException e){out.println("发生异常:"+e+"请联系网站管理员!~");}另附:
String s_id="";
  if(){
   ....
   .......
   ....
   out.print("你选择的客户ID号是:"+s_id);
    }
请问这个异常可能是由什么原因引起的?解决的办法是?还有我写的PreparedStatement ps=con.prepareStatement(sql); 有没有问题?有的话请帮忙改正!~ 先行谢过!。

解决方案 »

  1.   

     String sql="update test set  del='Y'  where  id  in('"+s_id+"')"; 
    改为
     String sql="update test set  [del]='Y'  where  id  in('"+s_id+"')"; 
    呢???
      

  2.   

    String sql="update test set  del='Y'  where  id  in("+s_id+")"; 
      

  3.   

    String sql="update test set  [del]='Y'  where  id  in("+s_id+")"; 
      

  4.   

     String sql="update test set  del='"+Y+"'where id in('"+s_id+"')";
      

  5.   

    按照你说的(String sql="update test set  [del]='Y'  where  id  in("+s_id+")"; )改后:
    你选择的客户ID号是:12,18
    发生异常:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[del]='Y' where id in('12,18')' at line 1请联系网站管理员!~ 还有String sql="update test set  del='Y'  where  id  in('"+s_id+"')"; 是正确的!~
    改成:String sql="update test set  [del]='Y'  where  id  in(‘+s_id+’)"; 或者
    String sql="update test set  [del]='Y'  where  id  in(‘s_id’)"; 都会提示:
    你选择的客户ID号是:xxx,xxx
    删除操作失败!~ 

    楼上的大哥竟然改成String sql="update test set  [del]='Y'  where  id  in("+s_id+")"; 哈哈!真有创意!你是学JSP的吗?哈哈!~我还是把问题归结到数据类型的问题上!~
    网上搜com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value:这句异常好多英文的解释。中文的网站上没有答案。
      

  6.   

    我在MySQL客户端处执行:
    update test set  del='Y'where id in(201,302); 是正确的!~
    mysql> update test set  del='Y'where id in(201,302);
    Query OK, 2 rows affected (0.03 sec)
    Rows matched: 2  Changed: 2  Warnings: 0
    忘了说了!~ Y不是变量。不用加"+s_id才是变量!~
      

  7.   

    我刚把这个表的id字段换了数据类型,原来是int.刚把它换成varchar类型了。不会报那个com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value:异常了
    但提示:
    你选择的客户ID号是:xxx,xxx 
    删除操作失败!~ 

    在想改成int类型的,就会报错:
    1265-Data truncated for column 'id' at row 1
    请问这又是为何?
      

  8.   

    楼上的大哥竟然改成String sql="update test set  [del]='Y'  where  id  in("+s_id+")"; 哈哈!真有创意!你是学JSP的吗?哈哈!~ 
    MYSQL我没具体用过,不知道del是否是保留字,如果是保留字,最好加[],当然如果不是,加了可能会出错
    改 id  in("+s_id+")这个是没错的
      

  9.   

    String sql="update test set  del='Y'  where  id  in("+s_id+")";
      

  10.   

    姑且不管这个SQL语句,这句应该没问题。
    无论是:
    String sql="update test set  del='Y'  where  id  in("+s_id+")";
    还是:
    String sql="update test set  del='Y'  where  id  in('"+s_id+"')"; 
    输出的结果都是:
    你选择的客户ID号是:12,18
    删除操作失败!~ 
      

  11.   


                con.setAutoCommit(false);// 设置提交方式为程序控制
    加上这个呢
      

  12.   

    如果不行
    改这个试试
    Connection con = null; 
    PreparedStatement ps = null; 
      

  13.   

    呵呵!~  
    不好意思,不行!~
    con.setAutoCommit(false);// 设置提交方式为程序控制执行时报错!~Connection con = null; 
    PreparedStatement ps = null; 
      
    加上之后照样报错!~
    加不加null,初始化与否不影响结果。起码我这个JSP页面就这一句SQL语句要执行,没有影响。
      

  14.   

    倒,没人讨论到重点用executeUpdate() 或者public int getUpdateCount()
    public boolean execute()
                    throws SQLExceptionExecutes the SQL statement in this PreparedStatement object, which may be any kind of SQL statement. Some prepared statements return multiple results; the execute method handles these complex statements as well as the simpler form of statements handled by the methods executeQuery and executeUpdate. 
    The execute method returns a boolean to indicate the form of the first result. You must call either the method getResultSet or getUpdateCount to retrieve the result; you must call getMoreResults to move to any subsequent result(s). 
    Returns:
    true if the first result is a ResultSet object; false if the first result is an update count or there is no result 
    Throws: 
    SQLException - if a database access error occurs or an argument is supplied to this method
    See Also:
    Statement.execute(java.lang.String), Statement.getResultSet(), Statement.getUpdateCount(), Statement.getMoreResults()
      

  15.   

    我刚说的不规范:
    加上:
    Connection con = null; 
    PreparedStatement ps = null;  
    不会报错,就是:
    你选择的客户ID号是:xxx,xxx 
    删除操作失败!~ 
    不知道为啥,自从我跟了"老紫竹"的一个回复后就没见他再回过我的帖子了!~
    呵呵o(∩_∩)o...
    或许我的问题有点幼稚,毕竟俺是初学者嘛!~
    也或许我的话语有些过激,要是的话还请大家原谅.回复我的帖子就是关照我。我不该.....
    请大家继续回帖。
    谢了!~
      

  16.   

    那该杂改呀?英文的不太明白。
    我注释掉了:
    if(ps.execute()){out.print("<br>操作成功完成!~");}
    else{out.print("<br>删除操作失败!~");}
    还是一样.
    你选择的客户ID号是:xxx,xxx 
    删除操作失败!~ 
      

  17.   

    execute不是你想想的那样的如果执行的sql语句返回的是结果集返回true,如果是更新或者没有结果集返回falseps.execute();
    int unum = ps.getUpdateCount() ;
    if(unum >= 1) out.print(" <br>操作成功完成!~");} 
    else if(unum == 0){out.print(" <br>删除操作失败!~");} 
      

  18.   

    我刚查了API:
    1.java.sql.PreparedStatement类的解释是:
    boolean execute() 在此 PreparedStatement 对象中执行 SQL 语句,该语句可以是任何种类的 SQL 语句。
    2.java.sql.DataTruncation类的解释是:
      以 DataTruncation 异常形式抛出的异常(写入时),或者由于除数据值超出 MaxFieldSize 之外的某种原因意外地截断该数据值时以 DataTruncation 警告形式报告的异常(读取时)。 读取期间 DataTruncation 的 SQLstate 为 01004。 写入期间 DataTruncation 的 SQLstate 为 22001。 
     
      

  19.   

    catch(SQLException e){
    //加上下面的一句 贴出详细异常我们 好找一点.
    e.printStatckTrace();
    out.println("发生异常:"+e+"请联系网站管理员!~");

      

  20.   


    第一条,楼上说的没错,但是请吧boolean execute()方法的说明看完,重点看他返回值的定义,你的api没的话看我上面的回帖,官方网站上复制下来的
      

  21.   

    建议你把s_id先转换为整形 int id=Integer.parseInt(s_id);然后SQL语句为:
    String sql="update test set  del='Y'  where  id  in("+id+")";
    或者String sql="update test set  del='Y'  where  id  in('"+id+"')";
      

  22.   

    不行!~ 理论上就不行!~
    我还是相信事实,所以我还是加上:
    int id=Integer.parseInt(s_id);
    out.print(id);

    结果不出我所料:
    你选择的客户ID号是:1010
    删除操作失败!~ 看见了吧?
    我本来选择的id 是 10,一转后就错误了。
    你选择的客户ID号是:12,18 
    删除操作失败!~
    这些数字之间是由"," 号隔开的。
      

  23.   

    看完了,我的API版本是JDK 6.0 中文版。
    execute
    boolean execute()
                    throws SQLException在此 PreparedStatement 对象中执行 SQL 语句,该语句可以是任何种类的 SQL 语句。一些预处理过的语句返回多个结果,execute 方法处理这些复杂的语句,executeQuery 和 executeUpdate 处理形式更简单的语句。 
    execute 方法返回一个 boolean 值,指示第一个结果的形式。必须调用 getResultSet 或 getUpdateCount 方法获取该结果,必须调用 getMoreResults 获取任何后续结果。 
    返回:
    如果第一个结果是 ResultSet 对象,则返回 true;如果第一个结果是更新计数或者没有结果,则返回 false 
    抛出: 
    SQLException - 如果发生数据库访问错误;在关闭的 PreparedStatement 上调用此方法,或者为此方法提供了参数。但还是不知道杂用。
    必须调用 getResultSet 或 getUpdateCount 方法获取该结果,必须调用 getMoreResults 获取任何后续结果。 
    还有  我干脆把
    if(unum >= 1) out.print(" <br>操作成功完成!~");} 
    else if(unum == 0){out.print(" <br>删除操作失败!~");} 
    注释掉了,还是不行。
      

  24.   

    1.先看看数据库里面的值有没有变
    2.检查你的sql语句是否有问题,用System.out.println()输出,放到数据库里执行
    3.这个你看完api应该已经知道了
              if(ps.execute()){out.print(" <br>操作成功完成!~");} 
              else{out.print(" <br>删除操作失败!~");} 
     这里的ps.execute()肯定返回false
      

  25.   

    SQL 改成这个的话没有问题的啊,我试过了
    String sql = "UPDATE test SET del = 'Y' WHERE id IN (" + str + ")";
    组成 SQL 后是:
    UPDATE test SET del = 'Y' WHERE id IN (2,4,6)
    这个 SQL 是正确的而你开始的那个
    String sql = "update test set  del='Y'  where  id  in('"+s_id+"')";
    组成 SQL 后是:
    UPDATE test SET del = 'Y' WHERE id IN ("2,4,6")这种样子怎么可能对呢?
    测试代码:import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;public class MysqlTest {
        
        public static void main(String[] args) {
            String str = "2,4,6";
            MysqlTest mysql = new MysqlTest();
            mysql.update(str);
        }
        
        public void update(String str) {
            Connection con = null;
            PreparedStatement ps = null;
            try {
                con = getConnection();
                String sql = "UPDATE test SET del = 'Y' WHERE id IN (" + str + ")";
                ps = con.prepareStatement(sql);
                ps.execute();
            }catch(SQLException e) {
                e.printStackTrace();
            }finally{
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }    static {
            try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        
        private Connection getConnection() throws SQLException {        
            String url = "jdbc:mysql://localhost:3306/test";
            String username = "root";
            String password = "";
            return DriverManager.getConnection(url, username, password);
        }
    }
      

  26.   

                con = getConnection();
                String sql = "UPDATE test SET del = 'Y' WHERE id IN (" + str + ")";
                ps = con.prepareStatement(sql);
                int n = ps.executeUpdate();            int len = str.split(",").length;
                if(n <= 0) {
                    System.out.println("没有发生更新");
                }else if (n == len) {
                    System.out.println("全部更新");
                }else{
                    System.out.println("不完全更新,更新了 " + n + " 条,可能由于数据库不存在某些记录");
                }
      

  27.   

    成功了!~
    呵呵,激动呀!~  从上午10点到现在。一直在弄这个问题。午饭还没吃那!~  
    不过问题解决了比什么都强。它困饶我三四天了!~
    一会就出去好好吃点东西去。嘿嘿!~
    楼上的大哥,谢谢你的启发。要不是你反复强调execute()的问题。我还一直以为是数据类型的异常那!~
    不过我又参照
    PreparedStatement从接口 java.sql.Statement 继承的方法:那一栏也有一个:getUpdateCount(),
    无意识的点了一下,居然发现了一个秘密。里边的有的例子 使我解决了这个问题。我改成:
    ps.execute(); 
    if((ps.getMoreResults() == false) && (ps.getUpdateCount() == -1)){out.print(" <br>操作成功完成!~");} 
    else{out.print(" <br>删除操作失败!~");} 

    就OK了!~
    我会在我的博客中写篇文章。题目暂时保密。预计这两天旧可以写完。我先出去玩会,晚上回来整理一下代码。计划明天写出来。
    我相信做JSP的你看过绝对没有白看。就像这些异常和上面那句我在Google上搜搜。就没发现解决的办法。updatedata false这个倒是不少。但就是我上面写的那个判断语句网上(中文网页)网上还没有,或许有我没搜到吧。
    激动的说了这么多话。大家见笑了!~
    呵呵!~
    送大家一句话(引用别人的):学习Java就像挂QQ,坚持下去会看到太阳的。