2015-12-29 78 views
1

我有一個TSQL-preparedStatement用於根據ID更新表中的單個寄存器。該寄存器也可能與多對多關係有關,應更新。換句話說,應該增加新的關係,並且可能需要刪除一些關係。當行確認更新時,爲什麼我的PreparedStatement.executeUpdate返回0?

這裏是僞代碼(最終完整的SQL代碼):

  • BEGIN TRANSACTION
  • 更新的預訂,設定值,其中bookingID = X
  • 從BookingHasSeat其中bookingID = X和SeatID無法刪除IN [整數列表] 對列表中的每個int id(Y)重複下一行
  • 如果X,Y尚不存在,則將X,Y插入到BookingHasSeat中。
  • 提交事務

的SQL完美的作品,但是當我構建語句爲java.sql.Connection.prepareStatement,並調用.executeUpdate() - 方法,我想存儲返回的整數值,以確保至少一行已更新。如果沒有行被更新,則意味着更新失敗,並向用戶應用程序界面報告失敗。

如果座席列表保持不變,則此TSQL尤其會返回失敗。即使預訂登記細節已更新。如果預訂更新,我預計它會返回1,並且只有在沒有任何事情發生時才返回0。

返回的行數如何在TSQL中工作? java-method與TSQL不兼容?我怎樣才能確保更新已經發生?

SET XACT_ABORT ON 
BEGIN TRANSACTION 
DECLARE @BookingID INT = 33; 
UPDATE Booking SET DateTime=6543546, PersonID=4, Comment='', Confirmed='true', StartDate=43265436534, EndDate=-1, StartSession=720, EndSession=900 WHERE BookingID = @BookingID; 
DELETE FROM BookingHasSeat WHERE BookingID = @BookingID AND SeatID NOT IN (1,2,3,4,5,6); 
DECLARE @SeatID1 INT = 1; 
IF @SeatID1 NOT IN (SELECT SeatID FROM BookingHasWorkStation WHERE BookingID = @BookingID) 
BEGIN 
INSERT INTO BookingHasSeat (BookingID, SeatID) VALUES (@BookingID, @SeatID1); 
END 
DECLARE @SeatID2 INT = 2; 
IF @SeatID2 NOT IN (SELECT SeatID FROM BookingHasWorkStation WHERE BookingID = @BookingID) 
BEGIN 
INSERT INTO BookingHasWorkStation (BookingID, SeatID) VALUES (@BookingID, @SeatID2); 
END 
DECLARE @SeatID3 INT = 3; 
IF @SeatID3 NOT IN (SELECT SeatID FROM BookingHasWorkStation WHERE BookingID = @BookingID) 
BEGIN 
INSERT INTO BookingHasWorkStation (BookingID, SeatID) VALUES (@BookingID, @SeatID3); 
END 
COMMIT TRANSACTION 
+0

根據我的經驗,依賴從'executeUpdate'等方法返回的更新數字或行是不必要的。你希望事情儘可能快地運行,如果我曾經運行過這樣的腳本,我就從'SET NOCOUNT ON'開始。這種情況下的返回值(對於腳本中的所有語句)爲-1。每個計數都必須單獨發送,並且在某些情況下會降低執行速度。 –

回答

-1

使用JDBC調用存儲過程時,應該使用CallableStatement。

+0

這不是一個答案,這是一條評論。 – KjetilNordin

相關問題