新手的两个简单问题,100分!关注者有分! 1.单纯从这部分代码看不出什么问题,tmpStr执行了什么查询语句?2.采用多线程来执行。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 (1)tmpstr是一个select count(*) form tb(2)能不能有一个示例.我手边没有合适的书 select count(*) form tbform-->from 建议使用prparedstatement或statement 找本有介绍jdbc的书,上面例子多的是 (1)RS执行一次会自动消亡,连续使用自然是不可能了(2)建议用:while(rs.next()){ .....}这样就行了 while(rs.next()){ .....} for(i=0;i<=10000;i++){ lable.settext("正在处理第"+ i+"条记录!"); rs = dbTarget.ExecuteQuery( tmpStr );//执行sql.... rs.close;}你是不是要执行10000次的查询呀?而且在你第一次执行后,rs就被关闭了,所以你第二次循环就会报错了。 rs.close();放在for循环外面试试 我估计是楼主你搞错了应该直接执行dbTarget.ExecuteQuery(tmpStr);//执行sql然后得到结果集resultset(就应该是你写的rs),通过rs.next来访问每一条记录,你的写法是做了很多次查询 我给出它的代码:主程序: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(); } } } 上面那个是没有问题的.我改为: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(); } //不由这个函数关闭联接, }就出问题 for ( int i = 0; i < 10000; i ++ ){ System.out.print("关注")} rs.close应该放在final中,同时一定要记得关闭statement对象,如果statement对象不关闭,就会出现游标不够用的错误 gz为什么不把close放到finally中呢? 关于继承在实际应用中的疑问 让网站访问速度飞起来(前端篇) 我碰到一个问题,需要使用大数据量的容器,目前,使用map和treemap都不能达到要求,请问,有哪位可以出个主意 走J2EE路线需要看那些书 JDBC的连接问题 有关synchronized 最后一句英文什么意思? 求助!!请问一个对话框的问题! java如何生成可执行文件? 听说国外用JAVA用得较多,有没有国外关于JAVA较好的论坛??? 关于字节码增强 重载与覆写 提问:关于java applet中paint()的问题
(2)能不能有一个示例.我手边没有合适的书
(2)建议用:while(rs.next())
{
.....
}
这样就行了
{
.....
}
{
lable.settext("正在处理第"+ i+"条记录!");
rs = dbTarget.ExecuteQuery(
tmpStr
);//执行sql
....
rs.close;
}
你是不是要执行10000次的查询呀?
而且在你第一次执行后,rs就被关闭了,所以你第二次循环就会报错了。
主程序:
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();
}
} }
我改为:
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();
}
//不由这个函数关闭联接,
}
就出问题
System.out.print("关注")
}
为什么不把close放到finally中呢?