2012-01-04 9 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 

는 코드 숨김입니다 : 내가 얻을

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

:

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 

데이터베이스가 두 개 이상의 레코드에 있지만 범위를 벗어나는 인덱스입니다. 문제를 어떻게 해결할 수 있습니까?

답변

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 

당신이 당신의 저장 프로 시저를 변경할 수 없다면 그런 다음 당신은 oridinal 위치 사용할 수

(string)reader["TypeName"]; 
(string)reader["GlassesName"]; 

를 사용

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

내 저장 프로 시저에 chenges을해야하고 제대로 일이다 하지만 내 코드의 문제점을 이해할 수 없다. 왜 그렇게 작동 하는가? – Michael

+1

원본 코드에서 동일한 이름의 두 열을 반환했습니다. SQL이 결과를 클라이언트에 반환하면 테이블과 열이 아닌 열의 이름 만 반환합니다. 모든 필드 이름을 반복한다면 "이름"의 두 인스턴스를 알 수 있습니다. 리더 [ "Name"]에 액세스하려면 첫 번째로 일치하는 열의 데이터 만 반환해야합니다. –

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

    } 
관련 문제