我想将JTable中的数据写入数据库,但到目前为止它还无法正常工作。 我总是得到一个mysql错误!有人可以告诉我出了什么问题吗?
public class Fussball extends JFrame {
private JButton save = new JButton();
private JTable jTable1 = new JTable(9, 4);
private DefaultTableModel jTable1Model = (DefaultTableModel) jTable1.getModel();
private JScrollPane jTable1ScrollPane = new JScrollPane(jTable1);
public Fussball(String title) {
super(title);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
int frameWidth = 563;
int frameHeight = 482;
setSize(frameWidth, frameHeight);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x = (d.width - getSize().width) / 2;
int y = (d.height - getSize().height) / 2;
setLocation(x, y);
Container cp = getContentPane();
cp.setLayout(null);
// Anfang Komponenten
save.setBounds(200, 304, 201, 65);
save.setText("speichern");
save.setMargin(new Insets(2, 2, 2, 2));
save.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
save_ActionPerformed(evt);
}
});
cp.add(save);
jTable1ScrollPane.setBounds(64, 48, 465, 225);
jTable1.getColumnModel().getColumn(0).setHeaderValue("Spiel ID");
jTable1.getColumnModel().getColumn(1).setHeaderValue("Verein 1");
jTable1.getColumnModel().getColumn(2).setHeaderValue("Verein 2");
jTable1.getColumnModel().getColumn(3).setHeaderValue("Ergebnis");
cp.add(jTable1ScrollPane);
// Ende Komponenten
setResizable(false);
setVisible(true);
}
public void save_ActionPerformed(ActionEvent evt) {
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection dbConn = DriverManager.getConnection("jdbc:mysql://localhost:3306/fussball", "root", "");
Statement statement = dbConn.createStatement();
String insertQuery = "INSERT INTO Spiel VALUES (?,?,?,?)";
PreparedStatement ps = dbConn.prepareStatement(insertQuery);
ps.setString(1, "idSpiel");
ps.setString(2, "Vereinone");
ps.setString(3, "Vereintwo");
ps.setString(4, "Ergebnis");
ps.executeUpdate();
//Vector vector = new Vector();
statement.close();
dbConn.close();
} catch (InstantiationException e) {
System.err.println("Error in Instantiation!");
} catch (ClassNotFoundException e) {
System.err.println("Class not found!");
} catch (IllegalAccessException e) {
System.err.println("Access denied!");
} catch (SQLException e) {
System.err.println("SQL Error!");
}
}
public static void main(String[] args) {
new Fussball("fussball");
}
}
答案 0 :(得分:0)
尝试将数据库功能与UI代码隔离开来。只需编写一个简单的方法来运行插件就像你有你的监听器方法一样,看看你是否可以让它工作。您现在几乎正在这样做,因为您发布的代码实际上并未从表中提取数据。看起来它只是运行测试更新。不过,我建议您创建一个DAO类并将所有SQL代码放在那里,而不是混合使用您的UI代码。
来自SQL的错误消息并不总是有用,但有时它们是有用的。您忽略了代码中的异常。
特别是,我会用以下代码替换代码中的catch块:
catch (SQLException e) {
System.err.println("SQL Error:" + e.toString() );
}
另请注意,您没有使用Statement statement = dbConn.createStatement();
,因此您可以删除该行。
在您的DAO课程中,您可以创建一个类似的测试方法,以帮助我们隔离并解决此问题。显示异常消息非常重要,而不仅仅是捕获它们并打印自己的消息。
public void testDBInsert() {
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection dbConn = DriverManager.getConnection("jdbc:mysql://localhost:3306/fussball", "root", "");
String insertQuery = "INSERT INTO Spiel VALUES (?,?,?,?)";
PreparedStatement ps = dbConn.prepareStatement(insertQuery);
ps.setInt(1, 128); //should be an integer?
ps.setString(2, "Vereinone");
ps.setString(3, "Vereintwo");
ps.setString(4, "Ergebnis");
ps.executeUpdate();
ps.close();
dbConn.close();
} catch (Exception e) {
System.err.println("Error in SQL Test: " + e.toString() );
}
}
答案 1 :(得分:0)
尝试将Classpath
设置为包含MYSQL JDBC驱动程序的文件夹并重新运行应用程序
答案 2 :(得分:0)
如果我没弄错,你使用的陈述是错误的:
private final String INSERT_QUERY= "INSERT INTO tableName (col_name,col_name2, col_name3) VALUES(?, ?, ?);";
您缺少要与值关联的列的名称。
Eddited: ABOVE 是假的,你的陈述和我的陈述都是正确的。
另外,如果你正在使用和INSERT语句,你可以这样做(你不必创建一个语句):
PreparedStatement p = dbConn.prepareStatement(INSERT_QUERY);
p.setString(...);
等等。
如果这没有帮助,那么(很多次发生在我身上)事实上你的MySQL服务器可能被关闭(没有运行)。检查它是否先运行。
如果没有,你能否至少试图告诉我们你得到的错误?