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题后,就会出现这个错误。所以我想问:为什么呢?
<!--qbox end-->
根据你的异常信息来看是dt(DataTable)的行数为0了,即dk.Fill(dt)没有查询结果为0行。
也许数据库中没数据,不过你说“开始时能够正常抽题,正常显示”,也就是说数据库应该是有数据的。
当然也不排除你作其它操作误删了,所以还是要确认一下。 这点比较好确认,只要你打开看看数据库行了。
如果有数据,那你在后面加sqlcon.Close();sqlreadRnd.Close();试试
每种数据库都会有一个最大连接数,而你Click事件里没有关闭连接数据库的代码,Click一下就连一次数据库,连二三十次不关闭,有可能就会造成“开始正常,后面异常”(瞎猜的,不知对不对)如果是这个原因,你也可以把sqlcon设为全局变量。这样应该也只是连一回数据库
在代码里添加sqlcon.Close();sqlreadRnd.Close()后,程序正常,点击n次都不报错。所以你的推理是正确的
分享到:
相关推荐
异常类型及版本,抛出IndexOutOfRangeException类型异常,抛出InvalidOperationException类型异常,抛出InvalidOperationException类型异常,抛出InvalidOperationException类型异 常,C#源代码
使用 try/catch 处理异常 try-catch 块的用途是捕捉和处理工作代码所生成的异常。 有些异常可以在 catch 块中处理,解决问题后不会再次引发异常;但更多情况下,您唯一能做的是确保引发适当的异常。 示例 在此示例中...
7.2.2 异常处理 177 7.2.3 对异常进行封装 182 7.3 标准异常类型的使用 184 7.3.1 Exception与SystemException 184 7.3.2 ApplicationException 184 7.3.3 InvalidOperationException 184 7.3.4 ...
7.2.2 异常处理 177 7.2.3 对异常进行封装 182 7.3 标准异常类型的使用 184 7.3.1 Exception与SystemException 184 7.3.2 ApplicationException 184 7.3.3 InvalidOperationException 184 7.3.4 ...
2.IndexOutOfRangeException 数组下标越界,要保证数组下标>Length。 3.数组不能动态增加大小! 但ArrayList 和 List<>可以。 希望本文所述对大家的.NET程序设计有所帮助。 您可能感兴趣的文章:asp.net 字符串...
使用Epplus read Excel文件,write Excel文件,从DataGridView导出至Excel。
C#实现Ruby的负数索引器 public class InvertibleList<T> : List { public new T this[int index] { get { if (index >= 0) return base[index]; if (Count + index < 0) throw new ...
#region 创建一个索引器,索引器的作用就是相当于一个取值和赋值的方法 +Student this[int index] /// /// 创建一个索引器,索引器的... throw new IndexOutOfRangeException(); } return stus[index]; } set
public 数组中元素的数据类型 关键字(this) [下标] { get//根据下标获取数组中该下标所对应的元素 { //先判断下标是否越界 if (下标 >= 私有数组元素的个数) { throw new IndexOutOfRangeException...