1

JavaからMysqlにいくつかの値を挿入しようとすると、構文エラーが発生します。

私のコードは次のようになります。

date = new SimpleDateFormat("yyyy-MM-dd").parse(nextLine[0]);
        java.sql.Timestamp sqlDate = new java.sql.Timestamp(date.getTime());
        st.executeUpdate("INSERT INTO " + tick + "(day, open, high, low, close, volume) VALUES (" + sqlDate + ", " + nextLine[1] + ", " + nextLine[2] + ", " + nextLine[3] + ", " + nextLine[4] + ", " + nextLine[5] + ")"); 

私の例外:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:SQL構文にエラーがあります。1行目の「00:00:00.0、128.40、128.50、127.30、128.20、1415200)」の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

助けていただければ幸いです:)

4

3 に答える 3

6

即時の構文エラーを修正することは可能ですが、私はそれを強くお勧めします。SQLに値を直接含めるべきではありません。

代わりに、を介してパラメーター化されたクエリを使用し、代わりにPreparedStatement値をパラメーターに設定します。この場合、PreparedStatement.setTimestamp値を設定するために使用します-もちろん、最初にパラメーター化されるようにクエリを変更した後です。

パラメータ化されたSQLの利点:

  • Prevention of SQL injection attacks
  • Avoidance of error-prone string conversions (as witnessed in this case)
  • Separation of code and data, leading to SQL which is simpler to read
于 2012-10-05T20:19:06.940 に答える
1

強力な提案:

1)executeUpdate()を呼び出す前に、Java文字列変数を作成します

2)文字列が構文的に正しいことを確認します(引用符で囲まれた日付、値の間のコンマなど)

また:

「準備」はあなたの友達です;)

あなたはすでにそれらを使用しているかもしれないと思います...しかしあなたはコードのその部分を表示しませんでした...そして私は確かに目印( "?")を見ませんでした

しかし、1)最初に文字列を作成し、2)JDBC呼び出しの前に(たとえばデバッガーで)文字列を検査することは大きな助けになると思います...私見...

于 2012-10-05T20:18:58.483 に答える
0

Dates need to be quoted in MySQL so you'll ned to wrap sqlDate with single quotes:

st.executeUpdate("INSERT INTO " + tick + "(day, open, high, low, close, volume) VALUES ('" + sqlDate + "', " + nextLine[1] + ", " + nextLine[2] + ", " + nextLine[3] + ", " + nextLine[4] + ", " + nextLine[5] + ")");

I'm assuming the other values are numeric and therefore are safe without quotes.

The biggest issue with this approach is that you are susceptible to SQL injection attacks. You should switch to using prepared statements instead:

PreparedStatement ps = conn.prepareStatement("INSERT INTO my_table(day, open, high, low, close, volume) VALUES (?,?,?,?,?,?)");
ps.setTimestamp(1, sqlDate);
ps.setBigDecimal(2, nextLine[1]);
...
于 2012-10-05T20:22:01.530 に答える