3

ここでばかげたことを見逃していますか?

String update = "UPDATE Patients SET fullName = '" + patient.getName() + "', 
                 houseNum = '" + patient.getHouseNum() + "', 
                 address = '" + patient.getAddress() +"', 
                 postCode = '" + patient.getPostCode() + "', 
                 condition = '" + patient.getCondition() +  "', 
                 who = '" + patient.getWho() + "', 
                 time = '" + patient.getTime() + "', 
                 location = '" + patient.getLocation() + "', 
                 actionTaken = '" + patient.getActionTaken() + "', 
                 duration = '" + patient.getDuration() + "' 
                 WHERE regNo = '" +patient.getNHSnum()+"'";

そのために、ここで書式設定するために新しい行ごとに戻りました。私のファイル内では、それは1行にあります。すべてのデータベース フィールドはテキスト型です。

私が得るエラーは次のとおりです。

[Microsoft][ODBC Microsoft Access Driver] Syntax error in UPDATE statement. -3503

編集:

情報については、次の方法で問題なく動作します。

String update = "UPDATE Patients SET fullName = '" + patient.getName() + "', 
                houseNum = '" + patient.getHouseNum() + "', 
                address = '" + patient.getAddress() +"', 
                postCode = '" + patient.getPostCode() + "', 
                condition = '" + patient.getCondition() +  "' 
                WHERE regNo = '" +patient.getNHSnum()+"'";

EDIT2:

完全な更新文字列は次のとおりです。

UPDATE Patients SET fullName = 'Dave', houseNum = '5', address = 'Bla', postCode = 'PQ1 RS2', condition = 'Unknown', who = 'Test', time = 'Test1', location = 'Test2', actionTaken = 'Test3', duration = 'Test4' WHERE regNo = '1'

前述したように、この例では、データベースのすべてのフィールドがテキスト型です。

4

6 に答える 6

3

単純な Statement (SQl インジェクションにつながる) ではなく、PreparedStatementsを使用することを強くお勧めします。

以下は、 PreparedStatement を使用してUpdateを実行する例です。

String query = "UPDATE TABLENAME SET COL1=?, COL2=? WHERE somecondistrue";
Statement st = connection.preparedStatement(query);
st.setString(1, col1value);
st.setString(2, col2Value);
st.executeUpdate();

ご覧のとおり、これはJDBCを使用してSQL クエリを実行するより適切なアプローチです。

于 2012-11-21T21:57:34.410 に答える
3

timeは SQL 予約語です。名前を変更するのが最善です。そうしないと、多くの場合、標準 SQL から逸脱して、ベンダント依存の引用になります。

PreparedStatement のコメントに完全に同意します。

于 2012-11-21T22:17:23.643 に答える
2

num や duration などの数値フィールドにコンマは必要ありません

于 2012-11-21T21:59:23.553 に答える
1

すべてのフィールドは文字列型であるため、PreparedStatementsを使用する必要があります。ここで確認できる唯一の問題は、文字'を含む文字列を渡すことであり、エラーが発生します。

于 2012-11-21T22:03:23.760 に答える
0

他の人が言ったように、あなたは準備されたステートメントを使うべきです。実際、患者名の1つにアポストロフィ(オブライエンなど)が付いているかどうかを検討してください。プリペアドステートメントはその問題を解決します。

最終的なクエリを見ずに他のことを言うのは難しいです。

于 2012-11-21T22:03:44.987 に答える
0

問題はおそらく、更新しようとしている値にアポストロフィ'やその他の特殊文字が含まれていることです。updateステートメントを実行する前に文字列を出力して、これが当てはまるかどうかを確認できます。シンプルな:

System.out.println("update: "+update);

この問題が発生しているかどうかを簡単に確認できます。また、他の人が述べたように、PreparedStatementを使用する場合、SQL インジェクションの問題を心配する必要はなく、この問題にぶつかることはありません。

于 2012-11-21T22:07:47.150 に答える