今天发现一个java取不到sqlserver存储过程返回值的问题,由此对我们平时自认为很不错的写法产生了怀疑,到底哪种方式才是对的?还是一开始我们就是错的?还是我们有时候考虑问题真的是太过了?
好,废话不多讲,直接进入正题,(为了把问题重现,我把代码都简化了,)我们先看java代码:
try{
……
stmt = dbconnect.prepareCall("{call SP_****(?,?)}");//调用存储过程
……
stmt.execute();//执行存储过程
String Msg=stmt.getString(1);//获取返回值
System.out.println("你羡慕"+Msg+"吗?");
……
}catch(Exception ex){
System.out.println("穿越了:(");
……
}finally{
……
}
上面代码是jdbc调用sqlserver存储过程的写法,标准不标准希望有人能告诉我,在此不胜感激。好,我们暂且放下java代码,看下存储过程的关键内容:
exec('select * from 一个不存在的表')
if @@error<>0 return '犀利哥'
在我们的想法中,存储过程已经把错误的结果给catch了,返回一个'犀利哥'给我们,这个程序会得到一句:
你羡慕犀利哥吗?
可事实是什么?打印结果是:
穿越了:(
当然上面这个仅仅只是一个示例,而现实中有那么一些存储过程是根据不同情况返回不同的值,我们会根据不同的值来做不同的事,放到代码中就是if Msg怎么怎么样然后怎么怎么样,可是我们真的能获取吗?事实放在眼前,不能获取!
出现了这种问题我们就要来仔细分析问题出在哪边,首先看存储过程,稍微修改下,变成这样:
exec('select * from 一个不存在的表') if @@error<>0 print '犀利哥'
运行之:
服务器: 消息 208,级别 16,状态 1,行 1
对象名 '一个不存在的表' 无效。
犀利哥
犀利哥出现了,好,很好,至少说明数据库把error给抓到了,既然能抓到,那我前面没改前return语句的返回应该也是返回了,那为什么程序运行不成功?我们在来看存储过程出现的结果,前两句是一个数据库错误信息,是不是这个数据库错误信息造成了java的异常?
我也没时间去看java源码,也没心情去了解数据库驱动实现,因为里面的水可能很深很深,简单起见,我把执行存储过程的语句给直接catch掉吧,于是代码变成了:
try{
……
stmt = dbconnect.prepareCall("{call SP_****(?,?)}");//调用存储过程
……
try{stmt.execute();}catch(Exception ex){}//执行存储过程
String Msg=stmt.getString(1);//获取返回值
System.out.println("你羡慕"+Msg+"吗?");
……
}catch(Exception ex){
System.out.println("穿越了:(");
……
}finally{
……
}
运行之,结果出来了。简单分析一下,在我的理解中程序是这么运行的,存储过程执行到错误的地方会首先返回错误信息,然后返回设定的值;而java程序在获得结果集,或者说在运行的时候发现了数据库错误,就直接跳向catch,从而后面的获取返回值是永远没机会运行。
上面的分析正确与否还望大侠分析指导,谢谢。
分享到:
相关推荐
本文实例讲述了C#调用存储过程的方法。分享给大家供大家参考,具体如下: CREATE PROCEDURE [dbo].[GetNameById] @studentid varchar(8), @studentname nvarchar(50) OUTPUT AS BEGIN SELECT @studentname=...
一、调用存储过程(无结果集返回) Connection connection = ConnectionHelper.getConnection(); CallableStatement callableStatement = connection.prepareCall("{ call procedureName(?,?) }"); ...
解决java.lang.StackOverflowError
$_FILES[‘file’][‘error’]值 UPLOAD_ERR_OK: 0 //正常,上传成功 UPLOAD_ERR_INI_SIZE: 1 //上传文件大小超过服务器允许上传的最大值,php.ini中设置upload_max_filesize选项限制的值 UPLOAD_ERR_FORM_SIZE: 2 /...
本文实例讲述了Python调用MySQL存储过程并获得返回值的方法。分享给大家供大家参考。具体实现方法如下: try: conn = MySQLdb.connect ( host = 'localhost', user = 'root', passwd = 'pass', db = 'prod', ...
idea中解决Error:java: Compilation failed: internal java compiler error的问题
但是在启动项目的时候,控制台报错如下:error:java: 无 效 的 源 发 行 版 : 10。脑残审核,你告诉我哪个是广告??? 问题分析 报错了java的版本问题,看到这个错误应该就能很快的想到是因为java的j d k版本依赖...
MySQL存储过程 ERROR Handler 异常处理
常用的java处理 网络JAVA的基本知识 和报错的处理方法
GetLastError返回值,详细描述GetLastError返回值的意义
实用开发工具Myeclipse,在启动tomcat时,不间断的会弹出 An internal error occurred during: "Calculating completion proposals...". java.lang.NullPointerException的错误对话框!
java代码-LinkedListDome.java:8: error: cannot find symbol
今天小编就为大家分享一篇关于IntelliJ IDEA报错Error:java: Compilation failed: internal java compiler error的解决办法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来...
NULL 博文链接:https://yanxiaojia.iteye.com/blog/1469035
实施公司 sap b1 9.2存储过程 --------------------------------------------------------【1】物料主数据--------------------------------------------------------- ------------------------1.1物料主数据中默认...
java script error 问题最终解决 description:语法错误 see more details?
oom溢出来的dump文件,可以作为学习使用呢,使用其他工具进行分析哪里问题
NULL 博文链接:https://dingherry.iteye.com/blog/1545972