[英]If exists then update else insert not working properly in SQL Server Enterprise Edition
我知道這可能是一個重復的問題,但現在真的讓我感到沮喪。 我必須插入/更新發貨人信息,我寫了一個這樣的存儲過程:
IF EXISTS (SELECT * FROM sysobjects WHERE name='usp_Nucleus_LSS_AddShipperInfo' AND type='P')
DROP PROCEDURE usp_Nucleus_LSS_AddShipperInfo
GO
CREATE PROCEDURE dbo.usp_Nucleus_LSS_AddShipperInfo
(
@ShipperCode varchar(500),
@ShipperName varchar(500),
@CustomsClearance decimal,
@MinCommissionAmount decimal,
@CommissionPercent decimal,
@TruckingAmount decimal,
@ContractNo varchar(50),
@ConsigneeName varchar(500),
@SalesPerson varchar(500),
@Email varchar(500),
@ContactNo varchar(500),
@ShipperPriority varchar(50),
@EntryBy varchar(50),
@EntryDate datetime,
@UpdatedBy varchar(50),
@UpdateDate datetime
)
AS
DECLARE
@NewShipperID bigint,
@OldShipperID bigint
BEGIN
SELECT @OldShipperID = (SELECT ISNULL(ShipperID, 0) AS ShipperID FROM LSS_t_ShipperInfo WHERE ShipperCode = @ShipperCode)
SELECT @NewShipperID = (SELECT ISNULL(MAX(ShipperID),0) AS ShipperID FROM LSS_t_ShipperInfo)
IF (@OldShipperID > 0)
BEGIN
UPDATE LSS_t_ShipperInfo SET ShipperName=@ShipperName, CustomsClearance=@CustomsClearance,
MinCommissionAmount=@MinCommissionAmount, CommissionPercent=@CommissionPercent, TruckingAmount=@TruckingAmount,
ContractNo=@ContractNo, ConsigneeName=@ConsigneeName, SalesPerson=@SalesPerson, Email=@Email, ContactNo=@ContactNo,
ShipperPriority=@ShipperPriority, UpdatedBy=@UpdatedBy, UpdateDate=@UpdateDate
WHERE ShipperID = @OldShipperID
END
ELSE
BEGIN
INSERT INTO LSS_t_ShipperInfo (ShipperID, ShipperCode, ShipperName, CustomsClearance, MinCommissionAmount,
CommissionPercent, TruckingAmount, ContractNo, ConsigneeName, SalesPerson, Email, ContactNo, ShipperPriority, EntryBy,
EntryDate, UpdatedBy, UpdateDate) VALUES (@NewShipperID+1, @ShipperCode, @ShipperName, @CustomsClearance, @MinCommissionAmount,
@CommissionPercent, @TruckingAmount, @ContractNo, @ConsigneeName, @SalesPerson, @Email, @ContactNo, @ShipperPriority, @EntryBy,
@EntryDate, @UpdatedBy, @UpdateDate)
END
END
GO
我使用單行從我的應用程序執行此操作,它工作。 但下次當我再次使用兩行運行它時,它既不插入也不更新記錄。 我不明白這里有什么問題。 我分別運行每個查詢,它們工作正常。 這是我的VB.Net代碼:
oDBCmd.Connection = oDBCon
oDBCmd.CommandText = "usp_Nucleus_LSS_AddShipperInfo"
oDBCmd.CommandType = CommandType.StoredProcedure
oDBCmd.CommandTimeout = 0
nResult = -1
oDBCmd.Parameters.Add("@ShipperCode", OleDbType.VarChar).Value = DGMAIN.Rows(i).Cells("DGMAIN_SHIPPER_CODE").Value.ToString()
oDBCmd.Parameters.Add("@ShipperName", OleDbType.VarChar).Value = DGMAIN.Rows(i).Cells("DGMAIN_SHIPPER_NAME").Value.ToString()
oDBCmd.Parameters.Add("@CustomsClearance", OleDbType.Decimal).Value = DGMAIN.Rows(i).Cells("DGMAIN_CUSTOMS_CLEARANCE").Value.ToString()
oDBCmd.Parameters.Add("@MinCommissionAmount", OleDbType.Decimal).Value = DGMAIN.Rows(i).Cells("DGMAIN_MIN_COMMISSION_AMOUNT").Value.ToString()
oDBCmd.Parameters.Add("@CommissionPercent", OleDbType.Decimal).Value = DGMAIN.Rows(i).Cells("DGMAIN_COMMISSION_PERCENT").Value.ToString()
oDBCmd.Parameters.Add("@TruckingAmount", OleDbType.Decimal).Value = DGMAIN.Rows(i).Cells("DGMAIN_TRUCKING_AMOUNT").Value.ToString()
oDBCmd.Parameters.Add("@ContractNo", OleDbType.VarChar).Value = DGMAIN.Rows(i).Cells("DGMAIN_CONTRACT_NO").Value.ToString()
oDBCmd.Parameters.Add("@ConsigneeName", OleDbType.VarChar).Value = DGMAIN.Rows(i).Cells("DGMAIN_CONSIGNEE_NAME").Value.ToString()
oDBCmd.Parameters.Add("@SalesPerson", OleDbType.VarChar).Value = DGMAIN.Rows(i).Cells("DGMAIN_SALES_PERSON").Value.ToString()
oDBCmd.Parameters.Add("@Email", OleDbType.VarChar).Value = DGMAIN.Rows(i).Cells("DGMAIN_EMAIL").Value.ToString()
oDBCmd.Parameters.Add("@ContactNo", OleDbType.VarChar).Value = DGMAIN.Rows(i).Cells("DGMAIN_CONTACT_NO").Value.ToString()
oDBCmd.Parameters.Add("@ShipperPriority", OleDbType.VarChar).Value = DGMAIN.Rows(i).Cells("DGMAIN_SHIPPER_PRIORITY").Value.ToString()
oDBCmd.Parameters.Add("@EntryBy", OleDbType.VarChar).Value = System.Environment.UserName.ToString().ToUpper()
oDBCmd.Parameters.Add("@EntryDate", OleDbType.Date).Value = System.DateTime.Now().ToString()
oDBCmd.Parameters.Add("@UpdatedBy", OleDbType.VarChar).Value = System.Environment.UserName.ToString().ToUpper()
oDBCmd.Parameters.Add("@UpdateDate", OleDbType.Date).Value = System.DateTime.Now().ToString()
nResult = oDBCmd.ExecuteNonQuery()
我使用的是VB.Net 2.0和SQL Server企業版。
提前致謝。
我查看了你的存儲過程,它看起來很好。
我認為您的vb.net代碼存在問題。 我懷疑你是否缺少執行多行數據表的for循環。
在這里試試這個代碼:
For i As Integer = 0 To DGMAIN.Rows.Count - 1
oDBCmd = New SqlCommand
oDBCmd.Connection = oDBCon
oDBCmd.CommandText = "usp_Nucleus_LSS_AddShipperInfo"
oDBCmd.CommandType = CommandType.StoredProcedure
oDBCmd.CommandTimeout = 0
nResult = -1
oDBCmd.Parameters.Add("@ShipperCode", OleDbType.VarChar).Value = DGMAIN.Rows(i)("DGMAIN_SHIPPER_CODE").Value.ToString()
oDBCmd.Parameters.Add("@ShipperName", OleDbType.VarChar).Value = DGMAIN.Rows(i)("DGMAIN_SHIPPER_NAME").Value.ToString()
oDBCmd.Parameters.Add("@CustomsClearance", OleDbType.Decimal).Value = DGMAIN.Rows(i)("DGMAIN_CUSTOMS_CLEARANCE").Value.ToString()
oDBCmd.Parameters.Add("@MinCommissionAmount", OleDbType.Decimal).Value = DGMAIN.Rows(i)("DGMAIN_MIN_COMMISSION_AMOUNT").Value.ToString()
oDBCmd.Parameters.Add("@CommissionPercent", OleDbType.Decimal).Value = DGMAIN.Rows(i)("DGMAIN_COMMISSION_PERCENT").Value.ToString()
oDBCmd.Parameters.Add("@TruckingAmount", OleDbType.Decimal).Value = DGMAIN.Rows(i)("DGMAIN_TRUCKING_AMOUNT").Value.ToString()
oDBCmd.Parameters.Add("@ContractNo", OleDbType.VarChar).Value = DGMAIN.Rows(i)("DGMAIN_CONTRACT_NO").Value.ToString()
oDBCmd.Parameters.Add("@ConsigneeName", OleDbType.VarChar).Value = DGMAIN.Rows(i)("DGMAIN_CONSIGNEE_NAME").Value.ToString()
oDBCmd.Parameters.Add("@SalesPerson", OleDbType.VarChar).Value = DGMAIN.Rows(i)("DGMAIN_SALES_PERSON").Value.ToString()
oDBCmd.Parameters.Add("@Email", OleDbType.VarChar).Value = DGMAIN.Rows(i)("DGMAIN_EMAIL").Value.ToString()
oDBCmd.Parameters.Add("@ContactNo", OleDbType.VarChar).Value = DGMAIN.Rows(i)("DGMAIN_CONTACT_NO").Value.ToString()
oDBCmd.Parameters.Add("@ShipperPriority", OleDbType.VarChar).Value = DGMAIN.Rows(i)("DGMAIN_SHIPPER_PRIORITY").Value.ToString()
oDBCmd.Parameters.Add("@EntryBy", OleDbType.VarChar).Value = System.Environment.UserName.ToString().ToUpper()
oDBCmd.Parameters.Add("@EntryDate", OleDbType.Date).Value = System.DateTime.Now().ToString()
oDBCmd.Parameters.Add("@UpdatedBy", OleDbType.VarChar).Value = System.Environment.UserName.ToString().ToUpper()
oDBCmd.Parameters.Add("@UpdateDate", OleDbType.Date).Value = System.DateTime.Now().ToString()
nResult = oDBCmd.ExecuteNonQuery()
Next
希望這對你有所幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.