2016-12-21 7 views
0

BLOBの更新に問題がありますが、BLOB/Tryinngの更新に関するすべてを取り除くと、pst.executeUpdateは実行されませんBlobはすべて他のもの、つまりID、名前、住所などを更新します。すべてが機能するはずですが、問題はBlobだけです。Java/JDBC/SQLite - BLOBを更新する際の問題

updateEmployee.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      // TODO Auto-generated method stub 
      Connection connection = null; 
      PreparedStatement pst = null; 

      try { 

       Class.forName("org.sqlite.JDBC"); 
       connection = DriverManager.getConnection("jdbc:sqlite:employeeDatabase.sqlite"); 
       connection.setAutoCommit(false); 



       int idVal = Integer.parseInt(idTextField.getText()); 
       String nameVal= nameTextField.getText(); 
       String genderVal = genderTextField.getText(); 
       String dobVal = dobTextField.getText(); 
       String addressVal = addressTextField.getText(); 
       String postcodeVal = postcodeTextField.getText(); 
       String ninVal = ninTextField.getText(); 
       String jobVal = jobtitleTextField.getText(); 
       String startDateVal = startdateTextField.getText(); 
       String salaryVal = salaryTextField.getText(); 
       String emailVal = emailTextField.getText(); 
       //Icon photoBlob = photoLabel.getIcon(); 
       InputStream img = new FileInputStream(s); 
       String sql = "UPDATE employees set ID= '"+ idVal+"', Name = '"+ nameVal +"', Gender ='"+ genderVal+"', DOB='"+ dobVal+"', Address ='"+ addressVal+"', Postcode ='"+ postcodeVal+"', NIN ='"+ ninVal+"', JobTitle='"+ jobVal+"', StartDate ='"+ startDateVal+"', Salary ='"+ salaryVal+"', Email='"+ emailVal+"', Images='"+ img+" WHERE ID= '"+ idVal+"'"; 

       pst = connection.prepareStatement(sql); 
       pst.setInt(1,Integer.parseInt(idTextField.getText())); 
       pst.setString(2, nameTextField.getText()); 
       pst.setString(3, genderTextField.getText()); 
       pst.setString(4, dobTextField.getText()); 
       pst.setString(5, addressTextField.getText()); 
       pst.setString(6, postcodeTextField.getText()); 
       pst.setString(7, ninTextField.getText()); 
       pst.setString(9, startdateTextField.getText()); 
       pst.setString(10, salaryTextField.getText()); 
       pst.setString(11, emailTextField.getText()); 
       pst.setBytes(12, readFile(s)); 

       pst.executeUpdate(); 




       System.out.println("Employee Updated"); 
       JOptionPane.showMessageDialog(null, "Employee has successfully been updated");    


       connection.commit(); 
       pst.close(); 
       connection.close(); 
      } 
      catch (Exception e1) { 

       if(idTextField.getText().equals("")){ 
        JOptionPane.showMessageDialog(null, "Please Ensure An Employee Has Been Selected"); 
       } 
      } 
     }}); 

編集 -

私はしかし、挿入およびBLOBファイルを削除するだけでなく、取得することができます。このアップデートだけで私に問題が生じています。

+1

、再び、につながるSQL文の中にどのような状況のCONCATENATEパラメータ値の下にないしないでくださいSQLインジェクション攻撃。それを読んで、preparedStatementとsetParameterを使用してください。ある日、あなたは私のクレジットカードやパスワードを侵害するハッキングの責任を負いません。 –

+0

@ TonyBenBrahimそうですね..... – TheNotoriousCoder

答えて

1

SQLコマンドテキストは、パラメータ化されたクエリには有効ではありません。代わりに、あなたは...

String sql = "UPDATE employees set ID = ?, Name = ?, Gender = ?, DOB = ?, Address = ?, Postcode = ?, NIN = ?, JobTitle = ?, StartDate = ?, Salary = ?, Email = ?, Images = ? WHERE ID = ?; 

をパラメータプレースホルダとして疑問符でコマンド文字列を使用する必要があります... ...

String sql = "UPDATE employees set ID= '"+ idVal+"', Name = '"+ nameVal +"', Gender ='"+ genderVal+"', DOB='"+ dobVal+"', Address ='"+ addressVal+"', Postcode ='"+ postcodeVal+"', NIN ='"+ ninVal+"', JobTitle='"+ jobVal+"', StartDate ='"+ startDateVal+"', Salary ='"+ salaryVal+"', Email='"+ emailVal+"', Images='"+ img+" WHERE ID= '"+ idVal+"'"; 

を埋め込まれた値を使用して、動的SQLコマンド文字列を作成します。パラメータ値を設定するには.setInt,.setString,.setBytesなどを使用します。

(あなたが... WHERE ID = ?を使用しているとき、それは「ID」値SETに実際に冗長であることにも注意。)

+0

答えをありがとう。実行に関しては機能しますが、データベースは更新されません。 – TheNotoriousCoder

+0

'executeUpdate'は影響を受ける行の数を示す' int'値を返さなければなりませんので、ゼロでないことを確認してください。また、正しい数のパラメーターを正しい順序で指定し、正しいタイプのものであることも確認してください。 –

+0

まだBLOBに問題がありますが、問題ありません。私はそれを更新することを騒がすつもりはない。 – TheNotoriousCoder