取引

2016-10-26 4 views
0

私はテーブルINVENTORYを更新するためにprepared statementstransactionsを使用しようと失敗します同じプライマリキーを使用して、古い値+新しい値を追加して更新します。取引

私はthisthisを読みました。私は正しい指示に従ったと思います。私のテーブルで

String sqInsert = "INSERT INTO INVENTORY VALUES ('100541026044','01','301610101','10054102604401301610101','5000')"; 
String sqUpdate = "UPDATE INVENTORY set quantity = quantity + 5000 where barcode='10054102604401301610101'"; 

// transaction block start 
c.setAutoCommit(false);   

stm = c.prepareStatement(sqInsert);  
System.out.println("try to insert"); 
result = stm.executeUpdate(); 

System.out.println("try to update"); 
stm = c.prepareStatement(sqUpdate); 
result = stm.executeUpdate(); 

c.commit(); //transaction block end 
System.out.println("Done!"); 

barcode=10054102604401301610101を持つ行が存在しているので、私は更新が実行されるようにしたいです。しかし、私は

try to insert 
Error inserting products :[SQLITE_CONSTRAINT] Abort due to constraint violation (UNIQUE constraint failed: INVENTORY.barcode) 

注意を得る:(私はしかしstm.setString(1, "string");と、クエリからの値を設定しない)私はちょうどそれがのために失敗し、ここで

+0

挿入と更新の両方を実行しています。 (そして、挿入が成功すると、新しい行を更新します。)if/elseが必要です。 –

+0

@ CL。両方のクエリが実行されていますか?はいの場合、私はコンソールに「更新しようとする」というメッセージが表示されません。 – yaylitzis

+0

最初に更新を照会してから挿入して、それを処理しました。 – yaylitzis

答えて

2

もちろんコード短くなりたいですバーコード上に複製された主キー。 まずアップデートに

stm = c.prepareStatement(sqUpdate); 
result = stm.executeUpdate(); 

を行うその後の更新によって影響を受ける行の数になり、結果の値を確認してください。それがゼロであれば、与えられたバーコード付きの製品は、アップデートが

if (0==result) { 
    stm = c.prepareStatement(sqInsert);  
    stm.executeUpdate(); 
} 

を行った後あなたはリソースリークまたは接続を残しを回避しようと{}キャッチ{}の下にすべてをかけるしたいと思うように存在していませんでした使用不可能

try { 
    c.setAutoCommit(false); 
    stm = c.prepareStatement(sqUpdate); 
    result = stm.executeUpdate(); 
    if (0==result) { 
     stm.close(); 
     stm = null; 
     stm = c.prepareStatement(sqInsert);  
     stm.executeUpdate(); 
     stm.close(); 
     stm = null; 
    } 
    c.commit(); 
} catch (SQLException e) { 
    if (stm!=null) stm.close(); 
    c.rollback(); 
}