在下面程序里有两个while循环,如果改成if,处理第一条记录就没有问题。但是如果使用while进行循环就会出问题。
程序逻辑是,从sys-mentioinfo里查找记录,如果有,则产生相应的短信,插到sys-duanxin表里。
测试数据在表里都存在,麻烦给看看好吗? 是不是跟SQLException有关系public class RemindTask extends TimerTask
{
public void run()
{
try
{
Connection conn = JdbcPool.getConnection();
Statement stmt = conn.createStatement();
String sqlstr= "select * from sys_mentioninfo where hasmention='no'";
ResultSet rs = stmt.executeQuery(sqlstr);
while(rs.next())
{
String mentiontime = rs.getString("mentiontime").substring(0,10);
SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy-MM-dd");
Date mentionTime = new java.util.Date();
mentionTime = formatter.parse(mentiontime); // 字符串转换为时间类型
Date currentTime = new Date();
String sourcetime = formatter.format(currentTime); //将日期时间格式化
long diffDays = (mentionTime.getTime()- currentTime.getTime())/(24*60*60*1000);
System.out.print(diffDays);
if(diffDays <=0)
{
stmt = conn.createStatement();
sqlstr="select loginname from sys_personauth where sdoi='" + rs.getString("sdoi") + "' and serialcode='" + rs.getString("serialcode") + "'";
ResultSet rs1= stmt.executeQuery(sqlstr);
if(rs1.next())
{
rs1.beforeFirst();
while(rs1.next())
{
stmt = conn.createStatement();
sqlstr = "insert into sys_duanxin(sender,receiver,content,sendtime,ifdo) values('SYSTEM','" + rs1.getString("loginname") + "','" + rs.getString("content") + "','" + sourcetime + "','no')";
stmt.executeUpdate(sqlstr);
}
}
else
{
throw new Exception("no record fit");
}
}
else
{
throw new Exception("days not fit");
}
}
}
catch(Exception ef)
{
ef.printStackTrace();
}
} }
程序逻辑是,从sys-mentioinfo里查找记录,如果有,则产生相应的短信,插到sys-duanxin表里。
测试数据在表里都存在,麻烦给看看好吗? 是不是跟SQLException有关系public class RemindTask extends TimerTask
{
public void run()
{
try
{
Connection conn = JdbcPool.getConnection();
Statement stmt = conn.createStatement();
String sqlstr= "select * from sys_mentioninfo where hasmention='no'";
ResultSet rs = stmt.executeQuery(sqlstr);
while(rs.next())
{
String mentiontime = rs.getString("mentiontime").substring(0,10);
SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy-MM-dd");
Date mentionTime = new java.util.Date();
mentionTime = formatter.parse(mentiontime); // 字符串转换为时间类型
Date currentTime = new Date();
String sourcetime = formatter.format(currentTime); //将日期时间格式化
long diffDays = (mentionTime.getTime()- currentTime.getTime())/(24*60*60*1000);
System.out.print(diffDays);
if(diffDays <=0)
{
stmt = conn.createStatement();
sqlstr="select loginname from sys_personauth where sdoi='" + rs.getString("sdoi") + "' and serialcode='" + rs.getString("serialcode") + "'";
ResultSet rs1= stmt.executeQuery(sqlstr);
if(rs1.next())
{
rs1.beforeFirst();
while(rs1.next())
{
stmt = conn.createStatement();
sqlstr = "insert into sys_duanxin(sender,receiver,content,sendtime,ifdo) values('SYSTEM','" + rs1.getString("loginname") + "','" + rs.getString("content") + "','" + sourcetime + "','no')";
stmt.executeUpdate(sqlstr);
}
}
else
{
throw new Exception("no record fit");
}
}
else
{
throw new Exception("days not fit");
}
}
}
catch(Exception ef)
{
ef.printStackTrace();
}
} }
这样当然会出错的,一般对处理ResultSet都这样做:while(rs.hasNext()){
yourObject = (YourObject)rs.next();
String name = yourObject.getString("name");
}
rs 可以理解成许多连续的的数据,rs.next 在通道上换到下一个数据准备处理很可惜,这一批数据还没有处理完,你又重新创建了一批新的数据
上一批数据丢失了一个通道是不能同时交叉传输2套数据的。 -----------------------------------------------
如果你还没明白,
我最后告诉你,你不能在一个连接里面嵌套ResultSet
如果仍有元素可以迭代,则返回 true。
next()
返回迭代的下一个元素。
如果你写成这样String aa=null;
while((aa=(String)rs.next())!=null && (aa=(String)rs.next()).length>0){}或者你写成while(rs.hasNext()){}
if (diffDays <= 0) {
stmt = conn.createStatement(); // 后面你用的还是这个
如果你用2个不同的 Statemetn , 我认为没有问题!
2 建议你用多个Connection 运行看看,至少排出这个可能!
Java 5中的ResultSet竟然不支持hasNext方法了
在合体字的while那里,原来加了
if(rs.next())
{
rs.beforelast();这样的判断。但是发现只要去掉这个判断,程序就能正常执行。但是这里也有隐患,一旦表里为空,就会出错。但是我实在不知道为什么加这个判断就出问题。 public void run()
{
try
{
Connection conn = JdbcPool.getConnection();
Statement stmt = conn.createStatement();
String sqlstr= "select * from sys_mentioninfo where hasmention='no'";
ResultSet rs = stmt.executeQuery(sqlstr);
while(rs.next()) {
String mentiontime = rs.getString("mentiontime").substring(0,10);
SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy-MM-dd");
Date mentionTime = new java.util.Date();
mentionTime = formatter.parse(mentiontime); // 字符串转换为时间类型
Date currentTime = new Date();
String sourcetime = formatter.format(currentTime); //将日期时间格式化
long diffDays = (mentionTime.getTime()- currentTime.getTime())/(24*60*60*1000);
if(diffDays<=0)
{
stmt = conn.createStatement();
sqlstr="select loginname from sys_personauth where sdoi='" + rs.getString("sdoi") + "' and serialcode='" + rs.getString("serialcode") + "'";
ResultSet rs1 = stmt.executeQuery(sqlstr);
while(rs1.next())
{
stmt = conn.createStatement();
sqlstr = "insert into sys_duanxin(sender,receiver,content,sendtime,ifdo) values('SYSTEM','" + rs1.getString("loginname") + "','" + rs.getString("content") + "','2008-01-01','no')";
stmt.executeUpdate(sqlstr);
}
}
}
}
catch(Exception ef)
{
ef.printStackTrace();
}
}