2012-02-04 9 views
0

私はJavaとMySQLを使ってこの小さなクイズを学校プロジェクト用に作成しました。今私のプロジェクトは正常に動作しますが、実験として私の質問に画像を追加しようとしました。 Question jFrameは質問とすべてのオプションをデータベースから直接取り出します.quesは最後に8つの列があり、 "path"はvarchar(500)です。ここで質問を追加する私のJavaコードは次のとおりです。 -MySQLのVarcharにバックスラッシュを追加

try { 
     Class.forName("java.sql.Driver"); 
     Connection con = (Connection) DriverManager.getConnection(jdbcurl, user, pass); 
     Statement st = con.createStatement(); 
     ResultSet rt = st.executeQuery("SELECT qno from ques order by qno desc limit 1");  
     // get last qno primary key 
     for (; rt.next();) { 
      qno = (Integer) rt.getObject(1);             // save qno as int 
     } 
     nqno = qno + 1; // create new qno 
     if (path == null){ 
      String query1 = "insert into ques values (" + nqno + ",'" + question + "','" + ans1 + "','" + ans2 + "','" 
          + ans3 + "','" + ans4 + "','" + ca + "',null);"; // ca is correct answer and null is path 
     Statement st1 = con.createStatement(); 
     st1.executeUpdate(query1); 
     System.out.println("query : "+query1); 
     JOptionPane.showMessageDialog(this, "Question added successfully! Without Image");} 
     else { 
      String query1 = "insert into ques values (" + nqno + ",'" + question + "','" + ans1 + "','" + ans2 + "','" 
         + ans3 + "','" + ans4 + "','" + ca + "','"+path+"');"; 
      System.out.println("query :" +query1); 
      Statement st1 = con.createStatement(); 
      st1.executeUpdate(query1); 
      JOptionPane.showMessageDialog(this, "Question added successfully! with image"); 
     } 
    } catch (Exception e) { 
    JOptionPane.showMessageDialog(this, "Error in code"); 

クエリが クエリだっ送ら '123'、 '123'、QUES値(12 '123'、 '123'、 '123' に挿入します、 '123'、 'F:\ JavaQuiz \ src \ javaquiz \ About.png'); いいえ、例外は処理されません。 しかし、SQLではパスは次のように保存されます。 - F:JavaQuizsrcjavaquizAbout.png

データベースではバックスラッシュは省略されています。私はそうしたくない。私のQuestion.javaでこのリンクを後で呼び出すことができるように

Please ..何か提案がありますか?

(私はこれがばかな質問であれば、私はプログラミングに新しいごめんなさいごめんなさい)Javaで

+0

「F:\\ JavaQuiz \\ src \\ javaquiz \\ About.png」)のように2つのバックスラッシュを追加すると考えました。問題を修正します。 しかし、私はどのように私の文字列にそれを追加するのですか? –

+0

path = path.replaceAll( "\\"、 "\\\\");すべての\を¥¥ –

+0

に置き換えますIDEがエラーを返す:正規表現が無効です:予期しない内部エラー。 コードも例外をキャッチします。 –

答えて

3

ステートメントの代わりにユーザーPreparedStatementを設定し、パラメーターを設定します。これにより、必要なエスケープ文字で正しいStringが設定されます。

String query1 = "insert into ques values (?,?,?,?,?,?,?,?)"; 
PreparedStatement ps=connection.prepareStatement(query1); 
ps.setInt(1,nqno); 
ps.setString(2,question); 
ps.setString(3,ans1); 
ps.setString(4,ans2); 
ps.setString(5,ans3); 
ps.setString(6,ans4); 
ps.setString(7,ca); 
ps.setString(8,path); 
ps.executeUpdate(); 

例外については、try..catchを実行してください。

+0

さて、パラメータの設定方法は?少しの例がありますか? –

+0

これを見てください:http://stackoverflow.com/questions/5604943 –

+0

必要なコードで更新しました –

0

(とC、C++、C#)文字列のバックスラッシュ文字は、特別な「エスケープ」文字です。バックスラッシュを表すには\\を使用するか、文字列ではなくプリペアドステートメントを使用してパラメータを使用するように挿入を変更する必要があります。

Java Character Escape Code Reference

(それとも/スラッシュを使用するようにパスを変更)を参照してください。

関連する問題