C# 在所有线程之间使用公共SQL Server连接并同时使用

C# 在所有线程之间使用公共SQL Server连接并同时使用,c#,sql-server,multithreading,static,ado.net,C#,Sql Server,Multithreading,Static,Ado.net,我需要每个线程连接到一个数据库并执行一些查询,也许某个线程可以在同一时间执行查询 我创建了一个静态类,用于使用ADO.NET连接到SQL Server数据库: public static class ADOFire { static System.Data.SqlClient.SqlConnection Cnn = new System.Data.SqlClient.SqlConnection(); public static string CnnString { get; s

我需要每个线程连接到一个数据库并执行一些查询,也许某个线程可以在同一时间执行查询

我创建了一个静态类,用于使用ADO.NET连接到SQL Server数据库:

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, "Some Query 'select * from x'");
基于,在打开新连接或使用现有连接之间没有太大区别

每当用户在连接上调用Open时,池处理程序都会在池中查找可用的连接。如果池连接可用,它会将其返回给调用方,而不是打开新连接。当应用程序在连接上调用Close时,池处理程序将其返回到活动连接的池集,而不是关闭它。一旦连接返回到池中,就可以在下一次打开的调用中重用它

我的问题是:

一个连接可以同时为不同的线程服务吗?一路通

数据混乱的问题不是由静态功能造成的吗

不,ADO.NET不允许两个线程同时访问同一个.CONCONNECT 是的,但问题不在于statix方法,而在于静态连接字段 您应该做的是让静态方法createnew并将连接返回给调用者,然后完全删除该字段。典型用法:

使用var conn=CreateConnection{ //…用它! } 我还严重关切: -为什么要传入命令、命令文本和适配器 -缺乏参数;这表明SQL注入存在巨大的安全问题
-使用数据表几乎从来都不是最合适的工具

这可能会有所帮助:重新阅读StackOverflow问题并回答您发布的问题。SqlConnection的静态方法是线程安全的-例如:您可以有许多线程调用SqlConnection.ChangePassword和SqlConnection.ClearAllPools-但是实例方法不能保证线程安全。不要尝试在线程之间共享一个SqlConnection,通过连接池为每个需要一个SqlConnection的线程获取一个新的SqlConnection。-Gravell tnx,如果我将我的GetTable方法更改为您的解决方案,当许多线程同时调用此方法时,假设它是静态的,没有问题吗?