多用户安全的SQL连接

时间:2014-01-28 01:09:24

标签: c# asp.net sqlconnection

我有一个对象如下:

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;

一切似乎都很好,除非有2个用户同时运行代码,我将在我的Web应用程序中出现以下错误:

已经有一个与此命令关联的打开DataReader需要关闭。

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

谢谢。

2 个答案:

答案 0 :(得分:3)

那是因为你正在共享连接对象 - 不要这样做。 DatabaseAccess.Connection每次都应创建SqlConnection

答案 1 :(得分:3)

尝试在SqlConnection声明

中创建using的新实例
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;