C# 在执行实际插入之前测试tsql插入?
我有一个asp.net应用程序,可以插入几个tsql表。格式如下:C# 在执行实际插入之前测试tsql插入?,c#,sql,asp.net,tsql,stored-procedures,C#,Sql,Asp.net,Tsql,Stored Procedures,我有一个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
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()
每个方法都有一个try…catch异常。问题是它可能会中断myCustomer.InsertNewCustomers()
,但前面的两次插入已经完成。然后我必须手动删除所有插入内容,然后重试。我们已经进行了数据检查,但这种情况仍然存在
我正在考虑对这些存储过程中的每一个都使用COMMIT&ROLLBACK,因此第一个过程将调用所有5个回滚事务的方法。如果一切正常,那么我将使用COMMIT调用相同的存储过程。这样,我可以确定插入件将正确制作
这有意义吗?您可以从C代码管理事务。使用(TransactionScope=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....
}
是的,我想是的。您可能希望围绕所有这些调用包装一个事务,以便它们都发生在单个事务中。再加上@GordonLinoff所说的内容,您可以在所有调用中使用TransactionScope
:如果没有出来怎么办?(根本的问题是,为什么要在第二次提交时回滚?仅仅在事务中包装和在成功时提交/在失败时回滚就足够了吗?)谢谢,但如何在一个事务中包装所有这些存储过程调用呢?我正在考虑向每个存储过程添加begintransaction
和COMMIT TRANSACTION
或ROLLBACK TRANSACTION
。我是否可以将所有存储过程仅包装为1?这种方法的主要问题是:如果您知道所有五个存储过程都成功完成,那么如何确定当您再次运行存储过程时,同时没有发生任何会导致它们失败的事情?我现在看到的问题是,如果我通过SqlCommand
调用存储过程,我只能使用TransactionScope
。但是方法InsertToTable1()
到InsertToTable5()
的代码比SP调用多。如果没有看到额外的调用,很难提出任何建议,但非CRUD代码不应该是问题。我会在我的答案中加入一个简单的例子,但如果你能提供一些其他代码的背景信息,这可能会帮助我或其他人更精确一些。它们不是CRUD,但需要完成。问题不在于实际的代码。这是因为在实际事务之前进行的所有调用都需要移动以适应这种情况。我更改了问题中的代码片段,使其更加真实。但是我不能将所有的SP调用合并到一个中,所以你是说它不需要直接调用;我只需要使用相同的SqlConnection
。我会查一查让你知道的,谢谢。