索引超出了数组界限问题!在线等!

kiky_zhang 2007-08-06 01:18:10
小妹在定义的类中定义了GetRIDdesc一个方法,用来从我的 Resturant表中取出第一个RID<PhotoRID的RID值。但是执行到这个函数时就提示我说“索引超出了数组界限”!我不知道到底是怎么回事,希望哪位高手可以指教!
public void GetRIDdesc(string PhotoRID)
{
string sql = "";

try
{
sql = "SELECT TOP 1 [RID] FROM [Resturant] where RID< @PhotoRID ORDER BY RID DESC";
myconnection.Open();
SqlCommand cmd = new SqlCommand(sql, myconnection);
cmd.Parameters.AddWithValue("@PhotoRID", PhotoRID);


using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
PhotoRID = reader["RID"].ToString();

}
}

}
catch (Exception err)
{
throw new Exception(err.Message);
}
finally
{
myconnection.Close();
}

}
...全文
1487 48 打赏 收藏 转发到动态 举报
写回复
用AI写文章
48 条回复
切换为时间正序
请发表友善的回复…
发表回复
panjun1984 2007-08-08
  • 打赏
  • 举报
回复
楼主估计拿大伙开玩笑呢,我看那代码怎么也不可能报出索引超出范围的错,
当然,只是猜测,
lonehare 2007-08-07
  • 打赏
  • 举报
回复
别瞎改了!这个函数怎么可能会抛数组越界异常,从头到脚都没用到数组!

问题肯定出在调用它的循环里

我只要读出前十个就可以了,所以做了个循环!i从0-9将结果存在一个数组里面!
---------------------------------------
确定有10个或以上?该不会只有4个吧!!
weiky626 2007-08-07
  • 打赏
  • 举报
回复
catch (Exception err)
{
throw new Exception(err.Message);
}


看了这段代码,就知道楼主是个新手,捕获一个异常又抛出,lz想想这段代码除了浪费性能还有什么其他作用吗?
antoniusguo 2007-08-07
  • 打赏
  • 举报
回复
又是小妹贴,以后看仔细了……
antoniusguo 2007-08-07
  • 打赏
  • 举报
回复
RestaurantPhotoList[i]
这个也要确保Lenth >= 10;
antoniusguo 2007-08-07
  • 打赏
  • 举报
回复
for ( int i=0; i<10||PhotoRID==null; i++)
{


GetRestaurantListPic(PhotoRID,i);

PicRID[i] = PhotoRID;//问题可能在这里,i=0-9;你确保PicRID.Length至少是10
//或者 i<10||PhotoRID==null 第2个条件一直为true导致i == 10

GetRIDdesc(PhotoRID);

}
foyuan 2007-08-06
  • 打赏
  • 举报
回复
??
IT_zen 2007-08-06
  • 打赏
  • 举报
回复
为什么用SqlDataReader ?用DataTable就不会出现这样的问题
噯卟釋手 2007-08-06
  • 打赏
  • 举报
回复
while (reader.Read())
{
for(int i=0;i<reader.FieldCount;i++)
{
PhotoRID =+PhotoRID;
}

}
myReader.Close();
kiky_zhang 2007-08-06
  • 打赏
  • 举报
回复
PhotoRID 是个共有变量!
nyzfl 2007-08-06
  • 打赏
  • 举报
回复
My-Blog地址1:http://www.cnblogs.com/nyzfl
My-Blog地址2: http://blog.csdn.net/nyzfl
nyzfl 2007-08-06
  • 打赏
  • 举报
回复
while (reader.Read())
{
PhotoRID= reader["RID"].ToString();

}

其中 PhotoRID 是什么类型,不是集合的话,为什么用循环?
kiky_zhang 2007-08-06
  • 打赏
  • 举报
回复
这是我完整的代码,OtherRID为长度为10的共有数组变量。
我有两个表,一个是存放基本信息的Restaurant表,还有一个存放图片的RestaurantPhoto表。因为一个Restaurant的ID对应多张图片,我又要读出按照ID号逆序,也就是最新入库的ID对应的一张图片!
GetRestaurantListPhoto这个函数中我先读出最新入库的ID号,然后调用GetRestaurantListPic函数来读出这个ID所对应的一个图片信息,然后把这个图片的信息存到数组PicRID中,(这是个长度为10的数组,公有变量)。再通过GetRIDdesc函数得到比这个ID小的所有ID中最新入库的ID号,循环读出十个!
kiky_zhang 2007-08-06
  • 打赏
  • 举报
回复
public void GetRestaurantListPhoto()
{
string sql = "";


try
{

sql = "SELECT TOP 1 [RID] FROM [Resturant] ORDER BY [RNumber] desc";
myconnection.Open();
SqlCommand cmd = new SqlCommand(sql, myconnection);
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
PhotoRID= reader["RID"].ToString();

}
}


}
catch (Exception err)
{
throw new Exception(err.Message);
}
finally
{
myconnection.Close();
}

for ( int i=0; i<10||PhotoRID==null; i++)
{


GetRestaurantListPic(PhotoRID,i);

PicRID[i] = PhotoRID;


GetRIDdesc(PhotoRID);

}
}
//得到LIST页店家图片的最新的店家ID
public void GetRIDdesc(string PhoRID)
{
string sql = "";

try
{
sql = "SELECT TOP 1 [RID] FROM [Resturant] where RID< @PhotoRID ORDER BY RID DESC";
myconnection.Open();
SqlCommand cmd = new SqlCommand(sql, myconnection);
cmd.Parameters.AddWithValue("@PhotoRID", PhoRID);


using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
PhotoRID = reader["RID"].ToString();

}
}

}
catch (Exception err)
{
throw new Exception(err.Message);
}
finally
{
myconnection.Close();
}

}


//LIST页显示时,获得最新入库的图片
public void GetRestaurantListPic(string PhotoRID,int i)
{
string sql = "";
try
{

ORID = OtherRID[i].ToString();
sql = "SELECT TOP 1 [RPhoto] FROM [RestaurantPhoto] where RID=@PhotoRID";
myconnection.Open();
SqlCommand cmd = new SqlCommand(sql, myconnection);
cmd.Parameters.AddWithValue("@PhotoRID", PhotoRID);

using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
RestaurantPhotoList[i] = reader["RPhoto"].ToString();

}
}

}
catch (Exception err)
{
throw new Exception(err.Message);
}
finally
{
myconnection.Close();
}
}
kiky_zhang 2007-08-06
  • 打赏
  • 举报
回复
怎么放宽?
LutzMark 2007-08-06
  • 打赏
  • 举报
回复
就是说索引超出了数组界限
放宽界限就行了
kiky_zhang 2007-08-06
  • 打赏
  • 举报
回复
高手们!不是都走了吧?帮帮小妹啊!555
kiky_zhang 2007-08-06
  • 打赏
  • 举报
回复
cmd.Parameters.AddWithValue("@PhotoRID", PhotoRID);
这一句是正确的!我执行的时候能够正确的取到前5个值!但是当取第6个的时候就出现越界的异常!
kiky_zhang 2007-08-06
  • 打赏
  • 举报
回复
传的值是从表中读出的最新入库的ID号,然后通过GetRIDdesc函数得到数据表中比这个ID号小的最新的ID号,通过这个ID号再到图片表里面找到相应的图片信息,通过TOP 1来限定选出ID号相符的多张图片中的一张!
jiangbo1125 2007-08-06
  • 打赏
  • 举报
回复
楼主你调用GetRIDdesc这个函数时候,传的值是多少?
加载更多回复(28)
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在C#开发中,“索引超出数组界限”是常遇的错误,通常源于访问数组元素时,所用索引超出数组合法范围。数组索引从0开始,一个包含n个元素的数组,其合法索引范围为0到n-1。若访问索引为n或更大元素,或负数索引,系统会抛出System.IndexOutOfRangeException异常。在“学生管理系统”项目里,该问题可能有以下原因:一是循环条件出错,像for或foreach循环终止条件设置过大,导致遍历数组或集合时越界。二是动态索引计算有误,运行时计算索引时,因逻辑错误使索引超出范围。三是数组未初始化,使用前未分配足够空间,尝试访问时会出错。四是存在null引用,若数组对象本身是null,访问时会抛异常,需确保使用前已正确实例化。五是多线程环境下,不同线程同时修改数组索引,可能使某线程在错误状态下访问数组,触发异常。六是下标硬编码错误,如数组长度9,却误写成10。解决方法有:一是审查代码,重点检查数组访问相关代码,尤其是循环和条件语句。二是借助Visual Studio等IDE调试工具,设断点观察变量值,定位异常行。三是添加异常处理代码,如try-catch块,捕获处理异常,获取详细错误信息。四是记录异常上下文信息,便于定位问题。五是编写单元测试,验证数组操作正确性,确保各种情况下都不越界。初学者要重视这些常见错误,理解并避免它们。在“学生管理系统”中,处理学生数据数组或列表时,要确保索引合法,增加、删除或查找学生信息时逻辑正确。若有代码,针对性分析更易找到问题

62,257

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧