我们在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;
}
我看不出有什么理由会在同一个连接上创建多个数据读取器。
答案 0 :(得分:2)
除非你因功能原因确实需要MARS,否则我的建议是专注于潜在的问题 - 听起来像(我可能是错的!)类的预期/预期行为是不打开多个数据接收器一个单一的连接同时。
如果是这种情况,那么你应该确保在同一个连接上打开另一个之前正确关闭数据引擎 - 听起来有一种情况是没有这样做。使用MARS作为一种解决方法仍然会留下一些未正确关闭的事实。
编辑1: 在清理数据引导器等方面,该代码看起来确实不错。除非有一些多线程在进行,否则会因使用shared _connection对象而导致问题? (我怀疑是这种情况)。该类中是否有其他方法没有关闭datareader?
答案 1 :(得分:2)
问题是由于ASP.NET Provider框架将我的类视为静态单例...