不支持关键字MultipleActiveResultSets

时间:2010-02-24 09:17:01

标签: sql-server sql-server-2005 mars

我们在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:不支持关键字:'multipleactiverecordsets'位于以下行..

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

针对SQL2005 Express和SQL2008标准版时,会出现同样的异常。有什么建议吗?

为了回应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;
}

我看不出有什么理由会在同一个连接上创建多个数据读取器。

2 个答案:

答案 0 :(得分:2)

除非你因功能原因确实需要MARS,否则我的建议是专注于潜在的问题 - 听起来像(我可能是错的!)类的预期/预期行为是不打开多个数据接收器一个单一的连接同时。

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

编辑1: 在清理数据引导器等方面,该代码看起来确实不错。除非有一些多线程在进行,否则会因使用shared _connection对象而导致问题? (我怀疑是这种情况)。该类中是否有其他方法没有关闭datareader?

答案 1 :(得分:2)

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

"Question: When is a non-static class static?"