我需要每个线程连接到一个数据库并执行一些查询,也许某个线程一次可以执行查询。
我创建了一个用于通过ADO.NET连接到SQL数据库的静态类:
public static class ADOFire
{
static System.Data.SqlClient.SqlConnection Cnn = new System.Data.SqlClient.SqlConnection();
public static string CnnString { get; set; }
public static void CreateConnection()
{
if (Cnn.State == ConnectionState.Open)
return;
Cnn.ConnectionString = CnnString = ConfigurationManager.ConnectionStrings["CnnString"].ToString();
if (Cnn.State != System.Data.ConnectionState.Open) Cnn.Open();
}
public static System.Data.DataTable GetTable(System.Data.SqlClient.SqlCommand Com, System.Data.SqlClient.SqlDataAdapter Ada, string ComText)
{
CreateConnection();
Com.Connection = Cnn;
Ada.SelectCommand = Com;
try
{
System.Data.DataTable T = new System.Data.DataTable();
Com.CommandText = ComText;
Ada.Fill(T);
return T;
}
catch { return null; }
}
}
并且在每个线程中,我这样调用静态函数:
System.Data.SqlClient.SqlCommand Com = new System.Data.SqlClient.SqlCommand();
System.Data.SqlClient.SqlDataAdapter Ada = new System.Data.SqlClient.SqlDataAdapter();
Datatable dt = ADOFire.GetTable(Com ,Ada ,"Select * from X");
我的问题:
在此示例中是否有可能出现问题?任何意见对我都可能有用。
连接可以同时服务于不同的线程吗?
否-SqlConnection
不保证是线程安全的。
SQL连接由.NET合并,因此创建它们通常并不昂贵。在需要时创建一个连接,并在使用完毕后将其处理。通过在using
块中创建连接(以及命令和读取器),可以最有效地完成此操作。