PreparedStatement を使用して Oracle DB にレコードを INSERT しようとしていますが、このエラーしか発生しません。この時点で、それを克服するための私の努力は私の進歩をはるかに上回っているので、別の目が役立つかもしれません. 無効な文字はどこにありますか?
私が見つけた多くのこと;
は、SQL文字列内の末尾の「」が原因である可能性があることを示唆していますが、最初からステートメントに含まれていません。
私の接続自体は、プログラムの他のいくつかの場所で完全に機能します。
Properties props = new Properties();
props.setProperty( "user", username );
props.setProperty( "password", password );
props.setProperty( "defaultRowPrefetch", "10" );
props.setProperty( "defaultBatchValue", "10" );
props.setProperty( "processEscapes", "false" );
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
Connection conn = DriverManager.getConnection(DB_URL_SVC, props);
私がやりたい方法(3つの文字列を受け入れるメソッドでラップすることを除いて)ですが、SQLSyntaxErrorExceptionをスローします
String INSERT_BIKE = "INSERT INTO RACEBIKES ( BIKENAME , COUNTRY_OF_ORIGIN , COST ) VALUES ( ? , ? , ? )";
PreparedStatement preStatement = conn.prepareStatement( INSERT_BIKE );
preStatement.setString(1, "JHT");
preStatement.setString(2, "USA");
preStatement.setInt(3, 2500);
preStatement.executeUpdate(); // ORA-00911: invalid character error
これは機能しますが、パラメーターがハードコーディングされているため、PreparedStatement を使用する目的が無効になります。
String INSERT_BIKE = "INSERT INTO RACEBIKES ( BIKENAME , COUNTRY_OF_ORIGIN , COST ) VALUES ( 'JHT' , 'USA' , '2500' )";
PreparedStatement preStatement = conn.prepareStatement( INSERT_BIKE );
preStatement.executeUpdate();
動作します。ただし、変数を一重引用符と二重引用符で連結することも、実際には最善の方法ではないことを理解しています。
String value1 = "JHT";
String value2 = "USA";
int value3 = 2500;
String INSERT_BIKE = "INSERT INTO RACEBIKES ( BIKENAME , COUNTRY_OF_ORIGIN , COST ) VALUES ( '" + value1 + "', '" + value2 + "', '" + value3 + "' )";
PreparedStatement preStatement = conn.prepareStatement( INSERT_BIKE );
preStatement.executeUpdate();
SQLSyntaxErrorExceptionで失敗します。したがって、引用構文を自分でコーディングしても、これらの変数を preStatement.setString() に配置することはできません。これにより、少なくとも多少の柔軟性が得られます。
String INSERT_BIKE = "INSERT INTO RACEBIKES ( BIKENAME , COUNTRY_OF_ORIGIN , COST ) VALUES ( ? , ? , ? )";
PreparedStatement preStatement = conn.prepareStatement( INSERT_BIKE );
preStatement.setString(1, "' + value1 + '");
preStatement.setString(2, "' + value2 + '");
preStatement.setInt(3, "' + value3 + '");
preStatement.executeUpdate(); // ORA-00911: invalid character error
失敗します。String のプレースホルダーを一重引用符で囲むと、SQLExceptionが発生します。
String INSERT_BIKE = "INSERT INTO RACEBIKES ( BIKENAME , COUNTRY_OF_ORIGIN , COST ) VALUES ( '?' , '?' , '?' )";
PreparedStatement preStatement = conn.prepareStatement( INSERT_BIKE );
preStatement.setString(1, "JHT");
preStatement.setString(2, "USA");
preStatement.setInt(3, 2500);
preStatement.executeUpdate(); // invalid column index
失敗します。String 内の 2 つのプレースホルダーString
( ではない) を一重引用符で囲むと、 SQLExceptionが発生します。int
String INSERT_BIKE = "INSERT INTO RACEBIKES ( BIKENAME , COUNTRY_OF_ORIGIN , COST ) VALUES ( '?' , '?' , ? )";
PreparedStatement preStatement = conn.prepareStatement( INSERT_BIKE );
preStatement.setString(1, "JHT");
preStatement.setString(2, "USA");
preStatement.setInt(3, 2500);
preStatement.executeUpdate(); // invalid column index
これは失敗しませんが、データベースにも書き込みません(自動コミットを無効にしていませんが)。
String INSERT_BIKE = "INSERT INTO RACEBIKES ( BIKENAME , COUNTRY_OF_ORIGIN , COST ) VALUES ( ? , ? , ? )";
PreparedStatement preStatement = conn.prepareStatement( INSERT_BIKE );
preStatement.setString(1, "JHT");
preStatement.setString(2, "USA");
preStatement.setInt(3, 2500);
preStatement.executeBatch();
また、バックスラッシュ、ダブル バックスラッシュ、バッククォート、quitsies、no-startsies、erasies、double-stamps、および tofus-make-it-true を使用して、すべてのエスケープを試しました。誰かが私を助けてくれるブードゥー教を知っているかも!?