注册 登录
编程论坛 ASP.NET技术论坛

索引超出范围。必须为非负值并小于集合大小(超紧急,求救!!!)

雪雨星风 发布于 2008-06-28 13:20, 5953 次点击
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。
参数名: index

源错误:

行 33:         if (sdr.Read())行 34:         {          行 35:             ((LinkButton)(GridView1.Rows[0].Cells[1].FindControl("LinkButton1"))).Text = sdr["UF_CARD_TITLE"].ToString();行 36:             ((Label)(GridView1.Rows[0].Cells[2].FindControl("Label2"))).Text = Convert.ToString(sdr["UF_CARD_USERID"]);行 37:             ((Label)(GridView1.Rows[0].Cells[2].FindControl("Label3"))).Text = Convert.ToString(sdr["UF_CARD_ADDTIME"]);

源文件: e:\admin\bbs_liebiao.aspx.cs    行: 35



protected void binddingzhi()
    {
        string sqlcomm = "";
        sqlcomm += "SELECT UF_CARD_TITLE,UF_CARD_USERID,UF_CARD_ADDTIME,UF_RECARD_SORT, ";
        sqlcomm += " UF_CARD_VISITQUANTITY,UF_RECARD_ADDTIME,UF_RECARD_USERID FROM UF_CARD,UF_RECARD WHERE UF_RECARD_SORT IN  ";
        sqlcomm += " (SELECT count(*) FROM UF_RECARD WHERE UF_RECARD_CARDID IN (SELECT UF_CARD_ID FROM UF_CARD)) ";
        sqlcomm += " AND UF_CARD_TOP = 1 ORDER BY UF_CARD_ADDTIME desc ";
        SqlConnection myconn = new SqlConnection(publicclass.getconnstr());
        myconn.Open();
        SqlCommand mycommand = new SqlCommand(sqlcomm, myconn);
        SqlDataReader sdr = mycommand.ExecuteReader();        
        if (sdr.Read())
        {         
            ((LinkButton)(GridView1.Rows[0].Cells[1].FindControl("LinkButton1"))).Text = sdr["UF_CARD_TITLE"].ToString();
            ((Label)(GridView1.Rows[0].Cells[2].FindControl("Label2"))).Text = Convert.ToString(sdr["UF_CARD_USERID"]);
            ((Label)(GridView1.Rows[0].Cells[2].FindControl("Label3"))).Text = Convert.ToString(sdr["UF_CARD_ADDTIME"]);
            ((Label)(GridView1.Rows[0].Cells[3].FindControl("Label4"))).Text = Convert.ToString(sdr["UF_RECARD_SORT"]);
            ((Label)(GridView1.Rows[0].Cells[3].FindControl("Label5"))).Text = Convert.ToString(sdr["UF_CARD_VISITQUANTITY"]);
            ((Label)(GridView1.Rows[0].Cells[4].FindControl("Label6"))).Text = Convert.ToString(sdr["UF_RECARD_USERID"]);
            ((Label)(GridView1.Rows[0].Cells[4].FindControl("Label7"))).Text = Convert.ToString(sdr["UF_RECARD_ADDTIME"]);
        }        
    }
46 回复
#2
zhang09052008-06-28 13:26
可能是你声明变量的数据类型与表中列的数据类型不一致
#3
雪雨星风2008-06-28 13:35
我每个都强制转换了
#4
hebingbing2008-06-28 13:39
if(e.Item.ItemIndex!=-1   &&   e.Item.ItemIndex>=0)   
加个判断
#5
雪雨星风2008-06-28 13:46
我是在方法里写的代码
#6
雪雨星风2008-06-28 13:46
没有e.item
#7
hebingbing2008-06-28 13:53
把你调用binddingzhi()方法的代码贴出来看看
#8
雪雨星风2008-06-28 14:00
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;

public partial class bbs_liebiao : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            binddingzhi();
        }
    }
    protected void binddingzhi()
    {
        
        string sqlcomm = "";
        sqlcomm += "SELECT UF_CARD_TITLE,UF_CARD_USERID,UF_CARD_ADDTIME,UF_RECARD_SORT, ";
        sqlcomm += " UF_CARD_VISITQUANTITY,UF_RECARD_ADDTIME,UF_RECARD_USERID FROM UF_CARD,UF_RECARD WHERE UF_RECARD_SORT IN  ";
        sqlcomm += " (SELECT count(*) FROM UF_RECARD WHERE UF_RECARD_CARDID IN (SELECT UF_CARD_ID FROM UF_CARD)) ";
        sqlcomm += " AND UF_CARD_TOP = 1 ORDER BY UF_CARD_ADDTIME desc ";
        SqlConnection myconn = new SqlConnection(publicclass.getconnstr());
        myconn.Open();
        SqlCommand mycommand = new SqlCommand(sqlcomm, myconn);
        SqlDataReader sdr = mycommand.ExecuteReader();        
        if (sdr.Read())
        {
            if (Convert.ToInt32(GridView1.Rows[0]) != -1 && Convert.ToInt32(GridView1.Rows[0]) >= 0)
            {
                ((LinkButton)(GridView1.Rows[0].Cells[1].FindControl("LinkButton1"))).Text = sdr["UF_CARD_TITLE"].ToString();
                ((Label)(GridView1.Rows[0].Cells[2].FindControl("Label2"))).Text = Convert.ToString(sdr["UF_CARD_USERID"]);
                ((Label)(GridView1.Rows[0].Cells[2].FindControl("Label3"))).Text = Convert.ToString(sdr["UF_CARD_ADDTIME"]);
                ((Label)(GridView1.Rows[0].Cells[3].FindControl("Label4"))).Text = Convert.ToString(sdr["UF_RECARD_SORT"]);
                ((Label)(GridView1.Rows[0].Cells[3].FindControl("Label5"))).Text = Convert.ToString(sdr["UF_CARD_VISITQUANTITY"]);
                ((Label)(GridView1.Rows[0].Cells[4].FindControl("Label6"))).Text = Convert.ToString(sdr["UF_RECARD_USERID"]);
                ((Label)(GridView1.Rows[0].Cells[4].FindControl("Label7"))).Text = Convert.ToString(sdr["UF_RECARD_ADDTIME"]);
            }
        }        
    }
#9
雪雨星风2008-06-28 14:01
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" BorderColor="#8080FF"
        Width="100%">
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                    <img src="images/bbs_1_12.jpg" />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="顶置">
                <ItemTemplate>
                    &nbsp;<asp:LinkButton ID="LinkButton1" runat="server">LinkButton</asp:LinkButton>
                    <img src="images/new.gif" />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="作者">
                <ItemTemplate>
                    <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label><br />
                    <asp:Label ID="Label3" runat="server" ForeColor="DarkGray" Text="Label"></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="回复/查看">
                <ItemTemplate>
                    <asp:Label ID="Label4" runat="server" ForeColor="DarkGreen" Text="Label"></asp:Label>
                    /<asp:Label ID="Label5" runat="server" Text="Label"></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="最后发表">
                <ItemTemplate>
                    <asp:Label ID="Label6" runat="server" Text="Label"></asp:Label>
                    <br />
                    <span style="color: darkgray">by</span>
                    <asp:Label ID="Label7" runat="server" ForeColor="Silver" Text="Label"></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
        <HeaderStyle BackColor="MediumTurquoise" Height="30px" />
    </asp:GridView>
#10
雪雨星风2008-06-28 15:07
帮帮忙啊   现在超级紧急  急需解决
#11
hebingbing2008-06-28 15:49
从代码上看貌似看不出来有什么问题,所以你应该看看你的sql语句,你先这么做:
 if (sdr.Read())
        {
            if (Convert.ToInt32(GridView1.Rows[0]) != -1 && Convert.ToInt32(GridView1.Rows[0]) >= 0)
            {
                ((LinkButton)(GridView1.Rows[0].Cells[1].FindControl("LinkButton1"))).Text = sdr["UF_CARD_TITLE"].ToString();
                ((Label)(GridView1.Rows[0].Cells[2].FindControl("Label2"))).Text = Convert.ToString(sdr["UF_CARD_USERID"]);
                ((Label)(GridView1.Rows[0].Cells[2].FindControl("Label3"))).Text = Convert.ToString(sdr["UF_CARD_ADDTIME"]);
                ((Label)(GridView1.Rows[0].Cells[3].FindControl("Label4"))).Text = Convert.ToString(sdr["UF_RECARD_SORT"]);
                ((Label)(GridView1.Rows[0].Cells[3].FindControl("Label5"))).Text = Convert.ToString(sdr["UF_CARD_VISITQUANTITY"]);
                ((Label)(GridView1.Rows[0].Cells[4].FindControl("Label6"))).Text = Convert.ToString(sdr["UF_RECARD_USERID"]);
                ((Label)(GridView1.Rows[0].Cells[4].FindControl("Label7"))).Text = Convert.ToString(sdr["UF_RECARD_ADDTIME"]);
            }
        }        
将这些内容暂时注释掉
换成:
   if (sdr.Read())
{
response.write(sdr["UF_CARD_TITLE"].ToString())
……
……
}
将这些值都输出看看到底能不能取到值
#12
雪雨星风2008-06-28 15:57
异常详细信息: System.IndexOutOfRangeException: UF_CARD_TIELE

源错误:


行 34:         if (sdr.Read())
行 35:         {
行 36:             Response.Write(sdr["UF_CARD_TIELE"].ToString());
行 37:             //((LinkButton)(GridView1.Rows[0].Cells[1].FindControl("LinkButton1"))).Text = sdr["UF_CARD_TITLE"].ToString();
行 38:             //((Label)(GridView1.Rows[0].Cells[2].FindControl("Label2"))).Text = Convert.ToString(sdr["UF_CARD_USERID"]);
 

源文件: e:\admin\bbs_liebiao.aspx.cs    行: 36
#13
雪雨星风2008-06-28 15:58
怎么取不到值啊
#14
雪雨星风2008-06-28 16:00
SQL语句在查询分析器中很正常
#15
hebingbing2008-06-28 16:01
看看你的数据库是不是空的啊,如果不是空的,那么可能你的where条件下的数据是空的
#16
雪雨星风2008-06-28 16:04
有一千多条数据   sql语句在查询分析器中已经查出来了
#17
hebingbing2008-06-28 16:10
仔细查看你的sql语句,可能是某个字段拼写出错也说不定啊。完了之后再
   if (sdr.Read())
{
response。write(“有数据”)
}
else
{
response。write(“无数据”)
}
然后改成输出字段值
到没有问题了再改成原来的内容
#18
雪雨星风2008-06-28 16:12
数据库中有1000多条数据   在查询分析器中那条数据已经查出来结果了
#19
雪雨星风2008-06-28 16:12
(10 行受影响)
#20
hebingbing2008-06-28 16:19
还是仔细检查一下你的sql语句,注意一些字段的值
改成这样的试试:
  if (sdr.Read())
{
response.write(sdr.getcalue(0).tostring())
……
……
}
其实这些都是一样的,问题的关键应该还是在sql语句中
#21
雪雨星风2008-06-28 16:22
if (sdr.Read())
        {
            Response.Write("ok");
            //Response.Write(sdr["UF_CARD_TIELE"].ToString());
            //((LinkButton)(GridView1.Rows[0].Cells[1].FindControl("LinkButton1"))).Text = sdr["UF_CARD_TITLE"].ToString();
            //((Label)(GridView1.Rows[0].Cells[2].FindControl("Label2"))).Text = Convert.ToString(sdr["UF_CARD_USERID"]);
            //((Label)(GridView1.Rows[0].Cells[2].FindControl("Label3"))).Text = Convert.ToString(sdr["UF_CARD_ADDTIME"]);
            //((Label)(GridView1.Rows[0].Cells[3].FindControl("Label4"))).Text = Convert.ToString(sdr["UF_RECARD_SORT"]);
            //((Label)(GridView1.Rows[0].Cells[3].FindControl("Label5"))).Text = Convert.ToString(sdr["UF_CARD_VISITQUANTITY"]);
            //((Label)(GridView1.Rows[0].Cells[4].FindControl("Label6"))).Text = Convert.ToString(sdr["UF_RECARD_USERID"]);
            //((Label)(GridView1.Rows[0].Cells[4].FindControl("Label7"))).Text = Convert.ToString(sdr["UF_RECARD_ADDTIME"]);            
        }
        else
        {
            Response.Write("no");
        }



输出的是ok
#22
hebingbing2008-06-28 16:25
if (sdr.Read())
{
response.write(sdr.getvalue(0).tostring())
……
……
}
#23
雪雨星风2008-06-28 16:29
给你说说结果你都不会相信
#24
雪雨星风2008-06-28 16:32
Response.Write(sdr["UF_CARD_TITLE"]);
内容可以输出出来
#25
雪雨星风2008-06-28 16:35
当代最新爆料新闻,笑不死你完不了!
开心一刻
2008-6-28 10:38:46
162
0
用户名称
2008-6-28 11:23:17


一条不少的全读出来了
#26
hebingbing2008-06-28 16:39
那继续改啊,改成原来的样子看看,这次是怎么输出的,改了什么地方,改回原来的时候也照做
#27
雪雨星风2008-06-28 16:41
我是照着复制的
#28
雪雨星风2008-06-28 16:43
Response.Write(sdr["UF_CARD_TITLE"]);
((LinkButton)(GridView1.Rows[0].Cells[1].FindControl("LinkButton1"))).Text = Convert.ToString(sdr["UF_CARD_TITLE"]);
#29
hebingbing2008-06-28 16:48
还是不行吗?
还是那个错误提示?
#30
雪雨星风2008-06-28 16:50
“/admin”应用程序中的服务器错误。
--------------------------------------------------------------------------------

索引超出范围。必须为非负值并小于集合大小。
参数名: index
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。
参数名: index

源错误:


行 47:             Response.Write("<br>");
行 48:             Response.Write(sdr["UF_RECARD_ADDTIME"]);
行 49:             ((LinkButton)(GridView1.Rows[0].Cells[1].FindControl("LinkButton1"))).Text = Convert.ToString(sdr["UF_CARD_TITLE"]);
行 50:             //((Label)(GridView1.Rows[0].Cells[2].FindControl("Label2"))).Text = Convert.ToString(sdr["UF_CARD_USERID"]);
行 51:             //((Label)(GridView1.Rows[0].Cells[2].FindControl("Label3"))).Text = Convert.ToString(sdr["UF_CARD_ADDTIME"]);
 

源文件: e:\admin\bbs_liebiao.aspx.cs    行: 49
#31
雪雨星风2008-06-28 16:51
一点都没变
#32
hebingbing2008-06-28 16:52
感觉有点郁闷,我也找不出来什么错误了
Convert.ToString(sdr["UF_CARD_TITLE"]);

Convert.ToString去掉试试
((LinkButton)(GridView1.Rows[0].Cells[1].FindControl("LinkButton1"))).Text = sdr["UF_CARD_TITLE"];
#33
雪雨星风2008-06-28 17:01
我试过  
这是去掉后提示的错误

无法将类型“object”隐式转换为“string”。存在一个显式转换(是否缺少强制转换?)
#34
hebingbing2008-06-28 17:05
sdr["UF_CARD_TITLE"].tostring();
最后一次尝试了,要是不行我实在没有办法了,今天我都感觉自己在胡来,一般在调试JavaScript的时候我才会这样考运气。呵呵。我还是建议仔细检查字段的拼写等。
#35
雪雨星风2008-06-28 17:10
我试了 不行   字段的拼写错误也不能每一行都错吧
我一行一行的单独输出也不行 错误完全一样
#36
雪雨星风2008-06-28 17:18


哪位帮我看下  我快疯了
#37
雪雨星风2008-06-30 09:10
没人知道是什么地方出错了吗?
#38
tomtory2008-06-30 11:42
此问题解决没有的哦!???
#39
雪雨星风2008-06-30 12:24
没解决    你若可以帮下忙
#40
tomtory2008-06-30 13:21
首先确定一点
sdr["UF_CARD_TITLE"];

这个值取出来没有的哦!??
#41
贝蕾2008-06-30 13:39
确切的说就是sql语句有拼写错误,好好检查之后再发帖……
#42
雪雨星风2008-06-30 13:47
Response.Write(sdr["UF_CARD_TITLE"]);
如果用输出的方法内容全可以读出来
#43
雪雨星风2008-06-30 13:49
protected void binddingzhi()
    {
        
        string sqlcomm = "";
        sqlcomm += "SELECT UF_CARD_TITLE,UF_CARD_USERID,UF_CARD_ADDTIME,UF_RECARD_SORT,";
        sqlcomm += "UF_CARD_VISITQUANTITY,UF_RECARD_ADDTIME,UF_RECARD_USERID FROM UF_CARD,UF_RECARD WHERE UF_RECARD_SORT IN";
        sqlcomm += " (SELECT count(*) FROM UF_RECARD WHERE UF_RECARD_CARDID IN (SELECT UF_CARD_ID FROM UF_CARD))";
        sqlcomm += " AND UF_CARD_TOP = 1 ORDER BY UF_CARD_ADDTIME desc";
        SqlConnection myconn = new SqlConnection(publicclass.getconnstr());
        myconn.Open();
        SqlCommand mycommand = new SqlCommand(sqlcomm, myconn);
        SqlDataReader sdr = mycommand.ExecuteReader();
        for (int i = 0; i < 10; i++)
        {
            if (sdr.Read())
            {
                Response.Write(sdr["UF_CARD_TITLE"]);
                Response.Write("<br>");
                Response.Write(sdr["UF_CARD_USERID"]);
                Response.Write("<br>");
                Response.Write(sdr["UF_CARD_ADDTIME"]);
                Response.Write("<br>");
                Response.Write(sdr["UF_RECARD_SORT"]);
                Response.Write("<br>");
                Response.Write(sdr["UF_CARD_VISITQUANTITY"]);
                Response.Write("<br>");
                Response.Write(sdr["UF_RECARD_USERID"]);
                Response.Write("<br>");
                Response.Write(sdr["UF_RECARD_ADDTIME"]);
                Response.Write("<br>");
                //((LinkButton)(GridView1.Rows[0].Cells[1].FindControl("LinkButton1"))).Text = sdr["UF_CARD_TITLE"].ToString();
                //((Label)(GridView1.Rows[0].Cells[2].FindControl("Label2"))).Text = sdr["UF_CARD_USERID"].ToString();
                //((Label)(GridView1.Rows[0].Cells[2].FindControl("Label3"))).Text = sdr["UF_CARD_ADDTIME"].ToString();
                //((Label)(GridView1.Rows[0].Cells[3].FindControl("Label4"))).Text = sdr["UF_RECARD_SORT"].ToString();
                //((Label)(GridView1.Rows[0].Cells[3].FindControl("Label5"))).Text = sdr["UF_CARD_VISITQUANTITY"].ToString();
                //((Label)(GridView1.Rows[0].Cells[4].FindControl("Label6"))).Text = sdr["UF_RECARD_USERID"].ToString();
                //((Label)(GridView1.Rows[0].Cells[4].FindControl("Label7"))).Text = sdr["UF_RECARD_ADDTIME"].ToString();            
            }
            else
            {
                Response.Write("no");
            }
        }
    }
#44
tomtory2008-06-30 17:18
Response.Write(sdr["UF_RECARD_ADDTIME"]);
你这样得到了值 那么证明sdr["UF_RECARD_ADDTIME"]是将值取出来了的

报的是索引超出范围

应该是
((Label)(GridView1.Rows[0].Cells[2].FindControl("Label2"))).Text
这个没有找到Label控件
#45
雪雨星风2008-06-30 18:15
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" BorderColor="#8080FF"
        Width="100%">
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                    <img src="images/bbs_1_12.jpg" />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="顶置">
                <ItemTemplate>
                    &nbsp;<asp:LinkButton ID="LinkButton1" runat="server">LinkButton</asp:LinkButton>
                    <img src="images/new.gif" />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="作者">
                <ItemTemplate>
                    <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label><br />
                    <asp:Label ID="Label3" runat="server" ForeColor="DarkGray" Text="Label"></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="回复/查看">
                <ItemTemplate>
                    <asp:Label ID="Label4" runat="server" ForeColor="DarkGreen" Text="Label"></asp:Label>
                    /<asp:Label ID="Label5" runat="server" Text="Label"></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="最后发表">
                <ItemTemplate>
                    <asp:Label ID="Label6" runat="server" Text="Label"></asp:Label>
                    <br />
                    <span style="color: darkgray">by</span>
                    <asp:Label ID="Label7" runat="server" ForeColor="Silver" Text="Label"></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
        <HeaderStyle BackColor="MediumTurquoise" Height="30px" />
    </asp:GridView>
#46
雪雨星风2008-06-30 18:16
怎么可能没有label啊
#47
tomtory2008-07-01 09:21
不是说没有label,而是说label没有找到

你打断点监视一下看看的嘛

这样你可以找到详细的错误位置噻
1