关于c# 引发了"system.indexOutofRangeException"类型异常,该怎么处理
2011-03-05 10:54
816 查看
System命名空间下的类,用来表示数组下标越界引发的异常
说明:写了一个随机抽题的方法,用于随机抽取access数据库题目,开始时能够正常抽题,正常显示,大概随机抽取20-30题左右,出现上述异常。然后vs2008提示: private void btnRandom_Click(object sender, EventArgs e) { OleDbConnection sqlcon = boperate.getcon(); OleDbDataAdapter dk = new OleDbDataAdapter("select id from 题库表 order by id desc", sqlcon); DataTable dt = new DataTable(); dk.Fill(dt); Random rnd = new Random(); int c = int.Parse(dt.Rows[0].ItemArray.GetValue(0).ToString());//该处提示异常,异常提示附下面。 int b = rnd.Next(0, c); int d = b + 1; btnRnd.Text = d.ToString(); OleDbDataReader sqlreadRnd = boperate.getread("select * from 题库表 where id="+btnRnd.Text.Trim()+""); if (sqlreadRnd.Read() == false) { MessageBox.Show("暂无“" + labCheXing.Text + "”类型试题!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); //Frm_Main.PFrm_Main.Close(); labTotal.Text = "0"; } else { t = 1; labNow.Text = t.ToString(); //labTotal.Text = boperate.getds(Frm_Type.frmtype.str_Sqlstr, "题库表").Tables[0].Rows.Count.ToString(); if (sqlreadRnd["题型"].ToString() == "选择题") { lab_Title.Text = sqlreadRnd["题目"].ToString(); labA.Text = sqlreadRnd["回答A"].ToString(); labB.Text = sqlreadRnd["回答B"].ToString(); labC.Text = sqlreadRnd["回答C"].ToString(); labD.Text = sqlreadRnd["回答D"].ToString(); txtFlag.Text = sqlreadRnd["id"].ToString(); labC.Visible = true; labD.Visible = true; picC.Visible = true; picD.Visible = true; btnC.Visible = true; btnD.Visible = true; txtAnswer.Text = sqlreadRnd["答案"].ToString(); } else { lab_Title.Text = sqlreadRnd["题目"].ToString(); labA.Text = sqlreadRnd["回答A"].ToString(); labB.Text = sqlreadRnd["回答B"].ToString(); labC.Visible = false; labD.Visible = false; picC.Visible = false; picD.Visible = false; btnC.Visible = false; btnD.Visible = false; txtAnswer.Text = sqlreadRnd["答案"].ToString(); } } } 异常代码提示:dt.Rows[0].ItemArray = “dt.Rows[0]”引发了“System.IndexOutOfRangeException”类型的异常; base {System.SystemException} = {"在位置 0 处没有任何行。"}; {"在位置 0 处没有任何行。"}
问题补充:
vs2008最后提示: _message = "在位置 0 处没有任何行。" 谢谢大家的参与,我希望能解决这个问题,但我更希望能知道问题产生的原因,因为只有知道问题产生的根源,才能更彻底地解决它。所以麻烦诸位给分析下原因。更重要的是一开始是能运行的,到随机产生20-30题后,就会出现这个错误。所以我想问:为什么呢?
最佳答案
根据你的异常信息来看是dt(DataTable)的行数为0了,即dk.Fill(dt)没有查询结果为0行。 也许数据库中没数据,不过你说“开始时能够正常抽题,正常显示”,也就是说数据库应该是有数据的。 当然也不排除你作其它操作误删了,所以还是要确认一下。 这点比较好确认,只要你打开看看数据库行了。 如果有数据,那你在后面加sqlcon.Close();sqlreadRnd.Close();试试 每种数据库都会有一个最大连接数,而你Click事件里没有关闭连接数据库的代码,Click一下就连一次数据库,连二三十次不关闭,有可能就会造成“开始正常,后面异常”(瞎猜的,不知对不对)如果是这个原因,你也可以把sqlcon设为全局变量。这样应该也只是连一回数据库
在代码里添加sqlcon.Close();sqlreadRnd.Close()后,程序正常,点击n次都不报错。所以你的推理是正确的
相关文章推荐
- “System.IndexOutOfRangeException”类型的异常在 Stores.dll 中发生,但未在用户代码中进行处理
- c# 处理大批量数据 时遇到 类型为“System.OutOfMemoryException”的异常
- 发布网站时出现"加载配置文件时出错: 引发类型为“System.OutOfMemoryException”的异常"
- “System.OutOfMemoryException”类型的未经处理的异常在 mscorlib.dll 中发生
- 总结 Xap 包装失败。引发类型为“System.OutOfMemoryException”的异常 的解决方案
- 文件下载报错:引发类型为“System.OutOfMemoryException”的异常-.Net 内存溢出
- “System.OutOfMemoryException”类型的异常在 mscorlib.dll 中发生,但未在用户代码中进行处理
- nopCommerce 安装失败: 引发类型为“System.OutOfMemoryException”的异常。
- 引发类型为“System.OutOfMemoryException”的异常。 遍历DataGridView 获取行错误
- Guid做主键使用数据集时出现System.OutOfMemoryException: 引发类型为“System.OutOfMemoryException”的异常
- Android 中 java.lang.IllegalArgumentException: pointerIndex out of range 异常的处理方法
- ASP.NET异常具体信息: System.IndexOutOfRangeException: 索引 0 不是为负数,就是大于行数。
- 关于ibatis的parameter index out of range (1 > number parameters which is 0).异常
- Xap 包装失败。引发类型为“System.OutOfMemoryException”的异常
- 引发类型为System.OutOfMemoryException的异常
- C# 读取app.config配置文件 节点键值,提示 "System.TypeInitializationException 类型初始值设定项引发异常" 错误的解决方案
- Xap 包装失败,引发类型为“System.OutOfMemoryException”的异常
- System.OutOfMemoryException: 引发类型为“System.OutOfMemoryException”的异常
- sqlserver,执行生成脚本时“引发类型为“System.OutOfMemoryException”的异常”(已解决)
- Android 中 java.lang.IllegalArgumentException: pointerIndex out of range 异常的处理方法