解決數據庫連接的幾個錯誤

今天練習更新數據庫,遇到了幾個問題,半天才想明白,在這裏給大家分享一下:

一個是使用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();
	}
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章