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