从IDataReader读取字段时Intermittent System.IndexOutOfRangeException

时间:2011-01-19 10:16:33

标签: c# sql datareader sqlclient aspdotnetstorefront

我在代码中有一个非常奇怪的问题,我不希望它会失败。这是一个网站,有一些流量但不是很大,基于AspDotNetStoreFront。尝试从阅读器读取数据库字段时,站点间歇性崩溃。这发生在网站上的各个地方。这个代码的示例如下所示 object pValue = rs [“PropertyValueString”];

private Dictionary<string, object> GetPropertValuePairs(string userName)
    {
        string query = string.Format("select PropertyName, PropertyValueString from dbo.profile with(nolock) where CustomerGUID = {0} and StoreID = {1}", DB.SQuote(userName),AppLogic.StoreID());

        Dictionary<string, object> propertyValues = new Dictionary<string, object>();

        using (SqlConnection conn = new SqlConnection(DB.GetDBConn()))
        {
            conn.Open();

            using (IDataReader rs = DB.GetRS(query, conn))
            {
                while (rs.Read())
                {
                    string pName = DB.RSField(rs, "PropertyName");
                    object pValue = rs["PropertyValueString"];

                    if (propertyValues.ContainsKey(pName) == false)
                    {
                        propertyValues.Add(pName, pValue);
                    }
                }

                rs.Close();
                rs.Dispose();
            }
            conn.Close();
            conn.Dispose();
        }

        return propertyValues;
    }

这是SqlClient的标准用法,我看不出它有什么问题。错误的堆栈跟踪是这样的:

System.Data.ProviderBase.FieldNameLookup.GetOrdinal(String fieldName)中的System.IndexOutOfRangeException    at System.Data.SqlClient.SqlDataReader.GetOrdinal(String name)    at System.Data.SqlClient.SqlDataReader.get_Item(String name)    at AspDotNetStorefront.ASPDNSFProfileProvider.GetPropertValuePairs(String userName)    在AspDotNetStorefront.ASPDNSFProfileProvider.GetPropertyValues(SettingsContext context,SettingsPropertyCollection settingsProperties)   在System.Configuration.SettingsBase.GetPropertiesFromProvider(SettingsProvider provider)    在System.Configuration.SettingsBase.GetPropertyValueByName(String propertyName)    在System.Configuration.SettingsBase.get_Item(String propertyName)    在System.Web.Profile.ProfileBase.GetInternal(String propertyName)    在System.Web.Profile.ProfileBase.get_Item(String propertyName)    在System.Web.Profile.ProfileBase.GetPropertyValue(String propertyName)    在AspDotNetStorefront.SkinBase.OnPreInit(EventArgs e)    在System.Web.UI.Page.PerformPreInit()    在System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)

当网站崩溃时,需要重新启动IIS才能重新启动它。它位于Windows Server 2008上,带有.NET 3.5和SQL 2008,全部都是最新的。该机器为64位,SQL Server启用了32位模式,以及使用“经典流水线模式”的应用程序池。连接字符串是

 <add name="PrimaryConnectionString" connectionString="data source=XXXX;database=XXXX;Integrated Security=True;Application Name=XXXX;MultipleActiveResultSets=true" />

非常感谢任何帮助!!

2 个答案:

答案 0 :(得分:2)

我猜你是在线程之间共享datareader的实例。确保DB.GetRS在所有情况下都返回一个新的datareader实例,而不是返回共享实例。

答案 1 :(得分:2)

经过多次搜索,我遇到了我的确切问题。我在工作中向我的朋友展示了他们的帖子,他们承认这是我们的情况。然后我意识到这里没有足够的信息来解决我的问题。所以我采取了一些在此处说的内容并进行了一些搜索。

我发现了这个帖子:Index Out Of Range Exception。这不仅仅是NHibernate的好帖子。

我在Pooling=false;的连接字符串中添加了web.config,然后启动了一系列测试以加载服务器。我们测试了当前最大访问者负载的200%以尝试使用此错误终止服务器。以前,我们会在100%以下崩溃。没有一个错误。我将测试另一个选项Enlist = false。我以前没有听说过这个。

还有一点,我们已经运行AspDotNetStoreFront多年了。所以我回去找出为什么我们最新的网站发布了所有这些错误,旧网站没有错误。事实证明我们之前添加了pooling=false;非常成功。