说明如下:
是关于执行数据库脚本时出现的,先看如下代码(主要):
    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。
问题出来了,为何执行第二个会出现异常呢?请指教,若你没做过,估计很难靠经验解答,呵,若不相信会出错,那只好试试看了,应该不大可能是我系统问题吧?

解决方案 »

  1.   

    应该说得挺详细的,为了对比性,我再补充如下:
    把以下两句:
     stmt.addBatch(sql);    
     int[] rows = stmt.executeBatch(); 换为:stmt.execute(sql);
    两个脚本都正常,有not无not均无异常。
    很是郁闷啊。
      

  2.   


    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)); 
      

  3.   


    stmt.execute("SET NOCOUNT ON");//加上这句实验下
    加了,问题如故.
      

  4.   

    我用的是sql2005的sqljdbc.jar包,应该没问题吧
      

  5.   

    语法没错吧
    跟有没有not 没关系两个脚本建的表都是一样的,是不是第一个脚本建完表没drop,第二个表重复,所以create table失败??
      

  6.   


    呵,怎么会犯这么低级的错误呢?当然不是表已存在的原因了,再说若是表重复,那错误提示应该是下面:
    [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)的啊。
    各位大虾花两分钟把我的代码实践一下看看啊,除非你是“绝顶高手”或者之前遇到我这种情情况,不然,可能比较难凭经验解答呢?我怀疑是我数据库或其它环境问题,若有实践过没有我这种情况的,那说明是我机器问题了。
      

  7.   

    这样的语句逻辑是错误的,if (not) exists (.....)
    只能判断表中有无记录,而不能判断表是否存在.if object_id('tUser','u') is null
    begin
       create table ....
    end
      

  8.   

    我是觉得逻辑不对。因为没有环境,没办法测试。但是我觉得如果是要判断TUser是否存在,应该去先去查询系统表。sql server里好像是sysobjects表。
      

  9.   

    用你这种方法判断的话,问题是基本上解决了!
    只是这是另一种解决方案了!还是没有解释为何加not会出现异常呢?我判断表中有无记录,跟判断表是否存在没关系的啊,都是判断,我之前也是判断表是否存在,
    是这样写的:if not exists(select * from sysobjects where id = object_id(N'TUser')) ...,问题如故,有not 还是出现异常,无not正常,这要如何
    解释呢?
    不过,还是很感谢你,不会少于50分奖你的啦
      

  10.   

    if exists(select * from TUser where userid = N'01')   
    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下试一试,
    那样的结果才能看出问题。
      

  11.   


    真是误会,再次说明一下:我本意就是判断表是否存在,但发帖时,为了方便,鬼使神差的变成了判断记录是否存在,但这不是问题所在啊,上文我已回复说明了,我换成判断表是否存在,有not时一样出现异常,是这样判断的:if not exists(select * from sysobjects where id = object_id(N'TUser')) ...
    至于换个环境,现在正在考虑中...再换些时间吧,其实用25楼的判断方法,我实际问题是解决了,只是这个有not异常的问题,还是很困惑的...
      

  12.   

    这个问题很可能是你先执行了第一个sql1,然后执行sql2,
    可能有些编译后的东西被存贮到了DB上你试验过sql2->sql1的执行顺序吗?
      

  13.   

    建议你更新到最新版的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