0

Java PreparedStatementsを使用すると、SQL構文エラーに関する問題が発生します。

私が準備しようとしている3つのステートメントは次のとおりです。

insertBook = con.prepareStatement("INSERT INTO Books ? VALUES ?");
selectBooks = con.prepareStatement("SELECT * FROM Books?");
deleteBooks = con.prepareStatement("DELETE FROM Books?");

最初のステートメントでは、2つの文字列を渡します。1つは挿入する列のリストを含み、もう1つは挿入するすべての値を含みます。他の2つのステートメントでは、最後に(オプションの)WHERE句を挿入したいと思います。

私はすでに同様の問題を扱っているように見えるこの質問を見ましたが、彼の場合、彼はそれが意味をなさないところで?sを使おうとしているように見えました。SQLで失敗しない限り、ここに文字列を挿入できない理由はわかりません。私はJavadocを精査しましたが、そこでも説明を思い付くことができないようです。

どうもありがとう!

4

3 に答える 3

1

それが設計された方法です。?-sはパラメータのみに残されていますStringBuilder。「WHERE」句を連結するために使用することを検討してください。

これは、uがここでは使用できない単純なケースStringBuilderであり、複雑なクエリを作成するのに効果的です。

これがあなたの例です

String whereClause = " WHERE Id = ?";

String insert = "INSERT INTO [Table](C1, C2) VALUES(?, ?)";
String select = "SELECT * FROM [Table] ";
String update = "UPDATE [Table] SET C1 = ? ";
String delete = "DELETE FROM [Table] ";

PreparedStatement insertSt = con.prepareStatement(insert);
PreparedStatement selectSt = con.prepareStatement(select + whereClause);
PreparedStatement deleteSt = con.prepareStatement(update + whereClause);
PreparedStatement updateSt = con.prepareStatement(delete + whereClause);
于 2013-03-04T19:07:05.920 に答える
0

あなたの最初の声明のために:

insertBook = con.prepareStatement("INSERT INTO Books ? VALUES ?");

?後の2番目から始めVALUESます。プレースホルダーは1つ?しかないため、ステートメントに渡すことができる値は1つだけです。その部分だけでは、JDBCでは目標を達成できません。実際、prepareStatement()は、少なくとも一部のドライバーとデータベースでは、ステートメントをデータベースサーバーに送信し、ステートメントを準備するように指示します。サーバーはその時点でステートメントを解析および計画するため、その時点で列とパラメーターの数を知っている必要があります。

于 2013-03-04T19:07:59.447 に答える
0

「?」JDBCは、基盤となるDBMSプロトコルでサポートされているパラメータ置換と密接に関連しています。ただし、パラメータを置き換えるのではなく、DBに送信される実際のSQLを変更しようとしています。

于 2013-03-04T19:08:38.727 に答える