今天練習更新數據庫,遇到了幾個問題,半天才想明白,在這裏給大家分享一下:
一個是使用insertRow()插入一行記錄時拋異常,一個是deleteRow()刪除一行記錄時拋異常,異常分別是:
java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver]行中有錯誤
at sun.jdbc.odbc.JdbcOdbcResultSet.setPos(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcResultSet.insertRow(Unknown Source)
java.sql.SQLException: [Microsoft][ODBC 驅動程序管理器] 無效的遊標狀態
at sun.jdbc.odbc.JdbcOdbcResultSet.setPos(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcResultSet.deleteRow(Unknown Source)
解決方法如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
/**
* 使用可更新結果集更新數據庫
* @author ZhaoYidong
*/
public class AddStudent extends JFrame {
private static final long serialVersionUID = 1L;
JScrollPane pane = new JScrollPane();
JTextArea taInfo = new JTextArea();
public AddStudent() {
super("添加學生信息");
setSize(400, 260);
pane.getViewport().add(taInfo);
this.getContentPane().add(pane);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void addStudent() {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
Connection con = null;
try {
String url = "jdbc:odbc:Students";
con = DriverManager.getConnection(url);
Statement stmt = con
.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
String sql = "select * from student";
ResultSet rs = stmt.executeQuery(sql);
taInfo.setText("更新前:\n");
while (rs.next()) {
taInfo.append(rs.getString(1) + "\t");
taInfo.append(rs.getString(2) + "\t");
taInfo.append(rs.getString(3) + "\t");
taInfo.append(rs.getString(4) + "\t");
taInfo.append(rs.getString(5) + "\n");
}
/*
* 超出最大行數會移動至最後的一行的下一行記錄,導致rs.deleteRow();報錯
* 可以使用rs.previous()將遊標移至上一行避免出錯
*/
rs.absolute(1);
rs.deleteRow();
rs.moveToInsertRow();
rs.updateInt(1, 2);
rs.updateString(2, "122");
rs.updateString(3, "趙東東");
rs.updateString(4, "男");
rs.updateInt(5, 100);
/*
* 第二次運行程序會報錯:
* at sun.jdbc.odbc.JdbcOdbcResultSet.insertRow(Unknown Source)
* 是因爲第二列s_no爲索引,兩次插入,導致索引列重複引發異常
*/
rs.insertRow();
rs.close();
taInfo.append("更新後:\n");
rs = stmt.executeQuery(sql);
while (rs.next()) {
taInfo.append(rs.getString(1) + "\t");
taInfo.append(rs.getString(2) + "\t");
taInfo.append(rs.getString(3) + "\t");
taInfo.append(rs.getString(4) + "\t");
taInfo.append(rs.getString(5) + "\n");
}
rs.close();
stmt.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
AddStudent frame = new AddStudent();
frame.setVisible(true);
frame.addStudent();
}
}