在成功地完成了与 SQL Server 一起学习 C# 的初始阶段之后,我发现我使用的各种教程只是通过声明一个 global甚至是SqlConnection
变量而弄错了。SqlDataAdapter
DataSet
因此,这段代码在单线程应用程序中运行良好,但在多线程环境中运行不佳。在我对解决方案的研究中,我发现MSDN和这个教育答案都建议将 SQL 事务的“原子”部分包装在 using/try 方法中:
private static void CreateCommand(string queryString, string connectionString)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
try
{
SqlCommand command = new SqlCommand(queryString, connection);
command.Connection.Open();
command.ExecuteNonQuery();
}
catch (InvalidOperationException)
{
//log and/or rethrow or ignore
}
catch (SqlException)
{
//log and/or rethrow or ignore
}
catch (ArgumentException)
{
//log and/or rethrow or ignore
}
}
}
所以,我现在要做的就是将我的整个代码转换为使用这样的包装器。但在继续此之前,我想了解这种方法的权衡。根据我的经验,大型设计师/工程师团队通常有充分的理由决定不包含某些防御功能。从我作为 C/C++ 程序员的角度来看,当 C# 的整个价值主张是“防御性”(其中权衡是众所周知的 CLR 性能损失)时,这尤其有趣。
总结我的问题:
- 如上所述在我的代码中封装每笔交易的权衡是什么?
- 我应该寻找任何警告吗?