【问题标题】:when i am trying to save the data to mysql, an exception is being thrown( java.sql.SQLException)当我试图将数据保存到 mysql 时,抛出异常(java.sql.SQLException)
【发布时间】:2011-07-27 02:53:59
【问题描述】:
import java.awt.Panel;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.Statement;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JTextField;

import com.mysql.jdbc.Connection;

public class one implements ActionListener{

    JFrame frame = new JFrame("ghar hisab");
    JButton b = new JButton("save");
    Panel p = new Panel();
    JTextField f = new JTextField(20);
    JTextField f1 = new JTextField(20);
    JLabel l = new JLabel("Enter the first name");
    JLabel l1 = new JLabel("Enter the last name");
    String s1,s2;
    String ppl;
    int people;

            void display() throws Exception{
                                p.add(l);
                                p.add(f);
                                p.add(l1);
                                p.add(f1);
                                p.add(b);

                                frame.setSize(400,400);

                                frame.setVisible(true);
                                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                                frame.getContentPane().add(p);
                                s1=f.getText();
                                s2=f1.getText();


                //Class.forName("com.mysql.jdbc.Driver");
                //Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/people","root","desire");

                //Statement stat = con.createStatement();
            //  String s3= "insert into name values s1 + s2";
            //  stat.executeUpdate(s3);



        //  stat.executeQuery("insert into name (first,last) values('"+s1+"','"+s2+"')");
            b.addActionListener(this);

        //  ResultSet rs= stat.executeQuery("insert into name (first,last) values("arun","yadav"));


            //while(rs.next()){
        //      System.out.println(rs.getString(1)+" "+rs.getString(2));
        //  }




        }

        @Override
        public void actionPerformed(ActionEvent event) {
            // TODO Auto-generated method stub
            try{
                Class.forName("com.mysql.jdbc.Driver");

            Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/people","root","desire");

            Statement stat = con.createStatement();

            stat.executeQuery("insert into name (first,last) values('"+s1+"','"+s2+"')");
            }
            catch(Exception e){
                System.out.println("the exception caught is "+e);
            }
        }


}

【问题讨论】:

  • 从异常中获取堆栈跟踪将帮助您进行调试。
  • 信息不足 - 请发布堆栈跟踪。不要打印该消息 - 它提供的信息比您可以使用的要少。
  • 用 stat.executeUpdate 替换 stat.executeQuery 解决了异常问题。数据库表中的新条目也已创建,但在“第一个”和“最后一个”字段中没有显示任何内容。

标签: java mysql swing awt


【解决方案1】:

没有堆栈跟踪,很难分辨。要么您没有建立连接,要么您的 SQL 中的值导致查询出错(可能一个或两个都为空)。我建议在 con 上设置一个断点,看看对象是否为空。并查看 s1 和 s2 是什么。下面,我添加了两行。您需要关闭您的语句和连接。

public void actionPerformed(ActionEvent event) {
    // TODO Auto-generated method stub
    try
    {
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/people","root","desire");
        Statement stat = con.createStatement();
        stat.executeQuery("insert into name (first,last) values('"+s1+"','"+s2+"')");
        stat.close();
        con.close();
    }
    catch(Exception e){
        System.out.println("e.fillInStackTrace:" + e.fillInStackTrace());
        System.out.println("e.getCause:" + e.getCause());
        System.out.println("e.getLocalizedMessage:" + e.getLocalizedMessage());
        System.out.println("e.getMessage.:" + e.getMessage());
        System.out.println("e.getStackTrace:" + e.getStackTrace());
        System.out.println("e.initCause:" + e.initCause());
        System.out.println("e.printStackTrace:" + e.printStackTrace());
        System.out.println("e.toString:" + e.toString());       
    }
}

【讨论】:

  • 用 stat.executeUpdate 替换 stat.executeQuery 解决了异常问题。数据库表中的新条目也已创建,但在“第一个”和“最后一个”字段中没有显示任何内容。
  • 当您说“first”和“last”字段时,您是在插入完成后查询数据库吗?像下面这样:SELECT * FROM [name] ???
  • 用户 (root) 是否具有执行 INSERT 命令的适当权限?我想是这样,因为它是根,但只是想确定一下。这些字段的 SQL 数据类型是否与您从 Java 代码发送的数据一致?
  • 在 catch 中尝试新代码。这应该可以为您提供所需的详细信息。
  • 虽然取出那些没有“字符串”返回类型的......否则你会得到另一个例外。 download.oracle.com/javase/1,5.0/docs/api/java/lang/…
【解决方案2】:

我注意到您导入 PreparedStatement,但您的代码从未使用它。好吧,我对 SQL 了解不多,但是当您使用 PreparedStatement 时,我这样做的可能性较小。下面是一个简单的插入示例:

String sql = "INSERT INTO Name (First, Last) VALUES (?, ?)";

PreparedStatement stmt = connection.prepareStatement(sql);

stmt.setString( 1, s1 );
stmt.setString( 2, s2 );
stmt.executeUpdate();

我冒昧地将表名和列名大写,因为这是大多数人创建表名的方式。

编辑:

s1=f.getText();
s2=f1.getText(); 

执行该代码时,文本字段不包含任何值,因为用户还没有机会在文本字段中输入任何数据。这两条语句需要移到 actionPerformed() 方法中。

【讨论】:

  • 用 stat.executeUpdate 替换 stat.executeQuery 解决了异常问题。数据库表中的新条目也已创建,但在“第一个”和“最后一个”字段中没有显示任何内容。
  • @Apurva,确保变量 s1 和 s2 实际上包含值。查看我的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 2017-10-05
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
  • 2019-07-28
相关资源
最近更新 更多