检查SQL成功

时间:2014-05-13 13:45:27

标签: c# sql-server error-handling

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

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

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

3 个答案:

答案 0 :(得分:0)

在没有当前代码的情况下有点难,但一般情况下,您可以使用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();

    }

现在正如评论中所提到的,这不是最佳性能最佳解决方案,但对大多数中型项目来说可能效果很好。

您还可以使用Entity framework进行数据访问。

另见Transactions in EF on stackoverflow

答案 1 :(得分:0)

您绝对可以发送临时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

答案 2 :(得分:0)

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

示例(SP的一部分)

开始尝试             开始交易;

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

        COMMIT TRANSACTION;

结束尝试

BEGIN CATCH

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

END CATCH