Exception 索引超出范围异常

Exception 索引超出范围异常,exception,exception-handling,sqldatareader,Exception,Exception Handling,Sqldatareader,我正试图用存储过程来填充VisualStudio端的列表 我正在使用以下存储过程: CREATE PROCEDURE [dbo].[GetColletcion] AS BEGIN select CollectionType.Name ,GlassesCollection.Name from GlassesCollection inner join CollectionType on GlassesCollection.Collection

我正试图用存储过程来填充VisualStudio端的列表

我正在使用以下存储过程:

CREATE PROCEDURE [dbo].[GetColletcion]
AS
BEGIN   
         select  CollectionType.Name ,GlassesCollection.Name 
    from    GlassesCollection
    inner join CollectionType
    on GlassesCollection.CollectionType=CollectionType.CollTypeID
END
以下是背后的代码:

protected void Button1_Click(object sender, EventArgs e)
        {

            List<GlassesCollection> list = new List<GlassesCollection>();
            using (SqlConnection conn = new SqlConnection("Server=(local);DataBase=ISeeOptic;Integrated Security=SSPI"))
            {

                GlassesCollection gln = new GlassesCollection();
                SqlCommand cmd = new SqlCommand();
                SqlDataReader reader;

                cmd.Connection = conn;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = "GetColletcion";

                conn.Open();
                reader = cmd.ExecuteReader();
                  while (reader.Read())
                    {
                        gln.Name = (string)reader["CollectionType.Name"];
                        gln.CollectionType = (string)reader["GlassesCollection.Name"];

                        list.Add(gln);
                    }


                reader.Close();
                conn.Close();
            }

        }
我得到一个例外:

Exception Details: System.IndexOutOfRangeException: CollectionType.Name
索引超出范围,但在数据库中有多条记录。
我怎样才能解决我的问题呢?

我也纠正了你的打字错误。(GetCollection)

代码隐藏:

protected void Button1_Click(object sender, EventArgs e)
    {
        List<GlassesCollection> list = new List<GlassesCollection>();
        using (SqlConnection conn = new SqlConnection("Server=(local);DataBase=ISeeOptic;Integrated Security=SSPI"))
        {

            GlassesCollection gln = new GlassesCollection();
            SqlCommand cmd = new SqlCommand();
            SqlDataReader reader;

            cmd.Connection = conn;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "GetCollection";

            conn.Open();
            reader = cmd.ExecuteReader();
              while (reader.Read())
                {
                    gln.Name = (string)reader["GlassesCollection_Name"];
                    gln.CollectionType = (string)reader["CollectionType_Name"];

                    list.Add(gln);
                }


            reader.Close();
            conn.Close();
        }

    }
受保护的无效按钮1\u单击(对象发送者,事件参数e)
{
列表=新列表();
使用(SqlConnection conn=newsqlconnection(“服务器=(本地);数据库=iSeopic;集成安全=SSPI”))
{
GlasseCollection gln=新的GlasseCollection();
SqlCommand cmd=新的SqlCommand();
SqlDataReader;
cmd.Connection=conn;
cmd.CommandType=CommandType.storedProcess;
cmd.CommandText=“GetCollection”;
conn.Open();
reader=cmd.ExecuteReader();
while(reader.Read())
{
gln.Name=(字符串)读取器[“GlasseCollection_Name”];
gln.CollectionType=(字符串)读取器[“CollectionType_Name”];
列表。添加(gln);
}
reader.Close();
康涅狄格州关闭();
}
}

最好使用列别名,并通过这些别名引用列

CREATE PROCEDURE [dbo].[GetColletcion]
AS
BEGIN   
         select  CollectionType.Name As TypeName ,GlassesCollection.Name As GlassesName
    from    GlassesCollection
    inner join CollectionType
    on GlassesCollection.CollectionType=CollectionType.CollTypeID
END
然后使用

(string)reader["TypeName"];
(string)reader["GlassesName"];
如果无法更改存储过程,则可以使用原始位置:

(string)reader[0]; //CollectionType.Name
(string)reader[1]; //GlassesCollection.Name

我已经对我的存储过程进行了更改,并且它工作正常。但是我不明白我的代码有什么问题?为什么它不工作?对于原始代码,您返回了两个同名的列。当SQL将结果返回给客户机时,它只返回列的名称,而不返回表和列的名称。如果要循环遍历所有字段名,您会注意到“Name”的两个实例。如果您访问了reader[“Name”],它将只返回第一个匹配列的数据。
(string)reader["TypeName"];
(string)reader["GlassesName"];
(string)reader[0]; //CollectionType.Name
(string)reader[1]; //GlassesCollection.Name