在执行实际插入之前测试tsql插入

本文关键字:插入 测试 tsql 执行 | 更新日期: 2023-09-27 17:53:09

我有一个asp.net应用程序,插入到几个tsql表。格式如下:

Car myCar = new Car();
myCar.InsertNewCar(); //Makes SP call usp_InsertCar()
Truck myTruck = new Truck();
myTruck.InsertNewTruck(); //Makes SP call usp_InsertTruck()
Customer myCustomer = new Customer();
myCustomer.InsertNewCustomers(); //Makes SP call usp_InsertCustomers()

每个方法都有一个尝试…捕获异常。问题是它可能在myCustomer.InsertNewCustomers()中断裂,但是之前的2个insert已经完成。然后我必须手动删除所有插入,然后再试一次。我们已经做了数据检查,但这种情况仍然发生。

我正在考虑使用COMMIT &使用这些存储过程中的每个进行ROLLBACK操作,因此第一次传递将调用将回滚事务的所有5个方法。如果一切正常,那么我将使用COMMIT调用相同的存储过程。这样我就可以肯定插入件的制作是正确的。

这有意义吗?

在执行实际插入之前测试tsql插入

您可以从c#代码中管理事务。添加一个using (TransactionScope scope = new TransactionScope())块来封装调用。我认为您可能需要为此使用相同的连接-因此您可能必须将连接对象作为参数传递给您的方法。

编辑:只是为了增加一些细节....

using (TransactionScope scope = new TransactionScope())
{
    // Assuming you are using SQL Server....
    using (SqlConnection conn = new SqlConnection(connectString1))
    {
        conn.Open();
        InsertToTable1(conn);
        // Snip...
        InsertToTable5(conn);
        // If this point is reached, everything is tickety boo            
        // Commit the transaction using Complete.
        // If the scope.Complete line is not hit before the using block 
        // is exited (i.e. an Exception is thrown, the transaction is rolled               
        // back.
        scope.Complete();
    }
}

你的InsertIntoTable方法看起来就像

public void InsertIntoTable1(SqlConnection conn)
{
     //  Some non-database code could be here....
     SqlCommand cmd = conn.CreateCommand();
     // Configure command and execute
     //  Some non-database code could also be here....
}