package com.shijian.shopping.util;
import java.sql.*;public class DBConnect {
private Connection con = null;
private Statement st = null;
private PreparedStatement pst = null;
private ResultSet rs = null;

private void init(){
try{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost/loginbean";
con = DriverManager.getConnection(url,"root","1986528");
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}
}

public DBConnect(){
try{
init();
st = con.createStatement();
}catch(SQLException e){
e.printStackTrace();
}
}

public DBConnect(String sql){
try{
init();
pst = con.prepareStatement(sql);
}catch(SQLException e){
e.printStackTrace();
}
}

public void executeQurey(String sql){
try{
if(st != null)
rs = st.executeQuery(sql);
}catch(SQLException e){
e.printStackTrace();
}
}

public void executeQurey(){
try{
if(pst != null)
rs = pst.executeQuery();
}catch(SQLException e){
e.printStackTrace();
}
}

public void executeUpdate(String sql){
try{
if(st != null)
st.executeUpdate(sql);
else
pst.executeUpdate(sql);
}catch(SQLException e){
e.printStackTrace();
}
}

//以下为PreparedStatement对象的赋值操作

public void setString(int parameterIndex, String x){
try {
pst.setString(parameterIndex, x);
} catch (SQLException e) {
e.printStackTrace();
}
}

public void setInt(int parameterIndex, int x){
try{
pst.setInt(parameterIndex, x);
}catch(SQLException e){
e.printStackTrace();
}
}

public void setDate(int parameterIndex, Date x){
try{
pst.setDate(parameterIndex, x);
}catch(SQLException e){
e.printStackTrace();
}
}

//以下为取值方法

public String getString(String x) throws SQLException{
return rs.getString(x);
}

public int getInt(String x) throws SQLException{
return rs.getInt(x);
}

public Date getDate(String x) throws SQLException{
return rs.getDate(x);
} public void next(){
try{
rs.next();
}catch(SQLException e){
e.printStackTrace();
}
}

public void close(){
try{
if(rs != null)rs.close();
if(pst != null)pst.close();
if(st != null)st.close();
if(con != null)con.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
JSP代码:<%@ page language="java" contentType="text/html; charset=GB18030"
    pageEncoding="GB18030"%>
<%@ page import="com.shijian.shopping.util.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<body>
<%
DBConnect db = new DBConnect();
String sql = "select * from datalogin where name = 'shijian'";
db.executeQurey(sql);
%>
<%= db.getString("name") %>
</body>
</html>
目的:只是想简单的验证一下,数据库的连接情况!数据库建立的是好的,我在Mysql的client下测试过!Exception:javax.servlet.ServletException: java.sql.SQLException: Before start of result set谢谢大家....帮下我这个菜鸟,刚开始自学,会努力的!谢谢

解决方案 »

  1.   

    Before start of result set 是因为没有使用next()
    ================
    ResultSet
    boolean next()
                 throws SQLException将光标从当前位置向前移一行。ResultSet 光标最初位于第一行之前;第一次调用 next 方法使第一行成为当前行;第二次调用使第二行成为当前行,依此类推。 
    当调用 next 方法返回 false 时,光标位于最后一行的后面。任何要求当前行的 ResultSet 方法调用将导致抛出 SQLException。如果结果集的类型是 TYPE_FORWARD_ONLY,则其 JDBC 驱动程序实现对后续 next 调用是返回 false 还是抛出 SQLException 将由供应商指定。 如果对当前行开启了输入流,则调用 next 方法将隐式关闭它。读取新行时,将清除 ResultSet 对象的警告链。 
    返回:
    如果新的当前行有效,则返回 true;如果不存在下一行,则返回 false 
    抛出: 
    SQLException - 如果发生数据库访问错误或在关闭的结果集上调用此方法
      

  2.   

    楼主你没对结果集resultSet做循环啊,当然会报错。
    db.executeQurey(sql); 
    这里开始改成,
    ResultSet rs = db.db.executeQurey(sql);
    while(rs.next())
    {
    %>
        <%= rs.getString("name") %> 
    <%
    }
    %>另外像这种读取结果集里的数据,rs.getString("name"),每次循环,对一个字段的操作只可以进行一次,也就是说,你先做了一次rs.getString("name")操作的话,如果下面又写了一句rs.getString("name"),就会报错。所以如果这个数据要多次用到,建议先存到变量里。