大过年的,多撒些分,参与就有分,呵,请教一个有点怪的问题。。。。

网络科技 2009-01-28 08:00:53
说明如下:
是关于执行数据库脚本时出现的,先看如下代码(主要):
public void execute(String sql) {
Connection conn = SqlConnection.getConnection();
Statement stmt = null;
try {
conn.setAutoCommit(false);
stmt = conn.createStatement();

stmt.addBatch(sql);
int[] rows = stmt.executeBatch();
System.out.println("rows :" + Arrays.toString(rows));

conn.commit();
conn.setAutoCommit(true);

} catch (Exception e) {
conn.rollback();
conn.setAutoCommit(true);
throw e;
} finally {
stmt.close();
conn.close();
}

}

脚本内容(一):
if exists(select * from TUser where userid = N'01')
begin
create table TUser
(
userid varchar(10),
userName varchar(50),
userAge varchar(4),
userAddress varchar(500)
)
end

脚本内容(二):
if not exists(select * from TUser where userid = N'01')
begin
create table TUser
(
userid varchar(10),
userName varchar(50),
userAge varchar(4),
userAddress varchar(500)
)
end

细心的朋友,应该知道,这第二个脚本就比前多一个"not"吧?
现在就取两个脚本的字符串内容,分别为:String sql1 和 String sql2,
现在分别执行:
execute(sql1);//此处执行成功,并任何异常
execute(sql2);//此处执行失败,控制台异常信息是:
Exception in thread "main" com.microsoft.jdbc.base.BaseBatchUpdateException: [Microsoft][SQLServer 2000 Driver for JDBC]Statements that produce result sets are not allowed in batch commands.
at com.microsoft.jdbc.base.BaseStatement.executeBatchEmulation(Unknown Source)
at com.microsoft.jdbc.base.BaseStatement.executeBatch(Unknown Source)
...

补充说明:两个脚本在查询分析器中执行均正常,由此可见第二个应该并非语法错误,sql2000也打开sp4补丁,我的jdk是1.6。
问题出来了,为何执行第二个会出现异常呢?请指教,若你没做过,估计很难靠经验解答,呵,若不相信会出错,那只好试试看了,应该不大可能是我系统问题吧?
...全文
377 52 打赏 收藏 转发到动态 举报
写回复
用AI写文章
52 条回复
切换为时间正序
请发表友善的回复…
发表回复
wtlm588 2011-12-19
  • 打赏
  • 举报
回复
期待答案
roadanglenc 2011-12-17
  • 打赏
  • 举报
回复
当年俺真是认真钻研的好学生哇,这么难的问题都看得出来:)
薪火华扬 2009-02-20
  • 打赏
  • 举报
回复
讨论那么多,没有最终的答案 , 谁给个最终回答
ZZSEEK 2009-01-31
  • 打赏
  • 举报
回复
我也来接分,呵呵,顶起来
zjb19870616 2009-01-30
  • 打赏
  • 举报
回复
路过而已
madelaop5566 2009-01-30
  • 打赏
  • 举报
回复
能力有限...........
帮顶~~ 新年快乐.
gmlwl 2009-01-30
  • 打赏
  • 举报
回复
友情支持一下.
网络科技 2009-01-30
  • 打赏
  • 举报
回复
多谢各位参与,应该是我数据库问题的了,就此结了...
老紫竹 2009-01-30
  • 打赏
  • 举报
回复
建议你更新到最新版的jdbc看看,微软网站有!
[SQLServer 2000 Driver for JDBC

你的应该是老版本的驱动! 找不到的话,用这个
http://www.laozizhu.com/view.jsp?articleId=474

记得Driver和URL都需要修改

微软的BUG报告地址如下:http://support.microsoft.com/kb/894555/zh-cn
zabaglione 2009-01-30
  • 打赏
  • 举报
回复
这个问题很可能是你先执行了第一个sql1,然后执行sql2,
可能有些编译后的东西被存贮到了DB上

你试验过sql2->sql1的执行顺序吗?
zhulin10541 2009-01-30
  • 打赏
  • 举报
回复
up,能力有限,呵呵
ljmscsq 2009-01-30
  • 打赏
  • 举报
回复
支持下
roadanglenc 2009-01-29
  • 打赏
  • 举报
回复
JDBC包的版本问题
如一宝宝 2009-01-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yoyo82 的回复:]
顶一下,顺便接分!!!
[/Quote]
只有引用的内容不允许回复!!
GkfSyser 2009-01-29
  • 打赏
  • 举报
回复

try {
conn.setAutoCommit(false);
stmt = conn.createStatement();

stmt.execute("SET NOCOUNT ON");//加上这句实验下

stmt.addBatch(sql);
int[] rows = stmt.executeBatch();
System.out.println("rows :" + Arrays.toString(rows));

Z8157522 2009-01-29
  • 打赏
  • 举报
回复
顶一下,对脚本还不是太熟悉
zk20052009 2009-01-29
  • 打赏
  • 举报
回复
不懂
帮顶
网络科技 2009-01-29
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 kelph 的回复:]
语法没错吧
跟有没有not 没关系

两个脚本建的表都是一样的,是不是第一个脚本建完表没drop,第二个表重复,所以create table失败??
[/Quote]

呵,怎么会犯这么低级的错误呢?当然不是表已存在的原因了,再说若是表重复,那错误提示应该是下面:
[Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]数据库中已存在名为 'TUser' 的对象。
at com.microsoft.jdbc.base.BaseStatement.executeBatchEmulation(Unknown Source)
at com.microsoft.jdbc.base.BaseStatement.executeBatch(Unknown Source)

的啊。
各位大虾花两分钟把我的代码实践一下看看啊,除非你是“绝顶高手”或者之前遇到我这种情情况,不然,可能比较难凭经验解答呢?我怀疑是我数据库或其它环境问题,若有实践过没有我这种情况的,那说明是我机器问题了。
zjb19870616 2009-01-29
  • 打赏
  • 举报
回复
不会 进来学习的
uastation 2009-01-29
  • 打赏
  • 举报
回复
我是贫穷...看来多来这啊..先顶上去..新年快乐..
加载更多回复(32)

62,617

社区成员

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

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