关于c# 引发了"system.indexOutofRangeException"类型异常,该怎么处理

解决数组下标越界异常
本文介绍了一种在随机抽题过程中遇到的数组下标越界异常问题,并通过检查数据库连接和确保资源正确关闭来解决该问题。
部署运行你感兴趣的模型镜像
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次都不报错。所以你的推理是正确的

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值