说明如下:
是关于执行数据库脚本时出现的,先看如下代码(主要):
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。
问题出来了,为何执行第二个会出现异常呢?请指教,若你没做过,估计很难靠经验解答,呵,若不相信会出错,那只好试试看了,应该不大可能是我系统问题吧?
是关于执行数据库脚本时出现的,先看如下代码(主要):
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。
问题出来了,为何执行第二个会出现异常呢?请指教,若你没做过,估计很难靠经验解答,呵,若不相信会出错,那只好试试看了,应该不大可能是我系统问题吧?
把以下两句:
stmt.addBatch(sql);
int[] rows = stmt.executeBatch(); 换为:stmt.execute(sql);
两个脚本都正常,有not无not均无异常。
很是郁闷啊。
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));
stmt.execute("SET NOCOUNT ON");//加上这句实验下
加了,问题如故.
跟有没有not 没关系两个脚本建的表都是一样的,是不是第一个脚本建完表没drop,第二个表重复,所以create table失败??
呵,怎么会犯这么低级的错误呢?当然不是表已存在的原因了,再说若是表重复,那错误提示应该是下面:
[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)的啊。
各位大虾花两分钟把我的代码实践一下看看啊,除非你是“绝顶高手”或者之前遇到我这种情情况,不然,可能比较难凭经验解答呢?我怀疑是我数据库或其它环境问题,若有实践过没有我这种情况的,那说明是我机器问题了。
只能判断表中有无记录,而不能判断表是否存在.if object_id('tUser','u') is null
begin
create table ....
end
只是这是另一种解决方案了!还是没有解释为何加not会出现异常呢?我判断表中有无记录,跟判断表是否存在没关系的啊,都是判断,我之前也是判断表是否存在,
是这样写的:if not exists(select * from sysobjects where id = object_id(N'TUser')) ...,问题如故,有not 还是出现异常,无not正常,这要如何
解释呢?
不过,还是很感谢你,不会少于50分奖你的啦
if not exists(select * from TUser where userid = N'01')
这个是判断TUser有无数据吧??还是判断此表是否存在???另外,create table 是DDL
当然,有些sqlserver 这个也可以rollback
很长时间没用sqlserver 了。
记不太清。你的错误应该与你的判断无关。你换一个系统试试在windows2000上试一下再说。
用JAVA在XP上操作sqlserver 有什么怪问题。
这个你不能按常理去推。你用的数据库是2000的,包用的2005的。
不过,我建议你在windows 2000下试一试,
那样的结果才能看出问题。
真是误会,再次说明一下:我本意就是判断表是否存在,但发帖时,为了方便,鬼使神差的变成了判断记录是否存在,但这不是问题所在啊,上文我已回复说明了,我换成判断表是否存在,有not时一样出现异常,是这样判断的:if not exists(select * from sysobjects where id = object_id(N'TUser')) ...
至于换个环境,现在正在考虑中...再换些时间吧,其实用25楼的判断方法,我实际问题是解决了,只是这个有not异常的问题,还是很困惑的...
可能有些编译后的东西被存贮到了DB上你试验过sql2->sql1的执行顺序吗?
[SQLServer 2000 Driver for JDBC你的应该是老版本的驱动! 找不到的话,用这个
http://www.laozizhu.com/view.jsp?articleId=474记得Driver和URL都需要修改微软的BUG报告地址如下:http://support.microsoft.com/kb/894555/zh-cn