【发布时间】:2012-04-17 13:24:12
【问题描述】:
我知道什么是越界索引。当我调试时,我也看到了原因。基本上正在发生的事情是我对我的数据库进行过滤以查找潜在/待处理的记录。然后,我收集一组这些数字,将它们发送到另一台服务器,以检查这些数字是否已升级为销售。如果它已升级为销售,服务器会返回新的销售订单 ID 和我的旧待处理销售订单 ID (SourceID)。然后,我在该列表上执行一个 for 循环,以将其过滤掉特定的 SourceID,并将 SourceID 更新为销售订单 ID,并更改几个其他值。问题是,当我在第一个过滤器上使用该过滤器时,它会引发索引越界错误。我检查过滤器返回的结果,它显示为 0。我觉得有点奇怪,因为我从列表中获取了销售订单号,所以它应该在那里。所以我不知道这笔交易是什么。这是引发错误的相关代码。而且它并非一直都这样做。就像我今天早上刚刚运行代码并没有抛出错误一样。但昨晚在我回家之前发生了。
filter.RowFilter = string.Format("Stage = '{0}'", Potential.PotentialSale);
if (filter.Count > 0)
{
var Soids = new int[filter.Count];
Console.Write("Searching for Soids - (");
for (int i = 0; i < filter.Count; i++)
{
Console.Write(filter[i][1].ToString() + ",");
Soids[i] = (int)filter[i][1];
}
Console.WriteLine(")");
var pendingRecords = Server.GetSoldRecords(Soids);
var updateRecords = new NameValueCollection();
for (int i = 0; i < pendingRecords.Length; i++)
{
filter.RowFilter = "Soid = " + pendingRecords[i][1];
filter[0].Row["Soid"] = pendingRecords[i][0];
filter[0].Row["SourceId"] = pendingRecords[i][1];
filter[0].Row["Stage"] = Potential.ClosedWon;
var potentialXML = Potential.GetUpdatePotentialXML(filter[0].Row["Soid"].ToString(), filter[0].Row["Stage"].ToString());
updateRecords.Add(filter[0].Row["ZohoID"].ToString(), potentialXML);
}
如果我计算正确的第 17 行是引发错误的错误。 pendingRecords 是一个 object[][] 数组。 pendingRecords[i] 是单个记录。 pendingRecords[i][0] 是新的 Sales OrderID (SOID),pendingRecords[i][1] 是旧的 SOID(现在是 SourceID)
这有什么帮助吗?是因为我将 SOID 更改为新的 SOID,并且过滤器会自动更新吗?我只是不知道
【问题讨论】:
-
那一行有三个索引:一个在
filter[0],两个在pendingRecords[i][0]。如果pendingRecords[i]在上一行没有失败,那么它在第 17 行也不应该失败。同样,pendingRecords[i]在第 17 行中的元素数量必须与第 16 行中的相同,所以pendingRecords[1][0]必须成功。您只需在上一行中设置过滤器的RowFilter属性。我想知道这是否不会将过滤器的Count更改为零。 -
我同意你所说的。在此实例中返回的结果是 pendingRecords[0] = {4462, 20496},这是唯一的记录返回。昨晚pendingRecords 有13 条记录。由于我的 Server.GetSoldRecords 调用,它们将始终具有匹配的记录。我假设 RowFilter 是一个 Get;Set;方法不是一个列表,而是一个字符串。所以我不明白为什么它没有正确过滤。昨晚过滤器读取“Soid = 20424”和filter.Count = 0。这很奇怪,因为当我打开我的数据库时,SOID 20424 就在那里。所以我不知道。
-
filter是什么类型?其RowFilter属性的文档说明了什么? -
var filter = AllPotentials.Table.DefaultView;Summary: // 获取或设置用于过滤在 System.Data.DataView 中查看哪些行的表达式。 // // 返回: // 一个字符串,它指定如何过滤行。有关详细信息,// 请参阅备注部分。
-
我想通了。我必须再等 6 个小时才能发布答案。基本上我必须将过滤器更改为 string.Format("Soid = '{0}'", pendingProducts[i][1]);
标签: c# database arrays indexoutofboundsexception