当我点"下一条"按钮,直到点到最后一条,出现了上图出现的错误的错误,不直到什么意思,看看我的代码 private static ResultSet rs=null;
private static Statement aStatement=null;
private static Connection aConnection=null;
private static void getDBConnection()
{
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
aConnection=DriverManager.getConnection("jdbc:odbc:mydata","sa","sa");
}catch(ClassNotFoundException e1)
{
JOptionPane.showMessageDialog(null, "驱动没找到,连接失败","Error",JOptionPane.ERROR_MESSAGE);

}catch(SQLException e2)
{
JOptionPane.showMessageDialog(null, "用户名密码错误,连接失败","Error",JOptionPane.ERROR_MESSAGE);

}
}
public static Vector getAll()
{
Vector <Category> Categories=new Vector();
String strSQL;
strSQL="SELECT * FROM Categories";
try
{
getDBConnection();
aStatement=aConnection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
rs=aStatement.executeQuery(strSQL);
while (rs.next())
{
Category aCategory=new Category();
aCategory.setCategoryID(rs.getInt("CategoryID"));
aCategory.setCategoryName(rs.getString("CategoryName"));
aCategory.setDescription(rs.getString("Description"));
byte [] buf1=rs.getBytes("Picture");
aCategory.setPicture(buf1);

Categories.add(aCategory);
}
rs.first();
}
catch(SQLException e)
{
JOptionPane.showMessageDialog(null, e.getMessage(),"Error",JOptionPane.ERROR_MESSAGE);

}
return Categories;
}
public static Category GetNextCategory()
{
Category aCategory=new Category();
try
{
if (rs.isLast())
{
JOptionPane.showMessageDialog(null, "已经是最后一条记录了","提示",JOptionPane.INFORMATION_MESSAGE);
}
else
{
rs.next();

}
aCategory=getCategory(rs);
}catch(SQLException e)
{
JOptionPane.showMessageDialog(null, e.getMessage(),"Error",JOptionPane.ERROR_MESSAGE);

}
return aCategory;
}
以上是部分代码,欢迎高手们协助解决!

解决方案 »

  1.   

    错误是说的你的索引index不正确
    这些方法都是在什么时候调用的?aCategory=getCategory(rs);//getCategory的代码呢?估计就是在这里出错的

    if (rs.isLast())
                {
                    JOptionPane.showMessageDialog(null, "已经是最后一条记录了","提示",JOptionPane.INFORMATION_MESSAGE);
                    
                }改成
    if (rs.isAfterLast())
                {
                    JOptionPane.showMessageDialog(null, "已经是最后一条记录了","提示",JOptionPane.INFORMATION_MESSAGE);
                    return; //这里就返回
                    
                } 试试看吧
      

  2.   

    支持!!!
    日語的意思就是說索引index不正确。
      

  3.   

    public static Category getCategory(ResultSet rs)
    {
    Category aCategory=new Category();
    try
    {
    aCategory.setCategoryID(rs.getInt("CategoryID"));
    aCategory.setCategoryName(rs.getString("CategoryName"));
    aCategory.setDescription(rs.getString("Description"));
    aCategory.setPicture(rs.getBytes("Picture"));
    }
    catch (SQLException e)
    {
    JOptionPane.showMessageDialog(null, e.getMessage());
    }
    return aCategory;
    }
    阿宝说的方法似乎不可行。
      

  4.   

    我的问题好像没说清楚,当记录在最后一条位置的时候,继续点击“下一条”,就会出现最后个错误,但是在Eclipse没有报错。程序依然可以运行。
      

  5.   

    把附件保存成jpg,bmp太大了
    eclipse 没有报错因为你catch了
     catch(SQLException e)
            {
               e.printStackTrace();//加这个就可以看到控制台里详细信息了
                JOptionPane.showMessageDialog(null, e.getMessage(),"Error",JOptionPane.ERROR_MESSAGE);
                
            }
      

  6.   

    java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]記述子のインデックスが正しくありません。
    at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6958)
    at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7115)
    at sun.jdbc.odbc.JdbcOdbc.SQLGetDataInteger(JdbcOdbc.java:3812)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getDataInteger(JdbcOdbcResultSet.java:5639)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getInt(JdbcOdbcResultSet.java:582)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getInt(JdbcOdbcResultSet.java:600)
    at gui.CategoryDA.getCategory(CategoryDA.java:63)
    at gui.CategoryDA.GetNextCategory(CategoryDA.java:117)
    at gui.CategoryFrame$btnNextActionEventHander.actionPerformed(CategoryFrame.java:160)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:234)
    at java.awt.Component.processMouseEvent(Component.java:5488)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3093)
    at java.awt.Component.processEvent(Component.java:5253)
    at java.awt.Container.processEvent(Container.java:1966)
    at java.awt.Component.dispatchEventImpl(Component.java:3955)
    at java.awt.Container.dispatchEventImpl(Container.java:2024)
    at java.awt.Component.dispatchEvent(Component.java:3803)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
    at java.awt.Container.dispatchEventImpl(Container.java:2010)
    at java.awt.Window.dispatchEventImpl(Window.java:1766)
    at java.awt.Component.dispatchEvent(Component.java:3803)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:234)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)63行是这行代码aCategory.setCategoryName(rs.getString("CategoryName"));
    117行是这行代码aCategory=getCategory(rs);
      

  7.   

    哦,昨天还有人问这个问题应该是SELECT * FROM Categories的问题把它该成具体的字段名称,并且检索顺序跟使用顺序一致应该就可以了我的blog里新写的'无效的描述符索引'解决方法
      

  8.   

    问题解决了,
    这段代码
    if (rs.isLast())
                {
                    JOptionPane.showMessageDialog(null, "已经是最后一条记录了","提示",JOptionPane.INFORMATION_MESSAGE);
                }
                else
                {
                    rs.next();
                    
                }
    中JOptionPane.showMessageDialog(null, "已经是最后一条记录了","提示",JOptionPane.INFORMATION_MESSAGE);
    下面加上rs.absolute(rs.getRow());
    这句话就不出错了,谢谢各位。
    还有一个更新的问题public static void update (Category aCategory)
    {

    try
    {
    rs.updateString("CategoryName", aCategory.getCategoryName());
    rs.updateString("Description", aCategory.getDescription());
    rs.updateRow();

    }catch(SQLException e)
    {
    JOptionPane.showMessageDialog(null, e.getMessage(),"Error",JOptionPane.ERROR_MESSAGE);
    }
    }
    出现了这个错误
    java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]SQL Server で特定できないエラーが発生しました。接続はサーバーにより切断された可能性があります。
    at sun.jdbc.odbc.JdbcOdbcResultSet.setPos(JdbcOdbcResultSet.java:5272)
    at sun.jdbc.odbc.JdbcOdbcResultSet.updateRow(JdbcOdbcResultSet.java:4172)
    at gui.CategoryDA.update(CategoryDA.java:195)
    at gui.CategoryFrame$btnUpdateActionEventHander.actionPerformed(CategoryFrame.java:188)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:234)
    at java.awt.Component.processMouseEvent(Component.java:5488)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3093)
    at java.awt.Component.processEvent(Component.java:5253)
    at java.awt.Container.processEvent(Container.java:1966)
    at java.awt.Component.dispatchEventImpl(Component.java:3955)
    at java.awt.Container.dispatchEventImpl(Container.java:2024)
    at java.awt.Component.dispatchEvent(Component.java:3803)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
    at java.awt.Container.dispatchEventImpl(Container.java:2010)
    at java.awt.Window.dispatchEventImpl(Window.java:1766)
    at java.awt.Component.dispatchEvent(Component.java:3803)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:234)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
      

  9.   

    rs是不是走到最后了,或者rs断掉了吧,是否哪里做过了commit或rollback之类的?说句题外话,这样的接口设计真的太差了,全部都是静态方法和静态对象,假设一个用户在没有调getAll()之前就调其他比如update方法,结果会怎样?又或者一个用户调用getAll(),又一个用户调用getAll(),结果又怎样?其实取到Category集合以后,就应该关闭rs和connection了,以后的操作直接对Category集合操作就是了,要更新的时候,从Category中的到要更新的对象,通过其key和设定的新值更新就行了。