我正在用C#编写应用程序(这是第一次)。我有一个用户在表单中输入大量数据,我将这些数据插入到数据库中。它是使用SQL Server的Windows窗体应用程序。
用户提交表单后,会更新多个表。 (大约6)我试图避免3个表更新的情况,第4个抛出错误,我不知道如何做到这一点。所有数据都是正确的数据类型,所以我的问题更多的是数据库连接端。
所以,理想情况下,如果所有6个插入都不成功,我希望它们都不会成功。我知道我可以在catch子句中执行删除记录来回滚。这是最有效的方式还是有“最佳实践”?
答案 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进行数据访问。
答案 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