热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL更新语句执行时出现异常!(在线等!~)

执行更行语句后的异常:你选择的客户ID号是:10,12发生异常:com.mysql.jdbc.MysqlDataTruncation:Datatruncation:Truncatedinc
执行更行语句后的异常:
你选择的客户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("
操作成功完成!~");}
           else{out.print("
删除操作失败!~");}

     }
catch(SQLException e){out.println("发生异常:"+e+"请联系网站管理员!~");}

另附:
String s_id="";
  if(){
   ....
   .......
   ....
   out.print("你选择的客户ID号是:"+s_id);
    }
请问这个异常可能是由什么原因引起的?解决的办法是?还有我写的PreparedStatement ps=con.prepareStatement(sql); 有没有问题?有的话请帮忙改正!~ 先行谢过!。

35 个解决方案

#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


引用 4 楼 ilrxx 的回复:
String sql="update test set  del='"+Y+"'where id in('"+s_id+"')";

我在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


引用 2 楼 chinmo 的回复:
Vbscript codeStringsql="update test set  del='Y'  where  id  in("+s_id+")";


#9


楼上的大哥竟然改成String sql="update test set  [del]='Y'  where  id  in("+s_id+")"; 哈哈!真有创意!你是学JSP的吗?哈哈!~ 


MYSQL我没具体用过,不知道del是否是保留字,如果是保留字,最好加[],当然如果不是,加了可能会出错
改 id  in("+s_id+")这个是没错的

#10


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

#11


姑且不管这个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
删除操作失败!~ 

#12



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

#13


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

#14


引用 13 楼 chinmo 的回复:
con.setAutoCommit(false);// 设置提交方式为程序控制 
如果不行 
改这个试试 
Connection con = null; 
PreparedStatement ps = null; 

呵呵!~  
不好意思,不行!~
con.setAutoCommit(false);// 设置提交方式为程序控制执行时报错!~

Connection con = null; 
PreparedStatement ps = null; 
  
加上之后照样报错!~
加不加null,初始化与否不影响结果。起码我这个JSP页面就这一句SQL语句要执行,没有影响。

#15


倒,没人讨论到重点

用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()

#16


我刚说的不规范:
加上:
Connection con = null; 
PreparedStatement ps = null;  
不会报错,就是:
你选择的客户ID号是:xxx,xxx 
删除操作失败!~ 


不知道为啥,自从我跟了"老紫竹"的一个回复后就没见他再回过我的帖子了!~
呵呵o(∩_∩)o...
或许我的问题有点幼稚,毕竟俺是初学者嘛!~
也或许我的话语有些过激,要是的话还请大家原谅.回复我的帖子就是关照我。我不该.....
请大家继续回帖。
谢了!~

#17


引用 15 楼 palm_civet 的回复:
倒,没人讨论到重点 

用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 t…

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

#18


execute不是你想想的那样的

如果执行的sql语句返回的是结果集返回true,如果是更新或者没有结果集返回false

ps.execute();
int unum = ps.getUpdateCount() ;
if(unum >= 1) out.print(" 
操作成功完成!~");} 
else if(unum == 0){out.print(" 
删除操作失败!~");} 

#19


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

读取期间 DataTruncation 的 SQLstate 为 01004。 

写入期间 DataTruncation 的 SQLstate 为 22001。 


 

#20


catch(SQLException e){
//加上下面的一句 贴出详细异常我们 好找一点.
e.printStatckTrace();


out.println("发生异常:"+e+"请联系网站管理员!~");



#21


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

读取期间 DataTruncation 的 SQLsta…


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

#22


引用 18 楼 palm_civet 的回复:
execute不是你想想的那样的 

如果执行的sql语句返回的是结果集返回true,如果是更新或者没有结果集返回false 

ps.execute(); 
int unum = ps.getUpdateCount() ; 
if(unum >= 1) out.print(" 
操作成功完成!~");} 
else if(unum == 0){out.print(" 
删除操作失败!~");} 

#23


建议你把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+"')";


#24


引用 23 楼 bsbbt 的回复:
建议你把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+"')"; 

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

结果不出我所料:
你选择的客户ID号是: 1010
删除操作失败!~ 

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

#25


楼主看完api没?

#26


看完了,我的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(" 
操作成功完成!~");} 
else if(unum == 0){out.print(" 
删除操作失败!~");} 
注释掉了,还是不行。

#27


引用 22 楼 palm_civet 的回复:
引用 18 楼 palm_civet 的回复:
execute不是你想想的那样的 

如果执行的sql语句返回的是结果集返回true,如果是更新或者没有结果集返回false 

ps.execute(); 
int unum = ps.getUpdateCount() ; 
if(unum >= 1) out.print(" 
操作成功完成!~");} 
else if(unum == 0){out.print(" 
删除操作失败!~");} 

加上这些以后,还是:
你选择的客户ID号是:10 
删除操作失败!~ 

#28


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

 这里的ps.execute()肯定返回false

#29


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

#30


            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 + " 条,可能由于数据库不存在某些记录");
            }

#31


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

我改成:
ps.execute(); 
if((ps.getMoreResults() == false) && (ps.getUpdateCount() == -1)){out.print(" 
操作成功完成!~");} 
else{out.print(" 
删除操作失败!~");} 

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

#32


再次谢谢28楼的大哥。
谢谢!~

#33


楼主好可爱

#34


这个错误是怎么产生的 又是怎么解决的呢?

#35


mysql 抛出了异常吧

推荐阅读
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • springboot启动不了_Spring Boot + MyBatis 多模块搭建教程
    作者:枫本非凡来源:www.cnblogs.comorzlinp9717399.html一、前言1、创建父工程最近公司项目准备开始重构,框 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文介绍了一个Python函数same_set,用于判断两个相等长度的数组是否包含相同的元素。函数会忽略元素的顺序和重复次数,如果两个数组包含相同的元素,则返回1,否则返回0。文章还提供了函数的具体实现代码和样例输入输出。 ... [详细]
  • HashMap的扩容知识详解
    本文详细介绍了HashMap的扩容知识,包括扩容的概述、扩容条件以及1.7版本中的扩容方法。通过学习本文,读者可以全面了解HashMap的扩容机制,提升对HashMap的理解和应用能力。 ... [详细]
  • 如何优化Webpack打包后的代码分割
    本文介绍了如何通过优化Webpack的代码分割来减小打包后的文件大小。主要包括拆分业务逻辑代码和引入第三方包的代码、配置Webpack插件、异步代码的处理、代码分割重命名、配置vendors和cacheGroups等方面的内容。通过合理配置和优化,可以有效减小打包后的文件大小,提高应用的加载速度。 ... [详细]
  • tcpdump 4.5.1 crash 深入分析
    tcpdump 4.5.1 crash 深入分析 ... [详细]
author-avatar
一线天24_226
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有