今天发现一个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,从而后面的获取返回值是永远没机会运行。
上面的分析正确与否还望大侠分析指导,谢谢。
分享到:
相关推荐
本示例将深入讲解如何在VB.NET中调用存储过程,包括参数传递、接收返回值、处理存储过程中的错误以及控制流程。 首先,我们需要创建一个连接到SQL Server数据库的对象。这可以通过`SqlConnection`类实现,提供...
如果存储过程没有返回值,可能需要检查输出参数。 5. **关闭资源**:在完成数据库操作后,记得关闭`Connection`、`CallableStatement`和`ResultSet`对象,以避免资源泄露。 注意,如果你的存储过程使用了用户定义...
在Python编程中,调用MySQL数据库的存储过程并获取返回值是常见的操作,尤其是在执行复杂的数据库操作时。这里我们将详细探讨如何使用Python的`MySQLdb`库来完成这个任务。 首先,确保你已经安装了`MySQLdb`库,...
### JAVA调用存储过程知识点详解 #### 一、无结果集返回的存储过程调用 在Java中调用不返回结果集的存储过程时,主要步骤包括建立连接、准备调用语句、设置输入参数、执行存储过程以及处理可能产生的警告信息。 1...
本篇将详细解释一个具体的示例,通过VB6.0来调用一个名为`ADOTestRPE`的存储过程,并测试其返回值、输入参数以及输出参数。 #### 一、准备工作 为了实现这个功能,我们需要准备以下几个组件: 1. **连接对象**:...
本示例将讲解如何在C#应用程序中调用存储过程获取返回值,并利用这些值在DataGridView控件中实现数据的批量删除操作。 首先,我们需要在数据库(如SQL Server)中创建一个存储过程,例如名为`usp_BatchDelete`。这...
本文实例讲述了C#调用存储过程的方法。分享给大家供大家参考,具体如下: CREATE PROCEDURE [dbo].[GetNameById] @studentid varchar(8), @studentname nvarchar(50) OUTPUT AS BEGIN SELECT @studentname=...
Java调用存储过程是数据库操作中的常见需求,特别是在需要高效执行多条SQL语句或封装复杂业务逻辑时。存储过程是预编译的数据库代码片段,可在数据库服务器上执行,减少了网络通信次数,提升了系统性能。Java通过...
在VB.NET中调用MySQL存储过程并获取返回值是一个常见的任务,这有助于提高数据库操作的效率和代码的可维护性。下面将详细讲解这个过程,以及涉及到的相关知识点。 首先,要建立与MySQL数据库的连接。这通常通过创建...
在Java编程中,`java.lang.StackOverflowError` 是一个常见的运行时异常,它通常发生在程序执行过程中,当Java虚拟机(JVM)的调用栈溢出时。调用栈是每个线程用来存储方法调用信息的数据结构,当递归调用过深或者...
现在我们来看一个更复杂的例子——带返回值的存储过程。例如,假设我们有一个存储过程用来更新用户的密码,并返回一个错误代码。 ```sql CREATE PROCEDURE dbo.AXzhz /* 更新密码的参数说明 */ @password nvarchar...
首先,`java_error_in_idea64.hprof`是Java heap dump文件,它包含了JVM在某个时间点的所有对象及其内存分配情况的详细信息。这种文件格式是Java Profiling Format(Hprof)的标准,可以用于分析内存泄漏、对象生命...
为了解决这个问题,我们需要确保在同一个会话中获取存储过程的所有返回值。在PHP中,可以使用`multi_query`函数来执行多条SQL语句,这样可以确保所有的查询都在同一个数据库连接中执行,从而保证变量的正确性。以下...
在Java编程环境中,如Eclipse 3.3,与数据库进行交互是常见的需求,而调用SQL Server存储过程是其中一种高效的操作方式。存储过程是预编译的SQL语句集合,可以封装复杂的业务逻辑,提高性能并降低网络流量。本篇文章...
在Java编程中,调用数据库中的存储过程是常见的任务,特别是在需要执行复杂业务逻辑或批量操作时。存储过程是预编译的SQL语句集合,它们可以提高性能、封装复杂逻辑并提供更好的安全性。以下是一个详细的步骤,展示...
总结来说,解决PHP调用存储过程返回值不一致问题的关键在于正确管理和控制MySQL的会话,确保相关操作在同一会话内完成。通过使用`multi_query()`,我们可以确保输出参数的值在所有调用中保持一致。对于其他涉及跨...
在使用IntelliJ IDEA(简称Idea)进行Java开发时,有时会遇到“Error:java: Compilation failed: internal java compiler error”的错误提示,这通常意味着编译过程中遇到了内部错误,可能是由于配置问题、环境问题...
但是在启动项目的时候,控制台报错如下:error:java: 无 效 的 源 发 行 版 : 10。脑残审核,你告诉我哪个是广告??? 问题分析 报错了java的版本问题,看到这个错误应该就能很快的想到是因为java的j d k版本依赖...
在Java编程中,与MySQL数据库进行交互是常见的任务,其中涉及到的一个高级特性就是操作存储过程。存储过程是预编译的SQL语句集合,可以包含条件判断、循环等控制流语句,提供了一种更高效、更安全的方式来执行数据库...