Java(Hibernate) 调用存储过程的怪异事

FBugFramework 2011-11-12 05:07:59
半个月前我发现了一个怪异的问题。

spname @intParam, @dateParam, @outputString

平时运行程序是正常的, 但某天我重装系统后,发现这个数据读不到。 断点调试后首次运行记得是报:NullPointException 错误, 我修改了源文件(字符串中加空格后再删空格),重新执行函数一切正常。

而这个问题今天部署到新机器后又出现了, 大家以前有碰到过如此怪异的问题吗?
...全文
210 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
FBugFramework 2011-11-17
  • 打赏
  • 举报
回复
我数据库是 sql2000, 用jtds驱动连接。

我也找不出问题在哪。 目前就是在那台机器上和我上次碰到过。 其他环境都是可以使用的。

暂时先不管了, 我撇开了使用那存储过程。

感谢magong。 结贴。
magong 2011-11-16
  • 打赏
  • 举报
回复
JDK, PreparedStatement
magong 2011-11-16
  • 打赏
  • 举报
回复
用了jtds driver?
magong 2011-11-16
  • 打赏
  • 举报
回复
我一直无法重演你的问题。

对了,你用什么数据库,什么版本?
magong 2011-11-16
  • 打赏
  • 举报
回复
并不需要写output。
估计你的存储过程写得有问题了。
FBugFramework 2011-11-16
  • 打赏
  • 举报
回复

csmt.execute();
resaultValue = csmt.getString(3);


取数据的时候抛异常啊: Output parameters have not yet been processed. Call getMoreResults().
提示 输出参数没有处理。 存储过程确认是有返回的: 输出参数 和 单值。

在java端,只能使用getMoreResults()后,获取rs取得。


再问下: "{call getdjno(@FAPPID=?, @FDJDATE=?, @outcode=?)}" 这样写对吗? 不需要加output?

"{call getdjno(@FAPPID=?, @FDJDATE=?, @outcode=? output)}" 结果是相同的。
FBugFramework 2011-11-15
  • 打赏
  • 举报
回复
你的文档是Hibernate的吗? 我记得JDK文档里好像没找到, 有段时间,不记得了.
FBugFramework 2011-11-15
  • 打赏
  • 举报
回复
这样啊, 谢谢先, 明天看看结果. 搞定了揭帖给分.
magong 2011-11-15
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 fbug 的回复:]
if (csmt.execute()) {
resaultValue = csmt.getString(3);
}

引用 11 楼 magong 的回复:

execute时一直返回false,所以取不到。打开rs后才有。等我去系统的了解一下java中一些类特性。 做时我参考网上的。 大家也帮忙看看。 谢谢了。
[/Quote]
API中这么说的:
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

返回false只是意味着没有返回结果集,出参总是有的吧,应该直接去取的。
FBugFramework 2011-11-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 magong 的回复:]

可能是存储过程第一次运行时返回结果和以后运行返回结果格式不一致造成的。

代码比较长,
有点奇怪的是,
楼主已经用出参得到了返回结果,为什么还要从resultset中再取一次结果呢?
[/Quote]
execute时一直返回false,所以取不到。打开rs后才有。等我去系统的了解一下java中一些类特性。 做时我参考网上的。 大家也帮忙看看。 谢谢了。
FBugFramework 2011-11-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wangquanzheng 的回复:]

异常呢,主要是贴代码和异常吧
[/Quote]
没记错的话异常就是上面贴的NonPointException。是在rs.next 后的get 时报的。
现在重现不了。
likgui 2011-11-14
  • 打赏
  • 举报
回复
看不出什么问题
magong 2011-11-14
  • 打赏
  • 举报
回复
可能是存储过程第一次运行时返回结果和以后运行返回结果格式不一致造成的。

代码比较长,
有点奇怪的是,
楼主已经用出参得到了返回结果,为什么还要从resultset中再取一次结果呢?
安心逍遥 2011-11-14
  • 打赏
  • 举报
回复
异常呢,主要是贴代码和异常吧
FBugFramework 2011-11-14
  • 打赏
  • 举报
回复
我的困惑是我系统重装后出现问题。 断点调试后就一直能执行。 而上周部署到新系统后一直取不到。

java 新手, 也许也和代码有关。 谢谢指正。
FBugFramework 2011-11-14
  • 打赏
  • 举报
回复
感谢大家关注。
我保证存储过程是每次都能够执行的。

附调用代码:


private Session session;
/**
* 生成单据号
* @param appId 应用程序编号
* @return 返回单据号
*/
public String autoGeneratePtyNO(int appId) {
String resaultValue = "";

Connection conn = this.createConnection();
try
{
conn.setAutoCommit(false);
CallableStatement csmt = conn.prepareCall("{call getdjno(@FAPPID=?, @FDJDATE=?, @outcode=?)}");

Date date= new Date(new java.util.Date().getTime());
csmt.setInt(1, appId);
csmt.setDate(2, date);
csmt.registerOutParameter(3, Types.VARCHAR);

if (csmt.execute()) {
resaultValue = csmt.getString(3);
}

csmt.getMoreResults();
ResultSet rs = csmt.getResultSet();

if (rs.next()) {
resaultValue = rs.getString(1);
}
else {
resaultValue = csmt.getString(3);
}

conn.commit();
}
catch (SQLException se) {
try
{
conn.rollback();
}
catch (Exception ex){
}
finally {
resaultValue = se.getMessage();
}
}
catch (Exception e) {
try
{
conn.rollback();
}
catch (Exception ex){
}
finally {
resaultValue = e.getMessage();
}
}
finally {
try
{
conn.close();
}
catch (Exception e) {
}
}

return resaultValue;
}

/**
* 构造函数
*/
public StoredProceduresBean() {

}

/**
* 取得当前数据库会话
*
* @return
*/
public Connection createConnection() {
if (session == null) {
session = HibernateSessionFactory.getSessionFactory()
.getCurrentSession();
}

return session.connection();
}
cscxxx 2011-11-13
  • 打赏
  • 举报
回复
没遇过找个不一样的hibernate包试试
hllfl 2011-11-13
  • 打赏
  • 举报
回复
没碰到
wingson_shen 2011-11-13
  • 打赏
  • 举报
回复
听起来挺神奇的。
magong 2011-11-13
  • 打赏
  • 举报
回复
嗯。贴代码看看。
加载更多回复(1)
随着计算机技术的不断深入发展以及三维动画制作软件的不断增加,人们越来越看重了三维动画技术,三维动画也逐渐成为发展的主流。 本文设计了一个名为《小镇异》的三维动画短片。设计从三维动画短片的视觉效果出发,对动画中所涉及的三维动画制作的方法进行了详细的阐述。基于三维动画短片的制作流程,文中主要介绍了动画短片的模型设计、材质和纹理制做、灯光特效以及后期处理方法等环节,其中着重说明了建模部分,包括片中的人物建模、场景建模和道具建模。结合该动画的特点,列出了适用于三维动画短片以及其后期处理的制作方法。通过3DSMAX建模工具、灯光设计、VRay渲染器和其他插件表现出动画的具体内容,通过动画设置、后期特效等技术的运用表现出良好的视觉传达效果。 主要内容和章节包括: 第一章, 绪论,主要介绍了本次设计的研究背景。 第二章, 讲述了三维软件与技术,包括三维动画制作软件3ds max和Maya,以及后期处理的软Adobe premiere,确立了本次设计所使用的软件组合。 第三章, 介绍本次三维动画的具体设计方案和制作步骤。 第四章, 讲述动画的后期处理问题。 第五章, 通过对这个动画的制作回顾,分析了这个短片的制作方面的不足和如何改进。 第六章,本次毕业设计的最后总结

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧