1.单纯从这部分代码看不出什么问题,tmpStr执行了什么查询语句?
2.采用多线程来执行。

解决方案 »

  1.   

    (1)tmpstr是一个select count(*) form tb
    (2)能不能有一个示例.我手边没有合适的书
      

  2.   

    select count(*) form tbform-->from
      

  3.   

    建议使用prparedstatement或statement
      

  4.   

    找本有介绍jdbc的书,上面例子多的是
      

  5.   

    (1)RS执行一次会自动消亡,连续使用自然是不可能了
    (2)建议用:while(rs.next())
    {
      .....
    }
    这样就行了
      

  6.   

    while(rs.next())
    {
      .....
    }
      

  7.   

    for(i=0;i<=10000;i++)
    {
       lable.settext("正在处理第"+ i+"条记录!");
       rs = dbTarget.ExecuteQuery(
                tmpStr
                );//执行sql
    ....
       rs.close;
    }
    你是不是要执行10000次的查询呀?
    而且在你第一次执行后,rs就被关闭了,所以你第二次循环就会报错了。
      

  8.   

    rs.close();放在for循环外面试试
      

  9.   

    我估计是楼主你搞错了应该直接执行dbTarget.ExecuteQuery(tmpStr);//执行sql然后得到结果集resultset(就应该是你写的rs),通过rs.next来访问每一条记录,你的写法是做了很多次查询
      

  10.   

    我给出它的代码:
    主程序:
    OpenDbBase();
    ....
    for(i=0;i<1000;i++)
    {
    ..
    //此时已经取得了要输入的数据ToServerDate(dbS2T, TtbName);
    ....}
    closeDbBase();
    出错时的程序
    private void ToServerDate(Vector dbS2T, String TtbName) {
        //SSSSSSSSSSSSSSSS
        //服务器端处理程序
        //接受来自源的数据dbS2T这个Vector,并写入到中心数据库中
        //每个元素为Source2TgDataElement结构
        //TtbName是要写入的中心数据表
        Database dbTarget = null;
        Source2TgDataElement KeyEle = null;
        ReadTargetInfoXML(); //从xml文件中读入数据源信息
        ResultSet rs = null;
        String KeyField = null, KeyValue = null, UpOrInsSQL = null, tmpStr;
        int UpdateOrInsert = 0;
        try {      dbTarget = new Database(new DbConnection(dbTargetDriver, dbTargetURL,
                                                   dbTargetUserName,
                                                   dbTargetPassword));      KeyEle = GetKeyField(dbS2T);
          KeyField = KeyEle.getTgFieldName();
          KeyValue = KeyEle.getSrValue();
          tmpStr = "SELECT COUNT(*) FROM " + TtbName + " WHERE " + KeyField +
              "='" + KeyValue + "' ";
          rs = dbTarget.ExecuteQuery(
              tmpStr
              );
          //读入值索引表中的内容,然后一条条的处理
          while (rs.next()) {
            UpdateOrInsert = Integer.parseInt(rs.getString(1));
          }
          rs.close();      if (UpdateOrInsert == 0) {
            //没有此记录,则Insert
            UpOrInsSQL = "Insert into " + TtbName + "(" +
                ConStructInsertField(dbS2T)
                + ") Values ("
                + ConStructInsertValue(dbS2T)
                + ")";      }
          else {
            //已经有此记录,则Update
            UpOrInsSQL="Update "+TtbName +" Set "+ ConStructUpdateStr(dbS2T);      }
          dbTarget.ExecuteUpdate(UpOrInsSQL);//写入数据库
          rs.close();
        }    catch (Exception ex) {
          ex.printStackTrace();
        }
        finally {
          if (dbTarget != null) {
            dbTarget.close();
          }
        }  }
      

  11.   

    上面那个是没有问题的.
    我改为:
    private void ToServerDate(Vector dbS2T, String TtbName) {
        //SSSSSSSSSSSSSSSS
        //服务器端处理程序
        //接受来自源的数据dbS2T这个Vector,并写入到中心数据库中
        //每个元素为Source2TgDataElement结构
        //TtbName是要写入的中心数据表
        Source2TgDataElement KeyEle = null;
        ResultSet rs = null;
        String KeyField = null, KeyValue = null, UpOrInsSQL = null, tmpStr;
        int UpdateOrInsert = 0;
        try {      //dbTarget = new Database(new DbConnection(dbTargetDriver, dbTargetURL,
          //                                        dbTargetUserName,
          //                                               dbTargetPassword));
          if (dbTarget != null) {
            KeyEle = GetKeyField(dbS2T);
            KeyField = KeyEle.getTgFieldName();
            KeyValue = KeyEle.getSrValue();
            tmpStr = "SELECT COUNT(*) FROM " + TtbName + " WHERE " + KeyField +
                "='" + KeyValue + "' ";
            rs = dbTarget.ExecuteQuery(
                tmpStr
                );
            //读入值索引表中的内容,然后一条条的处理
            while (rs.next()) {
              UpdateOrInsert = Integer.parseInt(rs.getString(1));
            }
            rs.close();        if (UpdateOrInsert == 0) {
              //没有此记录,则Insert
              UpOrInsSQL = "Insert into " + TtbName + "(" +
                  ConStructInsertField(dbS2T)
                  + ") Values ("
                  + ConStructInsertValue(dbS2T)
                  + ")";
              dbTarget.ExecuteUpdate(UpOrInsSQL); //写入数据库
            }
            else {
              //已经有此记录,则Update        }
          //rs.close();
          }//end of if target!=null
        }    catch (Exception ex) {
          ex.printStackTrace();
        }
        //不由这个函数关闭联接,
      }
    就出问题
      

  12.   

    for ( int i = 0; i < 10000; i ++ ){
       System.out.print("关注")
    }
      

  13.   

    rs.close应该放在final中,同时一定要记得关闭statement对象,如果statement对象不关闭,就会出现游标不够用的错误
      

  14.   

    gz
    为什么不把close放到finally中呢?