0

Web サイトの情報をアクセス データベースに取得しようとしています。Web サイトから取得した情報から Bean を作成し、その Bean をデータベースに送信しています。問題は、例外によって特定のものをデータベースに入れることがブロックされていることです。例外 -

net.ucanaccess.jdbc.UcanaccessSQLException: unexpected token: (token) required:

したがって、この例外を生成している値と共通するものを確認しました。それはアポストロフィです。例外を呼び出しているすべての値にはアポストロフィが含まれており、今のところ実際に変更することはできません。だから私はどうすれば ucanaccess がそのアポストロフィを例外なくアクセスできるようにするのか疑問に思っていましたか?

これはクエリステートメントです

stmnt = conn.prepareStatement("INSERT INTO Table1(doctorName , description , specialty1 , specialty2 , personalSite , clinic1 , phone1 , clinic2 , phone2 , clinic3, phone3 ,worksWith) VALUES (?,?,?,?,?,?,?,?,?,?,?,?");  

            stmnt.setString(1,tempBean.getDoctorName());
            stmnt.setString(2,tempBean.getDescription());
            stmnt.setString(3,tempBean.getSpeciality1());
            stmnt.setString(4,tempBean.getSpeciality2());
            stmnt.setString(5,tempBean.getPersonalSite());
            stmnt.setString(6,tempBean.getClinic1());
            stmnt.setString(7,tempBean.getPhone1());
            stmnt.setString(8,tempBean.getClinic2());
            stmnt.setString(9,tempBean.getPhone2());
            stmnt.setString(10,tempBean.getClinic3());
            stmnt.setString(11,tempBean.getPhone3());
            stmnt.setString(12,tempBean.getWorksWith());

            stmnt.executeUpdate();
4

2 に答える 2

2

SQL インジェクションとして知られる一般的な問題が発生しています。

Java でこれが起こらないようにする方法は、PreparedStatements を使用することです。良い例として、別の質問からのこの回答を見てください。

于 2015-03-17T21:37:14.053 に答える
1

将来の読者のために:

SQLInjection を回避し、テキスト値をエスケープする必要を回避するには、PreparedStatement を使用する必要があります。SQL (すべての dbms とすべてのドライバー) では、この特定のケースでは、別のアポストロフィでアポストロフィをエスケープする必要があります。

xxx'xxx という単語は xxx''xxx にエスケープする必要があります。

UCanAccess は Access 構文をサポートしているため、アポストロフィの代わりに二重引用符 " 区切り文字を使用した場合も同じことが有効です (この場合、単語の途中にある二重引用符は別の二重引用符でエスケープする必要があります ")。
そうでない場合、SQL エンジンは、アポストロフィがテキストの区切り記号なのか、それとも単語の一部なのかを認識できません。しかし、PreparedStatement を使用すれば、その心配はありません。

于 2015-03-17T23:15:57.750 に答える