错误:索引超出范围

时间:2011-10-05 07:28:23

标签: c# asp.net excel csv

protected void btnDownload_Click(object sender, EventArgs e)
    {

        //to request the name of the event from the listbox from Main.aspx
        string EventName = Request.QueryString["ename"];

        //Select event id statement
        //const string S = "SELECT EventName FROM Event WHERE EventID = @EventID";
        const string q = "SELECT EventID from Event WHERE EventName = @EventName"; 
        string eventid = "";
        using (SqlConnection c = new SqlConnection(@"Data Source=localhost\SQLEXPRESS;Initial Catalog=PSeminar;Integrated Security=true;Trusted_Connection=Yes;MultipleActiveResultSets=true"))
        using (SqlCommand Command = new SqlCommand(q, c))
        {
            Command.Parameters.AddWithValue("@EventName", EventName);

            c.Open();
            using (SqlDataReader rdr = Command.ExecuteReader())
                while (rdr.Read())
                {
                    Command.CommandText = "Select * from Attendance where EventID=@EventID";
                    System.Text.StringBuilder sb = new System.Text.StringBuilder();
                    sb.Append(String.Format("\"{0}\",\"{1}\", \"{2}\", \"{3}\", \"{4}\", \"{5}\", \"{6}\", \"{7}\"n",
               rdr[0], rdr[1], rdr[2], rdr[3], rdr[4], rdr[5], rdr[6], rdr[7]));
               // I have an error here(Index out of bound)

                    // to get event id from the Event name
                    eventid = rdr.GetString(0);
                    rdr.Close();
                    c.Close();

                    byte[] ar = System.Text.Encoding.UTF8.GetBytes(sb.ToString());
                    Response.ClearContent();
                    Response.ClearHeaders();
                    Response.AddHeader("Content.Type", "application/octet-stream");
                    Response.AddHeader("Content-Length", ar.Length.ToString());
                    Response.AddHeader("Content-Disposition", "attachment; filename=download.csv");
                    Response.BinaryWrite(ar);
                    Response.Flush();
                    Response.End();
                }

        }

错误是 - “索引超出了数组的范围。” 我正在尝试根据事件下载文件。到目前为止,我已经完成了这么多代码。但我不明白这个错误意味着什么。请向我解释错误“索引超出数组范围意味着什么”,请给我解决方案。感谢

4 个答案:

答案 0 :(得分:2)

您尝试访问该行中最多7列,但您只有1列(EventId)。

编辑:

在读取命令时,无法更改命令的命令文本。好吧,显然你可以,但你不会得到预期的结果。

答案 1 :(得分:1)

读者包含以下声明的结果

SELECT EventID from Event WHERE EventName = @EventName

而不是这句话

   Select * from Attendance where EventID=@EventID

我会将 const string q 替换为

 const string q = @" Select * from dbo.Attendance 
                  where EventID = (SELECT EventID from dbo.Event WHERE EventName = @EventName");

而不是*我会​​使用列名,原因有两个:数据库服务器会更喜欢它,你会确定你将拥有哪些列

答案 2 :(得分:0)

如果您读取数组并要求索引大于或等于数组的长度,则可能会发生此错误。检查您正在阅读的表格是否有8个字段,或者您是否选择了8个字段。

答案 3 :(得分:0)

索引越界意味着你正试图访问超出数组末尾的某个地方。

e.g:

var array = new[] {0, 1, 2};
var temp = array[10];

会抛出索引越界异常,因为array中的位置10没有项目(它只有3个项目,所以位置0,1和2)。

这应该足以让您尝试解决问题。如果您仍然被卡住,请告诉我,我会查看您的代码。