2014-09-02 70 views
0

我正在处理存储过程以将项目添加到我的数据库。该过程还处理编辑项目。代码不断跳过插入语句,即使在我的测试运行中,我声明了应该启动Post而不是Put的Id = 0。有人能指出我的代码中哪里出错了吗?代码跳过插入语句

DECLARE @PersonId INT, 
    @Description VARCHAR(300), 
    @ModifiedById INT, 
    @NeedId INT 

SET @PersonId = 11 
SET @Description = 'Testing again' 
SET @ModifiedById = 1 


BEGIN 
--SET NOCOUNT ON; 
--SET XACT_ABORT ON; 

DECLARE @TimeStamp DATETIME 

SET @TimeStamp = GETUTCDATE() 

BEGIN TRY 
    BEGIN TRANSACTION 

    /*-------------------------------------------------------------------------- 
    INSERT 
    --------------------------------------------------------------------------*/ 
    IF(@NeedId = 0) 
     BEGIN 
      INSERT INTO [dbo].[CustomerNeeds] 
         ([PersonId] 
         ,[Description] 
         ,[IsActive] 
         ,[LastUpdated] 
         ,[ModifiedById] 
         ,[CreateDate] 
         ,[CreatedById]) 
       VALUES 
         (@PersonId 
         ,@Description 
         ,1 
         ,@TimeStamp 
         ,@ModifiedById 
         ,@TimeStamp 
         ,@ModifiedById) 


      SELECT @NeedId = CAST(SCOPE_IDENTITY() AS INT) 
     END 


    /*-------------------------------------------------------------------------- 
    UPDATE 
    --------------------------------------------------------------------------*/ 
    ELSE 
     BEGIN 
      UPDATE 
       [dbo].[CustomerNeeds] 
      SET 
       [PersonId] = @PersonId 
       ,[Description] = @Description 
       ,[IsActive] = 1 
       ,[LastUpdated] = @TimeStamp 
       ,[ModifiedById] = @ModifiedById 
      WHERE 
       Id = @NeedId 
     END 


    /*-------------------------------------------------------------------------- 
    DELETE ADDRESS ASSOCIATION TO PERSON 
    --------------------------------------------------------------------------*/ 
    DELETE 
    FROM 
     [dbo].[CustomerNeeds] 
    WHERE 
     [PersonId] = @PersonId 
     AND 
     [Id] = @NeedId 



    COMMIT TRANSACTION 
END TRY 

BEGIN CATCH 
    ROLLBACK 

    DECLARE @ErrorMessage NVARCHAR(4000); 
    DECLARE @ErrorSeverity INT; 
    DECLARE @ErrorState INT; 

    SELECT 
    @ErrorMessage = 'Error happened while saving a customer need -- ' + ERROR_MESSAGE(), 
    @ErrorSeverity = ERROR_SEVERITY(), 
    @ErrorState = ERROR_STATE(); 

    -- Raise an error and return 
    RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState); 
    RETURN 
END CATCH 


-- RESULT SET 1: IList<ICustomerNeedsDataContract> 
EXEC [API].[CustomerNeedsList] 
     @PersonId = @PersonId 
END 
+3

呃,你什么时候为'@ NeedId'设置了一个值?这不是VBScript,其中未初始化的整数等于0. – 2014-09-02 19:44:42

+0

它从前端传入为0。当它在proc中设置为0时,它没有区别。 – Michael 2014-09-02 19:47:14

+1

你应该确认。此外,如果此代码在过程中,则应显示THAT代码,而不是此代码,该代码没有前端供我们测试。 – 2014-09-02 19:48:00

回答

2

我不知道你的DELETE部分中引用了错误的表吗?

现在,我相信你只需删除刚刚插入的行。

0
DROP TABLE #CustomerNeeds 

CREATE TABLE #CustomerNeeds(
         [PersonId] INT IDENTITY(1,1) NOT NULL 
         ,[Description] NVARCHAR(100) 
         ,[IsActive] BIT 
         ,[LastUpdated] DATETIME 
         ,[ModifiedById] NVARCHAR(100) 
         ,[CreateDate] DATETIME 
         ,[CreatedById] NVARCHAR(100))      


INSERT INTO #CustomerNeeds 
    (Description, IsActive, LastUpdated, ModifiedById, CreateDate, CreatedById) 
VALUES 
    ('test row 3', 3, CURRENT_TIMESTAMP, 'test_user', CURRENT_TIMESTAMP, 'test_user') 
    ,('test row 4', 4, CURRENT_TIMESTAMP, 'test_user', CURRENT_TIMESTAMP, 'test_user') 
    ,('test row 5', 5, CURRENT_TIMESTAMP, 'test_user', CURRENT_TIMESTAMP, 'test_user') 

DECLARE @PersonId INT, 
    @Description VARCHAR(300), 
    @ModifiedById INT, 
    @NeedId INT 

SET @PersonId = 1 
SET @Description = 'Testing again' 
SET @ModifiedById = 1 

BEGIN 
--SET NOCOUNT ON; 
--SET XACT_ABORT ON; 

DECLARE @TimeStamp DATETIME 

SET @TimeStamp = GETUTCDATE() 

BEGIN TRY 
    BEGIN TRANSACTION 

    /*-------------------------------------------------------------------------- 
    INSERT 
    --------------------------------------------------------------------------*/ 
    IF(@PersonId = 0) 
     BEGIN 
      PRINT 'Insert' 

      INSERT INTO #CustomerNeeds 
         ([Description] 
         ,[IsActive] 
         ,[LastUpdated] 
         ,[ModifiedById] 
         ,[CreateDate] 
         ,[CreatedById]) 
       VALUES 
         (@Description 
         ,1 
         ,@TimeStamp 
         ,@ModifiedById 
         ,@TimeStamp 
         ,@ModifiedById) 
      SELECT @PersonId = CAST(SCOPE_IDENTITY() AS INT) 

      SELECT * 
      FROM #CustomerNeeds 
     END 


    /*-------------------------------------------------------------------------- 
    UPDATE 
    --------------------------------------------------------------------------*/ 
    ELSE 
     BEGIN 

      PRINT 'Update' 

      UPDATE 
       #CustomerNeeds 
      SET 
       [Description] = @Description 
       ,[IsActive] = 1 
       ,[LastUpdated] = @TimeStamp 
       ,[ModifiedById] = @ModifiedById 
      WHERE 
       [PersonId] = @PersonId 

      SELECT * 
      FROM #CustomerNeeds 
     END 


    /*-------------------------------------------------------------------------- 
    DELETE ADDRESS ASSOCIATION TO PERSON 
    --------------------------------------------------------------------------*/ 
    DELETE 
    FROM 
     #CustomerNeeds 
    WHERE 
     [PersonId] = @PersonId 

    COMMIT TRANSACTION 
END TRY 

BEGIN CATCH 
    ROLLBACK 

    DECLARE @ErrorMessage NVARCHAR(4000); 
    DECLARE @ErrorSeverity INT; 
    DECLARE @ErrorState INT; 

    SELECT 
    @ErrorMessage = 'Error happened while saving a customer need -- ' + ERROR_MESSAGE(), 
    @ErrorSeverity = ERROR_SEVERITY(), 
    @ErrorState = ERROR_STATE(); 

    -- Raise an error and return 
    RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState) 

END CATCH 

SELECT * 
FROM #CustomerNeeds 
END