2012-01-04 5 views
1

Я пытаюсь заполнить свой список на стороне 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 

Индекс за пределами диапазона, хотя в базе данных более одной записи. Как я могу решить свою проблему?

ответ

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 
+0

У меня есть сделать chenges на моей хранимой процедуры, и это будет работать должным образом .Но я не могу понять, в чем проблема с моим кодом, почему он работает доцент? – Michael

+1

С вашим исходным кодом вы возвращали два столбца с тем же именем. Когда SQL возвращает результат обратно клиенту, он возвращает только имя столбца, а не таблицу и столбец. Если вы должны были пропустить все имена полей, вы заметили бы два экземпляра «Имя». Если бы вы получили доступ к читателю [«Имя»], он вернул бы только данные первого совпадающего столбца. –

+0

Тогда ты, Ник! – Michael

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

    } 
Смежные вопросы