-1

データベース パッケージに次の 2 つのクラスがあります:(DBManager と TaskManager クラス)。メイン フレームに新しいオブジェクトを作成します。これは他のパッケージにあり、メイン フレームのデータベース パッケージもインポートし、addBirth() を呼び出しますこれらの引数を MySQL の my 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')

上記のようにコードをフォーマットして、物事をまっすぐに保つのが簡単になるようにしてください。

クリーンアップを簡単に紹介します。いくつかの 2 つの配列といくつかの結合を使用しますが、これは 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はありません)。

もう 1 つの問題は、パラメーターの数です。値は名前の前に BirthID で始まりますが、列にはこの値の列が含まれていません!

最後に、出力はSERVER = NULLではなくSEVERE: nullです。catch SQLException の Logger 呼び出しは ClassNotFoundException の場合と同じだと思うので、それがログ出力です (レベル SEVERE、メッセージ null、throwable のスタック トレース)。

PS: パラメータ名と同じ名前を静的変数に付けるのは非常に混乱します - そうしないでください!

于 2009-12-10T08:23:56.277 に答える
0

問題は列の不一致のようです。BirthID は、INTO 句で設定した列に対応していないようです。

于 2009-12-10T08:28:09.623 に答える
0

また、文字列連結を使用して、値を含む SQL ステートメントを作成したくない場合。

代わりにa を使用する必要があります。そうしないと、 SQL インジェクション攻撃を受ける可能性があります。PreparedStatement

于 2009-12-10T08:34:39.627 に答える