《数据库应用程序开发随笔三》

这篇解决任务七。

任务七

理解

任务七的题目是修改“任务5”的程序,进行异常处理,要求以对话框的形式提示所有的违反约束、类型不匹配、溢出等操纵类错误。

主要的要求有三个,需要实现:1,违反约束(非空列置空);2,溢出(比如说salary列溢出的处理);3,类型不匹配(比如说EDLEVEL列需要输入数字,但是我们输入了字符型的数据)。

这部分其实不难,主要就是用SQLException.getErrorCode()方法得到对应的SQLCode,根据SQLCode值的不同作不同的处理即可。

正文

主要就是说一下我做的时候的一些错误。

首先最开始我是想修改单行插入这个功能,增加一个异常处理,但是由于我单行插入(前几篇文章已经提及)使用的是14个TextField,输入的值默认按文本处理,我当时认为这样可能不对(因为我当时的尝试感觉文本怎么也无法转换到Short或者Date),所以我把这个界面又改成了JTable(和多行插入一样的样式),然后进行下一步。

后来由于我使用的是PreparedStatement,但是我输入一些异常值的时候它没有给我返回SQLCODE,而是其他错误(如下图),总是给我“AWT-EventQueue-0”的错误,然后错误位置是Date或者Short等位置,或者错误位置直接是pstmt.executeUpdate。

总是这样我不知道怎么解决,所以我又改成了Statement。(类似于下图的错误,但是错误的原因多种多样,我当时忘记截图了)

在Statement这个过程中,我是使用提前设定好变量然后在sqlStmt里面使用(如下图)

扫描二维码关注公众号,回复: 15261333 查看本文章

 !!!!这一部分有一个很大的坑,使用statement的时候那些变量旁边必须要有单引号’’,否则不管怎么搞都会出错,但是如果加上单引号,我那些变量就变成了’null’,怎么插入数据库表都是错的。

这个方式总是出错,不仅是完成不了异常处理,就算是我输入一些正常的值,它还是会不断出错。出错的地方总是Date和Short这几个变量。经过思考,我发现不能简单的将这几个变量设为null(这样的话总是会出现一个SQLCODE=-433的错误,因为我直接把“null”放进数据库表里面了),而是使用setnull才对。所以我搞了半天我又变回了之前的PreparedStatement,然后对于表的每一列数据我都手动判断是否为空,如果为空的话就使用setnull方法置对应的空即可。

这样的话我目前输入正确的值终于可以正常插入到数据库表中了。现在尝试输入一些错误的值:

图暂不上传

终于可以出现不同的SQLCODE了,但是如果我EDLEVEL输入的是字符型数据,给出的错误却很奇怪,我个人猜测是由于

pstmt.setShort(9,Short.parseShort((String)defaultTableModel1.getValueAt(0, 8)));无法从String转换到Short导致的错误。

现在就简单了,我根据不同的SQLCode弹出不同的对话框即可。具体代码在此不赘述。

总结

这部分其实不难,主要难到我的就是它这个最开始由于我个人设置的原因,SQLCode总是得不到,总是报其他的错误,经过大量纠正试错之后我才改好。真是学到了许多。

猜你喜欢

转载自blog.csdn.net/linwuwu985/article/details/128500415