2010-02-24 89 views
1

我们在ASP.NET MVC应用程序中使用自定义成员资格提供程序。我们一直在经历间歇性的'System.InvalidOperationException - 已经有一个打开的DataReader与这个Command关联,必须先关闭它。'所以我决定启用MARS。不支持关键字MultipleActiveResultSets

这是在web配置连接字符串...

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

+0

嗯,已经更新了我的答案。在代码中看不到任何错误。 – AdaTheDev 2010-02-24 11:47:11

回答

2

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

如果是这样的话,那么你应该确保datareaders在另一个连接打开之前正确关闭 - 听起来好像有一种情况没有完成。使用MARS作为解决方法仍然会导致事情没有被正确关闭。

编辑1: 该代码看起来确定,我在清理的DataReader等。除非有一些多线程的事情,通过使用共享_connection对象的导致问题的条款? (我怀疑是这种情况)。有没有其他的方法没有关闭datareader?

+0

我已经添加了一些更多的代码到我原来的问题。 – 2010-02-24 10:07:17