-3

1.プログラムは他の行に対して引き続き実行されますが、このエラーは特定の行に対してのみ発生します。挿入する134789行がある場合、約133666行のみが挿入されます。すべての行の形式は、ログファイルと同じです。

 *com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near the keyword 'In'.
            at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)
            at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1515)
            at com.microsoft.sqlserver.jdbc.SQLServerStatement.doExecuteStatement(SQLServerStatement.java:792)
            at com.microsoft.sqlserver.jdbc.SQLServerStatement$StmtExecCmd.doExecute(SQLServerStatement.java:689)
            at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:5696)
            at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1715)
            at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:180)
            at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:155)
            at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeUpdate(SQLServerStatement.java:642)
            at Access.insertIntoDatabase(Access.java:186)
            at appWindowLog$1thread1.run(appWindowLog.java:233)
            at java.lang.Thread.run(Unknown Source)*
4

2 に答える 2

2

PreparedStatementの使用を検討してください。ログ行に'、挿入ステートメントを壊す予期しない記号が含まれている可能性があります。PreparedStatementを使用すると、パラメーターが正しい方法でエスケープされます。

于 2012-05-30T10:05:15.443 に答える
2

ご存知のとおり、これは初心者レベルのヒントです。

エラーのあるSQLステートメントを見つけます。

真剣に。

例外ハンドラーで、SQLを出力し、何が問題なのかを確認します。それはあなたに打撃を与える正確なSQLを与えるでしょう。エラーメッセージを考えると、基本的にSQLインジェクションのような問題があります。フィールド内の何かをエスケープする必要があります。これは、パラメータを使用せずにステートメントを作成するための問題です(BAD BAD BAD)。

キーワード「In」の近くの構文が正しくありません。

IN(INTOではない)は、INSERT INTO ... VALUES ...構文に表示されるキーワードではないため、何かが発生します。たとえば、'-を含む文字列では発生しないはずですが、....まあ;)明らかに発生します。

あなたがそれを見つけたら、グーグルに「SQLインジェクション」と入力してそれについて学びましょう-同じアプローチで実行されます。SQLをそのようにまとめることはもうありません(または誰かが見つけたときに解雇されるに値します)。

于 2012-05-30T10:08:43.373 に答える