在学习程序的初级阶段, 大部分人会用到 SqlHelper , 但不能说正好看到的是正确的。
曾经见过有的 SqlHelper , 把 创建连接写成了 static , 一个连接完成所有功能, 至始至终不释放。
从某个角度上看, 一个连接就完成所有功能, 那岂不是节省了许多资源?
但事实上没这么简单, 下面的程序可以证明这一点:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static string connString = @"Data Source=.\sqlserver2014;Initial Catalog=tempdb;Integrated Security=True";
static SqlConnection conn = new SqlConnection(connString);
static void Main(string[] args)
{
Parallel.For(0, 10, (i) => {
try
{
Test(i);
}
catch (Exception ex)
{
Console.WriteLine($"{i}出错:,{ex.Message}");
}
});
Console.WriteLine("End");
Console.Read();
}
private static void Test(int i)
{
if (conn.State != ConnectionState.Open)
conn.Open();
SqlCommand cmd = new SqlCommand("select 'ok' as result", conn);
Console.WriteLine($"{i}=>{cmd.ExecuteScalar()}");
}
}
}
所以, 在并发情况下, 共享连接是绝对会出错的。
正确写法:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static string connString = @"Data Source=.\sqlserver2014;Initial Catalog=tempdb;Integrated Security=True";
static void Main(string[] args)
{
Parallel.For(0, 10, (i) => {
try
{
Test(i);
}
catch (Exception ex)
{
Console.WriteLine($"{i}出错:,{ex.Message}");
}
});
Console.WriteLine("End");
Console.Read();
}
private static void Test(int i)
{
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
SqlCommand cmd = new SqlCommand("select 'ok' as result", conn);
Console.WriteLine($"{i}=>{cmd.ExecuteScalar()}");
}
}
}
}