C# 多用户安全SQL连接

C# 多用户安全SQL连接,c#,asp.net,sqlconnection,C#,Asp.net,Sqlconnection,我有一个目标在下面: public class DatabaseAccess { private static string sConnStr; private static SqlConnection sqlConn; private static string ConnectionString { get { if (String.IsNullOrEmpty(sConnStr))

我有一个目标在下面:

public class DatabaseAccess
{
    private static string sConnStr;
    private static SqlConnection sqlConn;

    private static string ConnectionString
    {
        get
        {
            if (String.IsNullOrEmpty(sConnStr))
            {
                sConnStr = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            }
            return sConnStr;
        }
    }

    public static int OpenConnection
    {
        get
        {
            sqlConn = new SqlConnection(ConnectionString);
            return 0;
        }
    }

    public static SqlConnection Connection
    {
        get
        {
            if (sqlConn.State != ConnectionState.Open)
            {
                sqlConn = new SqlConnection(ConnectionString);
                sqlConn.Open();
            }
            return sqlConn;
        }
    }
}
因此,每当我需要在web应用程序中建立连接时,我都会使用以下方法:

DataTable dt = new DataTable();
using (SqlConnection cnn = DatabaseAccess.Connection)
{
    using (SqlDataAdapter da = new SqlDataAdapter("MyAStoredProcedure", cnn))
    {
        da.SelectCommand.CommandType = CommandType.StoredProcedure;
        da.Fill(dt);
    }
}

return dt;
这一切似乎都很好,除非有两个用户同时运行代码,否则我将在我的web应用程序中得到以下错误:

与此命令关联的已打开DataReader需要关闭

我需要一些建议如何解决上述问题


谢谢。

这是因为您正在共享连接对象-不要这样做。DatabaseAccess.Connection每次都应该创建一个新的SqlConnection。

这是因为您正在共享连接对象-不要这样做。DatabaseAccess.Connection每次都应该创建一个新的SqlConnection。

尝试在using语句中创建一个新的SqlConnection实例

DataTable dt = new DataTable();
using (SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
    cnn.Open();
    using (SqlDataAdapter da = new SqlDataAdapter("MyAStoredProcedure", cnn))
    {
        da.SelectCommand.CommandType = CommandType.StoredProcedure;
        da.Fill(dt);
    }
}

return dt;

尝试在using语句中创建SqlConnection的新实例

DataTable dt = new DataTable();
using (SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
    cnn.Open();
    using (SqlDataAdapter da = new SqlDataAdapter("MyAStoredProcedure", cnn))
    {
        da.SelectCommand.CommandType = CommandType.StoredProcedure;
        da.Fill(dt);
    }
}

return dt;

你能解释一下为什么你的连接必须是静态的,这就是你看到错误的原因吗?我有很多其他的数据库操作,所以我将只使用相同的静态连接。看起来这就是错误的原因,我该怎么说呢?你能解释一下为什么你的连接必须是静态的,这就是你看到错误的原因吗?我还有很多其他的数据库操作,所以我会使用相同的静态连接。所以看起来这就是错误的原因,那么我该怎么说呢?这是否意味着我应该把sqlConn=newsqlconnectionstring;和sqlConn.Open;在DatabaseAccess中。连接?@StevenYong,是的,这就是它的意思。另外,完成后别忘了关闭连接。Ekad下面的方法很好。我相信当我使用SqlConnection cnn=DatabaseAccess.Connection时,它会正确地关闭它,对吗?谢谢大家@StevenYong,是的,对于using语句,您正在正确地处理新连接。这是否意味着我应该只放置sqlConn=new SqlConnectionConnectionString;和sqlConn.Open;在DatabaseAccess中。连接?@StevenYong,是的,这就是它的意思。另外,完成后别忘了关闭连接。Ekad下面的方法很好。我相信当我使用SqlConnection cnn=DatabaseAccess.Connection时,它会正确地关闭它,对吗?谢谢大家@StevenYong,是的,在using语句中,您正在正确处理新连接。