我从一开始就很抱歉,我没有太多的信息可以继续,我只是想找一些帮助来debugging我的问题。
我有SQL Server 2008 RC2计算机上运行Windows Servernetworking版2008年5个站点。 在所有网站上(不是全部同时),我会在我的ASP.NET 2网站上发现一些错误,说Index was outside the bounds of the array. 在SQL游标上。 这是发生在数据肯定存在的地方,如果不是,我会得到更多的错误。 就好像SQL服务器由于某种原因不能返回结果。
我不知道如何开始debugging,我似乎没有得到任何超时错误。 我的问题是:
对模糊的描述抱歉; 目前我没有更多的事情要做。
编辑到目前为止的答案:
大多数情况下,相同的代码将顺利运行。 我今天创build了一个无限循环,每次都执行一个SQL查询,然后试图在同一个网站上加载一个页面,并且带回了这个错误。 我的观点是,如果没有可能的办法,游标将被归还为空。
Edit2好吧,也许我没有正确解释。 我明白出界是错误的,就是编码。 我所说的是,这是99.9%的时间在相同的代码随机发生。 是的代码引发错误,但它不应该有一个空的结果集在第一位。 这里是完整的堆栈跟踪(同样,这段代码的工作时间是99.9%):
(我正在使用Delphi.NET所以这是Borland的一部分来自哪里) – 请注意,错误发生时,它正在清理自己的名单内部…
Borland.Vcl.TDBBufferList.FreeHGlobal(IntPtr Ptr) at Borland.Vcl.TCustomADODataSet.FreeRecordBuffer(IntPtr& Buffer) at Borland.Vcl.TDataSet.SetBufListSize(Int32 Value) at Borland.Vcl.TDataSet.CloseCursor() at Borland.Vcl.TDataSet.SetActive(Boolean Value) at Borland.Vcl.TDataSet.Close() at WebCommon.TStockItemIntf.@13$Initialise$GetPLPrice(TStockItemIntf Self, String CCode, String SkCode, String PLStr) at WebCommon.TStockItemIntf.@23$Initialise$FinalPrice(TStockItemIntf Self, $Unnamed205& $frame_TStockItemIntf.Initialise, TKosCompany Company, TKosStock SkItem, TStockPriceCalcType PLCalcOption) at WebCommon.TStockItemIntf.Initialise(TKosStock SkItem, STOCK_ITEM SkCatItem, TAssignStockOptions AssignOptions, HttpSessionState Session, String DefaultPriceList) at WebCommon.TKosDropInProducerP.@68$AssignStockItem$AssignStockObjLst(TKosDropInProducerP Self, $Unnamed206& $frame_TKosDropInProducerP.AssignStockItem, TKosStock SkItem, String DefaultPriceList) at WebCommon.TKosDropInProducerP.AssignStockItem(TStringList StockCodeList, CATEGORY Category, HttpSessionState Session, TAssignStockOptions AssignOptions) at RecentlyViewedShortList.TRecentlyViewedShortList.Page_Load(Object sender, EventArgs e) at System.Web.UI.Control.OnLoad(EventArgs e) at System.Web.UI.Control.LoadRecursive() at System.Web.UI.Control.LoadRecursive() at System.Web.UI.Control.LoadRecursive() at System.Web.UI.Control.LoadRecursive() at System.Web.UI.Control.LoadRecursive() at System.Web.UI.Control.LoadRecursive() at System.Web.UI.Control.LoadRecursive() at System.Web.UI.Control.LoadRecursive() at System.Web.UI.Control.LoadRecursive() at System.Web.UI.Control.LoadRecursive() at System.Web.UI.Control.LoadRecursive() at System.Web.UI.Control.LoadRecursive() at System.Web.UI.Control.LoadRecursive() at System.Web.UI.Control.LoadRecursive() at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
这个错误来自.NET,与SQL Server根本没有关系。 检查你的代码,确保你的数组是正确定义的。 请记住,在.NET数组中也有一个0的位置。 如果你知道你有10篇文章从sql server读取,而你把数组调暗到10,你必须使用0 – 9 NOT 1-10,因为10会给你上述错误。 因此,不是一个SQL Server的问题。
有很多方法来追查如果你的SQL服务器负载过重或其他types的麻烦,但它与上面描述的问题没有关系。 我推荐https://dba.stackexchange.com/来学习和阅读更多。
正如Martin指出的那样,这是一个.Net错误。
你应该检查你的代码,它可以是任何东西,但我会举一个例子来说明如何在伪代码中发生这种情况:
Item[] myItems = new Item[sql.queryshot("select count(*) form myTable")]; int counter=0; Cursor MyCursor = GetData(); foreach(Data data in MyCursor){ myItems[counter] = new Item(data); counter++; }
如果有人在数组Item []和GetData()方法的初始化之间插入一条logging,则会看到索引越界exception,因为您将传递数组的末尾。 这种情况不会经常发生,因为两次行动之间的时间很短。
如果它是一个超载的服务器,你肯定会得到其他的错误,而不是这个。
我设法find了这个问题的原因(我认为)。
我绝对可以排除一个SQL服务器忙,因为我已经在一个单独的SQL服务器上运行一个网站,看看它是否有帮助,但问题仍然存在。
基本上当我第一次写网站的数据库连接代码时,我认为最好是每页加载创build一个连接到数据库。 这(现在我知道)不build议,因为SQL服务器的连接池,无论如何将处理连接。
当我使用这个连接的时候,我认为持有logging缓冲区的TList有时会被改变,当我尝试去访问已经被删除/改变的结果时,它会抛出一个超出范围的exception。
在这个笔记上,我已经重写了我的数据库连接,现在正在使用原生的.NET连接,而不是Delphi糟糕的修改。