1

我们在 ASP.NET MVC 应用程序中使用自定义成员资格提供程序。我们一直在遇到间歇性“System.InvalidOperationException - 已经有一个打开的 DataReader 与此命令关联,必须先关闭它。” 类的问题,所以我决定启用 MARS。

这是网络配置中的连接字符串...

<add name="CustomMembershipServices" connectionString="User ID=CUSTOM_USER;Password=pwd;Database=OUR_DB;Server=.\SQLEXPRESS;MultipleActiveResultSets=true;" providerName="System.Data.SqlClient" />

我们的代码现在在以下行抛出 ArgumentException: Keyword not supported: 'multipleactiverecordsets'。

protected void CreateAndOpenConnection()
{
    // Exception thrown here...
    _connection = new SqlConnection(_connectionString);
    _connection.Open();
}

以 SQL2005 Express 和 SQL2008 Standard 版本为目标时会出现相同的异常。有什么建议么?

作为对 AdaTheDev 的回应,这里是使用数据读取器的方法......

public bool CheckUserPassword(long userID, string password)
{
    bool success = false;

    if (!string.IsNullOrEmpty(password))
    {
        try
        {
            CreateAndOpenConnection();

            using (SqlCommand cmd = CreateSqlCommandForStoredProcedure("CheckPassword"))
            {
                IPasswordUtility generator = new PasswordUtility();

                cmd.Parameters.AddWithValue("UserID", userID);
                cmd.Parameters.AddWithValue("Password", generator.HashPassword(password));

                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    success = reader.HasRows;

                    reader.Close();
                }
            }
        }
        finally
        {
            CloseConnection();
        }
    }

    return success;
}

我看不出这会在同一连接上创建多个数据读取器的任何原因。

4

2 回答 2

2

除非您出于功能原因实际上需要 MARS,否则我的建议是关注潜在问题 - 听起来(我可能错了!)该类的预期/预期行为是不针对单个连接打开多个数据读取器同时。

如果是这种情况,那么您应该确保在同一连接上打开另一个数据读取器之前正确关闭数据读取器 - 听起来有些情况没有这样做。使用 MARS 作为解决方法仍然会留下某些东西没有正确关闭的事实。

编辑 1: 在清理数据读取器等方面,该代码对我来说确实不错。除非有一些多线程正在进行,否则通过使用共享的 _connection 对象引起问题?(我怀疑是这种情况)。类中是否还有其他不关闭数据读取器的方法?

于 2010-02-24T09:41:27.710 回答
2

问题是由于 ASP.NET 提供程序框架将我的类视为静态单例......

“问题:非静态类什么时候是静态的?”

于 2010-02-24T14:09:34.453 回答