2016-10-19 7 views
0

データベースに行を挿入するためにpreparedStatementを使用してSQLデータベースを持つJavaアプリケーションがあります。シリアルナンバー(ユニーク)に基づいて行を更新できるようにしたい。JavaでpreparedStatementでSQLデータベースを更新

Connection conn = null; 
    Statement st = null; 
try { 
    conn = DriverManager.getConnection ("jdbc:derby://localhost:1527/db01", "Administrator", "admin"); //run procedure getConnection to connect to the database - see below 
    st = conn.createStatement(); //set up a statement st to enable you to send SQL statements to the database. 
} catch (SQLException ex) { 
    Logger.getLogger(FormTwo1.class.getName()).log(Level.SEVERE, null, ex); 
} 


     System.out.println ("Successful Connection"); 

...

String query = "insert into TB01(SERIAL,BLADETYPE,STARTT1,AIRT1,FOAMT1,SCT1,FINISHT1) values (?, ?, ?, ?, ?, ?, ?)"; 
    try (PreparedStatement pstmt = conn.prepareStatement(query)) { 
     pstmt.setString(1, bladeSerial); 
     pstmt.setString(2, itemText); 
     pstmt.setString(3, String.valueOf(startTime1)); 
     pstmt.setString(4, String.valueOf(airTime1)); 
     pstmt.setString(5, String.valueOf(foamTime1)); 
     pstmt.setString(6, String.valueOf(scTime1)); 
     pstmt.setString(7, String.valueOf(finishTime1)); 
     pstmt.executeUpdate(); 
    } catch (SQLException ex) { 
     // Exception handling 
     Logger.getLogger(FormTwo1.class.getName()).log(Level.SEVERE, null, ex); 
    } 

シリアル、bladetypeはVARCHARとstartT1、foamTime1、scTime1 & finishTime1はすべてにLocalTime変数(フォーマットするので、string.valueof)されているところ。

データベースがDB01で、表には、私はプログラムがレコードはシリアル番号がDBにすでにあるかどうかに依存して更新/挿入したいTB01

です。

+2

あなたの質問は何ですか?行を更新する場合は、 'INSERT'文ではなく' UPDATE'文を使用する必要があります。また、あなたがそれを使用する方法では、 'TB01'は_table_ではなく"データベース "です。 –

+0

申し訳ありませんが、コードが一意のシリアルである場合は更新を挿入し、既に入力されている場合はdbを更新します。あなたは正しいです、TB01はテーブル、DB01はデータベースです。 – Will

+1

Derbyでは、そのために['MERGE'](https://db.apache.org/derby/docs/10.11/ref/rrefsqljmerge.html)ステートメントを使用することができます。無関係ですが、数字や日付を文字列として渡すことは絶対に避けてください。 **常に**適切なデータ型を使用してください。整数は 'setInt()'、日付は 'setDate()'、タイムスタンプは 'setTimestamp()'など –

答えて

0

コードは現在動作しています。彼の答えはPrashantに感謝します。 SERIALは、文字列の末尾に移動していたとして、一度少し適応し、それは

String query = ("UPDATE TB01 SET BLADETYPE=?,STARTT1=?,AIRT1=?,FOAMT1=?,SCT1=?,FINISHT1=? WHERE SERIAL=?"); 
try (PreparedStatement pstmt = conn.prepareStatement(query)) { 
    pstmt.setString(7, bladeSerial); 
    pstmt.setString(1, itemText); 
    pstmt.setString(2, String.valueOf(startTime1)); 
    pstmt.setString(3, String.valueOf(airTime1)); 
    pstmt.setString(4, String.valueOf(foamTime1)); 
    pstmt.setString(5, String.valueOf(scTime1)); 
    pstmt.setString(6, String.valueOf(finishTime1)); 
    pstmt.executeUpdate(); 
                  } 
catch (SQLException ex) { 
    // Exception handling 
    Logger.getLogger(FormTwo1.class.getName()).log(Level.SEVERE, null, ex); 
          } 

も注意を働いた、順序もsetStringのコマンドに変更する必要がありました。

-2
try{ 
String host="jdbc:derby://localhost:1527/databasename"; 
String user="database_user_name"; 
String pass="database_password"; 
Connection con=DriverManager.getConnection(host,user,pass); 
PreparedStatement stmt=con.prepareStatement("update table_name set BLADETYPE=?,STARTT1=?,AIRT1=?,FOAMT1=?,SCT1=?,FINISHT1, where SERIAL=?"); 
stmt.setString(1, itemText); 
stmt.setString(2, String.valueOf(startTime1)); 
stmt.setString(3, String.valueOf(airTime1)); 
stmt.setString(4, String.valueOf(foamTime1)); 
stmt.setString(5, String.valueOf(scTime1)); 
stmt.setString(6, String.valueOf(finishTime1)); 
stmt.setString(7, bladeSerial); 
stmt.executeUpdate(); 
} 
catch (SQLException ex) { 
Logger.getLogger(FormTwo1.class.getName()).log(Level.SEVERE, null, ex); 
} 
+0

ありがとうございます。私はFINISHT1でこのコードでエラーが発生しますが、SERIAL =? – Will

+0

FINISHT1 =に変更しました。 SERIAL =?...でもコードは – Will

+0

文字列オブジェクトを二重引用符で ""使用し、データベースとテーブル名も修正します。あなたの質問では、どちらも同じ名前を使用するので混乱します –

関連する問題