【问题标题】:Adding new values to mysql database no longer possible?不再可能向 mysql 数据库添加新值?
【发布时间】:2018-09-20 14:59:52
【问题描述】:

大家好,请考虑下面的代码。我用它在 mysql 数据库(seat_booking)中的表(booking)中添加新值。

变量包括String(id,cname,ctype,event_name)int(seatsno)。我还在这段代码中调用了一个函数EventName(),相信我,它工作得很好,我能够从另一个表(事件)中派生事件名称,但是这种方法唯一的问题。

伙计们,我的项目是制作一个座位预订 GUI 应用程序,因此当我使用它为“管理员”模式添加新事件时,此代码确实有效,但在这里不起作用,即当我需要它来存储预订时特定客户的价值。请帮助各位。我真的很感激。

private void newbookbtnActionPerformed(java.awt.event.ActionEvent evt) {                                           
    // TODO add your handling code here:
    try {
        Class.forName("java.sql.Driver");
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost/seat_booking","root","<mypassword>");
        Statement stmt = con.createStatement();
        String query = "SELECT * FROM booking";
        ResultSet rs = stmt.executeQuery(query);
        String cname = tfcname.getText();
        int seatsno = Integer.parseInt(tfseatsno.getText());
        String evtname = EventName();
        String ctype = "Normal Customer"; long bookid = getID();
        String id = Long.toString(bookid); 
        String query1="insert into booking values('"+ id +"','"+ cname +"','"+ ctype +"','"+evtname+"',"+ seatsno+");";
        stmt.executeUpdate(query1);
        JOptionPane.showMessageDialog(null, "Booking successfull!");
        stmt.close();
        con.close();
    }
    catch (Exception e)
    {
        JOptionPane.showMessageDialog(null,"Error encountered while booking new event!");
    }
}                  

我尝试将 e.Stacktrace(); 语句放入应用程序中,然后运行它,以下是错误的结果输出:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's Track Events Warm-up,1)' at line 1
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.Util.getInstance(Util.java:386)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1053)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2788)
    at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1816)
    at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1730)
    at CustomerNewBook.newbookbtnActionPerformed(CustomerNewBook.java:256)
    at CustomerNewBook.access$100(CustomerNewBook.java:16)
    at CustomerNewBook$2.actionPerformed(CustomerNewBook.java:110)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
...

【问题讨论】:

  • 您遇到了什么错误?
  • 了解prepared Statements以防止sqlinjection
  • 打印堆栈跟踪并分享
  • @Jens bro 我无法使用e.printStacktrace(); 它显示警告未找到变量
  • @mc20 系统显示我在代码行 String query1 =..... 的最后一个靠近 evtname 和 seatno 的 sql 语法有一些问题。你介意检查一下,如果你发现有什么问题告诉我吗?

标签: java mysql netbeans


【解决方案1】:

您使用了错误的驱动程序类。正确的是:

Class.forName("com.mysql.jdbc.Driver");

java.sql.Driver 只是一个接口。欲了解更多信息,请参阅javadoc

顺便说一句:了解prepared Statements以防止sqlinjection 不要抑制错误消息。至少记录它们或将其放入消息对话框中:

catch (Exception e)
{
    e.printStacktrace();
    JOptionPane.showMessageDialog(null,"Error encountered while booking new event!"+e.getMessage());
}

【讨论】:

  • 好的,我尝试了你所说的,错误消息说我在 evtname 和 seatno 附近的 sql 语法有问题,语句中显示 ----> 'String query1 =.... ....'你能检查那行并告诉@Jens 那行有什么问题吗?
  • @JayantPanwar 请将完整的堆栈跟踪添加到您的问题中
  • 根据您的建议,我已编辑问题并在其中添加了完整的堆栈跟踪。请看看
  • @JayantPanwar 因为您没有使用准备好的语句,所以您必须在值中转义单引号!即特殊字符 vvalue 包含 's Track Events Warm-up,1)
  • 根据您的建议,我从String query1 =.... 行中删除了所有单引号,但我必须说遇到的错误仍然是一样的!即com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Customer,Women's High Jump Warm-up,6)' at line 1
【解决方案2】:

更新 2 (针对this comment

检查错误,

您的 SQL 语法有错误...在s Track Events Warm-up,1) 附近...

问题在于您传递的字符串。确保您的任何变量 (id, cname, ctype, evtname) 不包含单个 qoutes(') 或任何其他可能干扰查询的转义字符。

使用Prepared Statements 可以轻松解决此问题。试试吧,

String query1 = "INSERT INTO `booking` VALUES(?, ?, ?, ?, ?)";
PreparedStatement stmt = con.prepareStatement(query1);  
stmt.setString(1, id); //1 specifies the first parameter in the query  
stmt.setString(2, cname);
stmt.setString(3, ctype);
stmt.setString(4, evtname);
stmt.setInt(5, seatsno); //use setInt() to parse ints
stmt.executeUpdate();

更新(针对this comment

在您的 catch 块中,注释 JOptionPane 行并添加以下内容,

catch (Exception e){
    e.printStackTrace();
    // JOptionPane.showMessageDialog(null, ...);
}

然后再次运行您的应用程序并使用错误输出更新问题。


原答案:

如果您使用的是jdbc:mysql,则需要 MySQL 连接器。

  • mysql-connector-java-8.0.12下载,
  • mysql-connector-java-8.0.12.jar 添加到您的项目中。
  • 改变驱动类,

    Class.forName("com.mysql.jdbc.Driver");
    
  • 清理和构建(可选但推荐)

【讨论】:

  • 兄弟,你说的我试过了,但还是不行,预订新活动还是出错
  • e.printStackTrace(); 行在 netbeans 中显示警告。它说找不到变量名 printStackTrace。也许我输入错了,你能给出应该写的整行吗?
  • @JayantPanwar 发出警告是为了提醒您应该删除printStackTrace()。不要注意警告。只需在catch 后面加上一行。我已经更新了答案。
  • 我已经更新了问题,其中包含您所说的完整堆栈跟踪。请看一下
  • @JayantPanwar 现在检查我的答案
猜你喜欢
  • 2023-01-17
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 2016-09-27
相关资源
最近更新 更多