-1

我的数据库包中有这两个类:(DBManager 和 TaskManager 类),我在另一个包中的主框架中创建了一个新对象,我还为我的主框架导入了数据库包,然后调用 addBirth()我的对象,我想在 MySQL 中的 table="birthsql" 中插入这些参数,但我找到了这个堆栈跟踪,并且还写了“SERVER = NULL”。

创建对象--> TaskManager tm = new TaskManager(); 在我的对象上调用 addBirth() 方法-->, tm.addBirth(3, "Neda","Rahmani", "Mansour", "Sima","December","Tehran");

我的 TaskManager 类:

public class TaskManager {
private int BirthID = 2;
Logger logger = Logger.getLogger(this.getClass().getName());
private Connection conn = DBManager.getConnection();

public int getID()
{
    return BirthID++;
}

public void addBirth(int BirthID, String name, String family, String fatherName, String motherName, String DateOfBirth, String PlaceOfBirth) {
    try {
        Statement stm = conn.createStatement();

        stm.executeUpdate("INSERT INTO birthsql (name," + "family," + "fatherName," + "motherName," + "DateOfBirth, " + "PlaceOfBirth)" + "VALUES (" + BirthID + ", '" + name + "', '" + family + "', '" + fatherName + "', '" + DateOfBirth + "', '" + PlaceOfBirth + "')");
    } catch (SQLException ex) {
        Logger.getLogger(TaskManager.class.getName()).log(Level.SEVERE, null, ex);
    }


}}

我的 DBManager 类:

public class DBManager {

private static Logger log = Logger.getLogger(DBManager.class.getName());
private static Connection connection = null;
private final static String DB_URL = "jdbc:mysql://localhost:3306/assignment_2";
private final static String DB_USERID = "root";
private final static String DB_PASSWORD = "123";

public static Connection getConnection()
{
    if (connection == null)
    {
        try {
            /* Your code here */
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(DB_URL, DB_USERID, DB_PASSWORD);
        } catch (SQLException ex) {
            Logger.Dec 10, 2009 6:44:05 AM database.DBManager getConnection

        } catch (ClassNotFoundException ex) {
            Logger.getLogger(DBManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    return connection;
}}

堆栈跟踪----->

  Dec 10, 2009 11:13:20 AM database.Manager addBirth
        SEVERE: null
        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 'name,mother name,date of birth,place of birth) VALUES('Neda','rahmani','Mansour'' at line 1
                at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
                at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
                at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
                at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
                at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
                at com.mysql.jdbc.Util.getInstance(Util.java:381)
                at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1030)
                at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
                at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)
                at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)
                at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
                at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
                at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2536)
                at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1564)
                at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1485)
                at database.Manager.addBirth(Manager.java:34)
                at AdminGUI.MainFrame.<init>(MainFrame.java:51)
                at AdminGUI.MainFrame$86.run(MainFrame.java:1884)
                at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
                at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
                at   java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
                at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
                at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
                at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
                at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
                at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
4

4 回答 4

2

答案在堆栈跟踪的开头:

  You have an error in your SQL syntax; ....
  'name,mother name,date of birth,place of birth) 
  VALUES('Neda','rahmani','Mansour''

问题是您的字段名称。它们可能不包含空格。此外,您的列数已关闭,您忘记了前面的 BirthID 和值部分中的 MotherName。

堆栈输出似乎不是来自此代码片段。我看不出你是如何从“INSERT INTObirthsql”部分创建那些坏的(包含空格的)名称的。报价平衡得当:

   Should be more like:  (pseudo-code)
   INSERT INTO
      birthsql
        (BirthID, name,  family,  fatherName,  motherName, 
         DateOfBirth,   PlaceOfBirth)
      VALUES
        (BirthID,'name','family','fatherName','motherName',
         'DateOfBirth','PlaceOfBirth')

尝试像上面那样格式化您的代码,以便让事情变得简单。

这是清理工作的快速尝试。我会使用一些两个数组和一些连接,但这是 qnd:另外,我不知道这是否可行。可能需要换行符。

   stm.executeUpdate("
    INSERT INTO birthsql (
     birthid,           name,              family,
     fatherName,        motherName,        DateOfBirth,        PlaceOfBirth)
    VALUES ("+
     BirthID     +",'"+ name       +"','"+ family      +"','"+ 
     fatherName +"','"+ motherName +"','"+ DateOfBirth +"','"+ PlaceOfBirth +"')"
   );
于 2009-12-10T08:29:52.350 回答
1

您确定执行了正确版本的代码吗?您的代码看起来"INSERT INTO birthsql (name,family,fatherName,motherName,DateOfBirth, PlaceOfBirth)"(我删除了" + "字符串常量中的无意义),但您的堆栈跟踪显示name,mother name,date of birth,place of birth了完全不同的代码(并且由于列名中的空格而没有有效的 SQL)。

另一个问题是参数的数量。这些值在名称之前以 BirthID 开头,但列不包含该值的列!

最后,输出不是SERVER = NULL,而是SEVERE: null。我认为 catch SQLException 的 Logger 调用与 ClassNotFoundException 相同,所以这就是您的日志输出(Level SEVERE、消息 null、可抛出的堆栈跟踪)。

PS:将静态变量命名为与参数名称相同的名称非常令人困惑 - 不要这样做!

于 2009-12-10T08:23:56.277 回答
0

另外:您不想使用字符串连接来创建包含值的 SQL 语句。

必须使用 aPreparedStatement代替,否则您可能会受到SQL 注入攻击

于 2009-12-10T08:34:39.627 回答
0

问题似乎是列不匹配。BirthID 似乎与您在 INTO 子句中设置的列不对应。

于 2009-12-10T08:28:09.623 回答