检查SQL是否成功

本文关键字:成功 是否 SQL 检查 | 更新日期: 2023-09-27 18:03:11

我正在用c#写一个应用程序(第一次)。我有一个用户在表单中输入了很多数据,我正在将这些数据插入到数据库中。它是一个使用SQL Server的Windows窗体应用程序。

用户提交表单后,多个表被更新。(大约6)我试图避免3表更新和第4抛出错误的情况,我不知道如何做到这一点。所有的数据将是正确的数据类型,所以我的问题更多的是在数据库连接端。

因此,理想情况下,如果所有6个插入都不成功,我希望它们都不成功。我知道我可以在catch子句中删除记录来回滚。这是最有效的方法,还是有"最佳实践"?

检查SQL是否成功

如果没有您当前的代码,这有点困难,但通常您可以使用TransactionScope类。

例如

using (TransactionScope scope = new TransactionScope())
    {
        using (SqlConnection connection1 = new SqlConnection(connectString1))
        {
            Action1(connection1);
            Action2(connection1);
            Action3(connection1);
            Action4(connection1);
            Action5(connection1);
            Action6(connection1);
        }
        // The Complete method commits the transaction. If an exception has been thrown, 
        // Complete is not  called and the transaction is rolled back.
        scope.Complete();
    }

现在,正如在评论中提到的,这不是性能最优的解决方案,但对于大多数中型项目来说可能工作得很好。

你也可以使用实体框架来进行数据访问。

也可参见Transactions in EF on stackoverflow

你绝对可以发送特别的TSQL语句;但是,如果缓存计划不匹配,则每次都必须对它们进行解析和编译。

为什么不使用使用表值参数(记录集)、事务和错误处理的存储过程?

这里的优点是它可以作为一个单独的代码单元进行测试,并且不需要每次都解析/重新编译。

如果你有大量的电话,这一点时间就会累积起来。

同样,如果业务规则改变,改变的是存储过程,而不是c#程序。这是假设输入保持不变。

附件是拼图的链接。剩下的就看你了。

-- Begin Transaction
http://technet.microsoft.com/en-us/library/ms188929.aspx
-- Try/Catch
http://technet.microsoft.com/en-us/library/ms175976.aspx
-- Commit transaction
http://technet.microsoft.com/en-us/library/ms190295.aspx
-- Roll back transaction
http://technet.microsoft.com/en-us/library/ms181299.aspx
-- Table Variable Parameter w/ADO.NET call
http://technet.microsoft.com/en-us/library/bb510489.aspx

最好的方法是创建一个SQL Server存储过程来获取你想要保存的所有输入,并使用commit transaction来管理插入。

示例(SP的一部分)

开始试一试开始事务;

        -- Do your inserts here i,e
        --INSERT INTO TABLE1 (COL1,COL2) VALUES ('Val1','Val2')
        COMMIT TRANSACTION;

结束试

开始抓

ROLLBACK TRANSACTION;
--PRINT ERROR_PROCEDURE()
--PRINT ERROR_NUMBER()
--PRINT ERROR_LINE()
--PRINT ERROR_MESSAGE()
--INSERT INTO ERRORLOG (PROGMODULE,ERRORNO,ERRORLINENO,ERROR,ErrorState,ERRORDATE,ERRMAKER)
--VALUES
--(ERROR_PROCEDURE(),ERROR_NUMBER(),ERROR_LINE(),ERROR_MESSAGE(),ERROR_STATE(),GETDATE(),'CUSTOM DESCRIPTION');
--or you can return the error to your application