【问题标题】:Multi users safe SQL Connection多用户安全 SQL 连接
【发布时间】:2014-01-28 01:09:24
【问题描述】:

我在下面有一个对象:

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;
        }
    }
}

所以每当我需要在我的网络应用程序中建立连接时,我都会使用类似的东西:

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 需要关闭。

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

谢谢。

【问题讨论】:

  • 您能否解释一下为什么您的Connection 必须是static(这是您看到错误的原因)?
  • 我还有很多其他的数据库操作,所以我将只使用相同的静态连接。所以看起来这是错误的原因,那我该怎么说呢?

标签: c# asp.net sqlconnection


【解决方案1】:

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

【讨论】:

  • 这是否意味着我应该把 sqlConn = new SqlConnection(ConnectionString);和 sqlConn.Open();在 DatabaseAccess.Connection 中?
  • @StevenYong,是的,就是这个意思。
  • 另外,完成后不要忘记关闭连接。 Ekad 下面的方法是一个很好的方法。
  • 我相信当我使用 using (SqlConnection cnn = DatabaseAccess.Connection) 时,它会正确关闭它吗?谢谢大家!
  • @StevenYong,是的,使用using 声明,您正在正确处理newed up 连接。
【解决方案2】:

尝试在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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    相关资源
    最近更新 更多