Exception范围之外的索引

时间:2012-01-04 13:56:04

标签: exception exception-handling sqldatareader

我试图在存储过程的帮助下在Visual Studio端填充我的列表。

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

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();
            }

        }

但是当谈到这一行时:

gln.Name = (string)reader["CollectionType.Name"];

我得到了这个例外:

Exception Details: System.IndexOutOfRangeException: CollectionType.Name

该范围之外的索引,虽然在数据库中有多个记录。 我怎样才能解决我的问题?

2 个答案:

答案 0 :(得分:1)

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

CREATE PROCEDURE [dbo].[GetCollection]
AS
BEGIN   
         select  CollectionType.Name AS CollectionType_Name, GlassesCollection.Name AS 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 = "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 :(得分:1)

最好使用列别名并改为引用这些列。

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"];

如果您无法更改存储过程,则可以使用oridinal位置:

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