2

クライアントがサーバーと通信できるようにするJavaソケットアプリを作成しています。他の要件の1つは、JDBCを初期化する必要があることです。JDBC 接続メソッドを正しく記述したと思います。同様のプロジェクトで挿入ステートメントがこのように機能しました。私はIDEを使用していないので、単純な間違いかもしれません.誰かが私のSQL文の何が問題なのか教えてもらえますか? すべての情報は正しいですが、コンパイルされません。

エラー:

C:\Users\imallin\My Documents> javac provider.java
Provider.java:88 ';' expected 
String sql = "Insert INTO 'users' ('ID', 'firstName') VALUES ("123","123")";
4

5 に答える 5

5

当面の問題は、文字列に含まれる二重引用符をエスケープする必要があることです。これは、コンパイラが別のものを参照"すると、それが文字列定義の終わりであると考え、セミコロンを実行するためです。

String sql = "Insert INTO 'users' ('ID', 'firstName') VALUES (\"123\",\"123\")";

Java コンパイラーが問題なく動作するようになったので、SQL 関連の問題が発生します。

一般に、SQL では、単一引用符を使用して文字列を表す必要があります。MySQL は特に二重引用符を許可しているようですが、SQL QUOTES ANSI モードが設定されていない場合のみです。したがって、ここでは単一引用符を使用して文字列を表すのが最善です。

ID列が整数で、firstName列が文字列/varchar であると仮定すると、おそらく次のようになります。

String sql = "Insert INTO users (ID, firstName) VALUES (123,'123')";
于 2012-05-08T14:40:54.163 に答える
2

投稿された他の回答と少し異なるようにするには、SQL で二重引用符を使用しないでください。使用した単一引用符はすべて間違った場所にあり、二重引用符は単に許可されていません。ステートメントは次のようになります

String sql = "Insert INTO users (ID, firstName) VALUES ('123','123')";
于 2012-05-08T14:41:57.253 に答える
1

行で:

String sql = "Insert INTO 'users' ('ID', 'firstName') VALUES ("123","123")";

二重引用符で囲まれた文字列は、の後に終了しVALUES (、直後に数値トークンが続きます。これはJavaでは違法です。差し迫った修正は、円記号を追加することです。

String sql = "Insert INTO 'users' ('ID', 'firstName') VALUES (\"123\",\"123\")";

これも機能しますが(文字列ではなく整数について話していると仮定して):

String sql = "Insert INTO 'users' ('ID', 'firstName') VALUES (" + 123 + "," + 123 + ")";

ただし、より一般的には、パラメーター化を使用せずにINSERTを実行していることが問題です。これは、実際のコードでは事実上常に間違っています。JDBCは、パラメーター化されたクエリを適切にサポートしており、これを使用する必要があります。

于 2012-05-08T14:49:09.980 に答える
1

SQL ステートメントで二重引用符をエスケープしていないようです。Java は、文字列が最初の 123 より前に終了していると見なします。

于 2012-05-08T14:40:54.903 に答える
0

代わりに一重引用符を使用できます。

"INTOユーザー(ID、firstName)VALUES( '123'、 '123')を挿入します";

于 2012-05-09T05:53:58.020 に答える