2

我有这个简单的 SQL 更新

IF(@MyID IS NOT NULL)
 BEGIN
  BEGIN TRY
   UPDATE DATATABLE
    SET Param1=@Param1, Data2=@Data2,...
    WHERE MyID=@MyID
   END TRY
   BEGIN CATCH
    SELECT ERROR_MESSAGE() AS 'Message' 
    RETURN -1
   END CATCH

   SELECT * FROM DATATABLE WHERE MyID= @@IDENTITY
   SET @ResultMessage = 'Succefully Inserted' 
   SELECT @ResultMessage AS 'Message' 
   RETURN 0
 END

问题是当我提供一个无效的 ID 时,一个不存在的 ID 不会引发错误,我仍然会收到错误代码 0 以及成功插入的消息。我还在捕获后添加了这个。还是什么都没有,我是否缺少一些基本的东西?

END CATCH
IF(@@ERROR != 0)
BEGIN
    SET @ResultMessage = 'Not Successful Inserted' 
    SELECT @ResultMessage AS 'Message' 
    RETURN -1
END
SELECT * FROM DATATABLE WHERE MyID= @@IDENTITY
SET @ResultMessage = 'Succefully Inserted' 
SELECT @ResultMessage AS 'Message' 
RETURN 0

我想找什么特别的东西吗?

4

4 回答 4

3

SQL 将捕获错误,但不更新任何行的 UPDATE 语句是有效的 SQL 语句,不应返回错误。您可以检查@@RowCount以查看更新语句实际更新了多少行

  IF(@MyID IS NOT NULL)
     BEGIN
      BEGIN TRY
       UPDATE DATATABLE
        SET Param1=@Param1, Data2=@Data2,...
        WHERE MyID=@MyID
        IF @@RowCount = 0
        BEGIN
           SELECT 'No record found...' AS Message
           RETURN -1
        END
       END TRY
       BEGIN CATCH
        SELECT ERROR_MESSAGE() AS 'Message' 
        RETURN -1
       END CATCH

       SELECT * FROM DATATABLE WHERE MyID= @@IDENTITY
       SET @ResultMessage = 'Succefully Inserted' 
       SELECT @ResultMessage AS 'Message' 
       RETURN 0
     END
于 2013-11-13T21:38:08.647 回答
0

我会是这样的......在事务中包装更新语句并在失败时回滚

IF(@MyID IS NOT NULL)
BEGIN
   BEGIN TRY

       BEGIN TRANSACTION
           UPDATE DATATABLE
            SET Param1=@Param1, Data2=@Data2,...
            WHERE MyID=@MyID
            SET @ResultMessage = 'Succefully Inserted' 
            SELECT @ResultMessage AS 'Message' 
            RETURN 0
        COMMIT TRANSACTION 
   END TRY

   BEGIN CATCH
    IF @@TRANCOUNT > 0
      ROLLBACK TRANSACTION  

        SELECT ERROR_MESSAGE() AS 'ErrorMessage' 
        SET @ResultMessage = 'Not Successful Inserted' 
        SELECT @ResultMessage AS 'Message' 
        RETURN -1
    END CATCH
END
于 2013-11-13T22:01:07.770 回答
0

你可以更换

IF(@MyID IS NOT NULL)

IF(@MyID IS NOT NULL) OR NOT EXISTS (
    SELECT 1
    FROM DATATABLE
    WHERE MyID=@MyID
)

或者您可以采用 Sparky 的解决方案。取决于哪种逻辑更适合您。如果@MyID 无效,是否应该抛出错误消息?

于 2013-11-13T21:44:47.800 回答
0

IF @@RowCount = 0 BEGIN 选择 1/0;结尾

我不知道这是否是一种好方法,但这就是我刚刚所做的。如果有 0 行受到影响,用户会收到错误通知:)。

Update Table1 Set Table1_Sold = 1 Where table1_ID = '043f258B-8A0B-4CA1-87EC-CDCBD38EE9E1';

 IF @@RowCount = 0 BEGIN Select 1/0; END

如果有 0 行受到影响,您会收到错误消息。可能不是最好的方法,但它对我有用。我可能会因此而讨厌。

在 C# 中,您可以捕获错误并显示您自己的消息。

catch (SqlException e) 
            {


                switch(e.Number)
                 {
                    case 8134:// Divide by zero error
                        MessageBox.Show("ERROR Divide by ZERO, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        break;

                    default:
                  MessageBox.Show($"{e.Number.ToString()} \t {e.Message} \t {e.InnerException} \t {e.Data} \t {e.ToString()}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        break;
                }
于 2020-05-21T14:20:06.963 回答