检查SQL是否成功
本文关键字:成功 是否 SQL 检查 | 更新日期: 2023-09-27 18:03:11
我正在用c#写一个应用程序(第一次)。我有一个用户在表单中输入了很多数据,我正在将这些数据插入到数据库中。它是一个使用SQL Server的Windows窗体应用程序。
用户提交表单后,多个表被更新。(大约6)我试图避免3表更新和第4抛出错误的情况,我不知道如何做到这一点。所有的数据将是正确的数据类型,所以我的问题更多的是在数据库连接端。
因此,理想情况下,如果所有6个插入都不成功,我希望它们都不成功。我知道我可以在catch子句中删除记录来回滚。这是最有效的方法,还是有"最佳实践"?
如果没有您当前的代码,这有点困难,但通常您可以使用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