-1

これは、Excel ファイル データをデータベースに書き込むために使用する私の方法です。

public static void executeSQLUpdate(String sql, List<Object> arguments) {
    Connection con = null;
    PreparedStatement pstmt = null;
    try {
        con = getConnection(); //a method that returns a java.sql.Connection to your database
        System.out.println("\n01)conection :"+con);
        pstmt =  con.prepareStatement(sql);
        System.out.println("\n02)pstn :"+pstmt);
        System.out.println( "\n03)arguments size :"+arguments.size());
        if (arguments != null) {
            int i = 1;
            System.out.println( "\n04)if :"+arguments);
            for(Object o : arguments) {
                 System.out.println( "\n05)executeSQLUpdate");
                 System.out.println( "\n06)object."+o);                 
                 System.out.println("\n07)................... :"+i + o);
                 pstmt.setObject(i, o);
                 System.out.println("\n08)____________________"+i+o);

            }
        }
        System.out.print("\n09)errorchk........... :");
        //method to execute insert, update, delete statements...
        pstmt.executeUpdate();
        System.out.print("\n10)+++++++++++++++++ :");
    } catch(SQLException e) {
        System.out.println("\n11)************* :"+e);
        //handle the error...
    } finally {
        //closing the resources (always in finally block, not in the try!)
        try {
            if (pstmt != null) {
                pstmt.close();
            }
            if (con != null) {
                con.close();
            }
        } catch (SQLException e) {
        }
    }
}

07 まではすべてのシステム アウトが機能しています。しかし、その後、システムアウトは機能しません。その理由は何ですか?この中にエラーはありますか?

これは私のアウトプットです:

run:
AAA     BBB     CCC     
DDD     EEE     FFF     
GGG     HHH     III     
JJJ     KKK     LLL     
MMM     NNN     OOO     
PPP     QQQ     RRR 

01)接続:com.mysql.jdbc.JDBC4Connection@6e70c7

02)pstn :com.mysql.jdbc.JDBC4PreparedStatement@29428e: files_1 値に挿入 (** 指定されていない、指定されていない指定されていない **)

03)引数サイズ:6

04)if :[[AAA, BBB, CCC], [DDD, EEE, FFF], [GGG, HHH, III], [JJJ, KKK, LLL], [MMM, NNN, OOO], [PPP, QQQ, RRR]]

05)executeSQLUpdate :

06) オブジェクト :[AAA、BBB、CCC]

07).................:1[AAA、BBB、CCC]

08) _ _ _ _ _ ___ :1[AAA, BBB, CCC]

05)executeSQLUpdate :

06) オブジェクト :[DDD、EEE、FFF]

07).................:1[DDD、EEE、FFF]

08) _ _ _ _ _ ___ :1[DDD、EEE、FFF]

05)executeSQLUpdate :

06)対象 :[GGG, HHH, III]

07).................:1[GGG、HHH、III]

08) _ _ _ _ _ ___ :1[GGG、HHH、III]

05)executeSQLUpdate :

06)オブジェクト :[JJJ、KKK、LLL]

07).................:1[JJJ、KKK、LLL]

08) _ _ _ _ _ ___ :1[JJJ、KKK、LLL]

05)executeSQLUpdate :

06) オブジェクト :[MMM、NNN、OOO]

07).................:1[MMM、NNN、OOO]

08) _ _ _ _ _ ___ :1[MMM、NNN、OOO]

05)executeSQLUpdate :

06) オブジェクト :[PPP、QQQ、RRR]

07).................:1[PPP、QQQ、RRR]

08) _ _ _ _ _ ___ :1[PPP、QQQ、RRR]

09)errorchk........ : 11) * ** * * : パラメータ 2 に値が指定されていません

java.sql.SQLException: No value specified for parameter 2
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929)
    at com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2560)
    at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2536)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2383)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2327)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2312)
    at com.project.bulk.ReadExcelFile.executeSQLUpdate(ReadExcelFile.java:112)
    at com.project.bulk.ReadExcelFile.MethodToData(ReadExcelFile.java:138)
    at com.project.bulk.ReadExcelFile.main(ReadExcelFile.java:39)

BUILD SUCCESSFUL (合計時間: 3 秒)

4

2 に答える 2

3

確かに1つのエラーは、2回インクリメントすることですi!!!

System.out.println("\n07)..................."+i++ + o); // one
pstmt.setObject(i++, o); // two

これは、偶数のインデックスを設定せず、奇数のインデックスのみを設定することを意味します: 1、3、5...

これにより、次のエラーが修正されます。

System.out.println("\n07)..................."+i + o); 
pstmt.setObject(i++, o); // only once, and after the evaluation!

EDIT * 2番目ですが、大きな間違いもあります *

} catch(SQLException e) {
    System.out.println("\n11)************* :"+e); //WTF?
    //handle the error...    
}

叫んですみません、これは今起こらなければなりません!

私たちとあなたの(将来の)同僚のメンタルヘルスのために、二度とこれをしないでください!

印刷例外は、次の 2 つの方法のいずれかで発生する必要があります。

  • logger.error("メッセージ", e);
  • e.printStackTrace();

これらはスタック トレースを予約するため、コードの適切なデバッグが可能になります。

しかし、決して、決して、決して、決してすべきではありません!次のいずれかの方法で発生します。

  • System.out.print(e)
  • System.out.print(e.getMessage)
  • System.out.print("メッセージ" + e.getMessage)
  • logger.error(e.getMessage)

したがって、正しくは次のようになります。

} catch(SQLException e) {
    System.out.println("\n11)************* :"+e.getMessage()); 
    e.printStackTrace();
    //TODO: handle the error...    
}

ところで、 log4j のような適切なロギングを使用することは、時間の価値があります! 適切なログレベルを設定するよりも、すべての System.out.* をクリーンアップする方がはるかに時間がかかります...

EDIT2

SQLエラーについては:

String sql = "INSERT INTO files_1 VALUES(?)"; 

この SQL 行は、処理するパラメーターが 1 つあることを DBMS に伝えます。テーブルには 3 つの列があるため、3 つの値を指定する必要があります。定数またはパラメータ ( を使用?)。したがって、次のものが必要です。

String sql = "INSERT INTO files_1 VALUES(?,?,?)"; 
于 2013-02-19T08:57:29.347 に答える
1

あなたのエラーによって示されるように

java.sql.SQLException: Invalid argument value: java.io.NotSerializableException

次の行でシリアル化できないパラメータを使用して値を設定しようとしています。

pstmt.setObject(i++, o);

Stringすべての値がプリミティブであるか、またはのようなデータベース列にマップできる値であることを確認してくださいDate

次のような行を入力することで、設定しようとしているデータを見つけることができます(ロギングフレームワークまたはSystem.out.println:を使用して)

System.out.println("setObject: " + o + ", Class: " + o.getClass());
于 2013-02-19T09:16:15.357 に答える