2012-05-05 4 views
0

아무도 내가보고있는 문제를 해결할 수 있습니까? 어떤 이유로 내 페이지를 실행할 때 목록을 가져 와서 데이터를 채우지 만 각 SQL 쿼리 당 데이터베이스의 첫 번째 항목은 채워지지 않습니다.SqlDataReader의 모든 결과를 가져 오지 못했습니다.

예를 들어, 내 데이터베이스 테이블은 다음과 같습니다

카테고리 내 첫 번째 쿼리

1 Books 
2 Clothing 
3 Toys 
4 Household Items 

-

SELECT Category FROM ProductCategories 

드롭 다운 목록의 나이

Clothing 
Toys 
Household Items 
로 채워됩니다

나는 2 개의 다른 드롭 다운 목록을 가지고 있는데, 나는 이들을 채우고있다. 일단이 정보를 알아 내면 데이터를 데이터베이스에 삽입 할 때 생기는 다른 문제를 파악하려고 노력할 것입니다.

감사합니다.

public partial class InsertItems : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     SqlConnection connection; 
     SqlCommand populateList; 
     SqlDataReader reader; 

     string connectionString = ConfigurationManager.ConnectionStrings["LakerBids"].ConnectionString; 
     connection = new SqlConnection(connectionString); 

     populateList = new SqlCommand("USE LakerBids SELECT Category FROM ProductCategories;" + 
           "USE LakerBids SELECT SubCategory FROM ProductSubCategories;" + 
           "USE LakerBids SELECT LName FROM Users", connection); 
     if (!IsPostBack) 
     { 
      try 
      { 
       connection.Open(); 
       reader = populateList.ExecuteReader(); 

       while (reader.Read()) 
       { 
        pcategory.DataSource = reader; 
        pcategory.DataValueField = "Category"; 
        pcategory.DataBind(); 
       } 

       reader.NextResult(); 

       while (reader.Read()) 
       { 
        psubcategory.DataSource = reader; 
        psubcategory.DataValueField = "SubCategory"; 
        psubcategory.DataBind(); 
       } 

       reader.NextResult(); 

       while (reader.Read()) 
       { 
        user.DataSource = reader; 
        user.DataValueField = "LName"; 
        user.DataBind(); 
       } 

       reader.Close(); 
      } 
      finally 
      { 
       connection.Close(); 
      } 
     } 
    } 

    protected void AddItem(object sender, EventArgs e) 
    { 
     if (Page.IsValid) 
     { 
      SqlConnection connection; 
      SqlCommand insertData; 

      string connectionString = ConfigurationManager.ConnectionStrings["LakerBids"].ConnectionString; 
      connection = new SqlConnection(connectionString); 
      insertData = new SqlCommand("INSERT INTO Products (ProductName, ProductDesc, CategoryID, SubCatID, StatusID, UserID, ReservePrice, AuctionLength, BidID)" + 
      "VALUES (@ProductName, @ProductDesc, @CategoryID, @SubCatID, 1, @UserID, @ReservePrice, @AuctionLength, NULL)", connection); 

      insertData.Parameters.Add("@ProductName", System.Data.SqlDbType.NVarChar, 50); 
      insertData.Parameters["@ProductName"].Value = pname.Text; 

      insertData.Parameters.Add("@ProductDesc", System.Data.SqlDbType.NVarChar, 200); 
      insertData.Parameters["@ProductDesc"].Value = pdesc.Text; 

      insertData.Parameters.Add("@CategoryID", System.Data.SqlDbType.Int); 
      insertData.Parameters["@CategoryID"].Value = pcategory.SelectedIndex; 

      insertData.Parameters.Add("@SubCatID", System.Data.SqlDbType.Int); 
      insertData.Parameters["@SubCatID"].Value = psubcategory.SelectedIndex; 

      insertData.Parameters.Add("@UserID", System.Data.SqlDbType.Int); 
      insertData.Parameters["@UserID"].Value = user.SelectedIndex + 2; 

      insertData.Parameters.Add("@ReservePrice", System.Data.SqlDbType.Money); 
      insertData.Parameters["@ReservePrice"].Value = Convert.ToDecimal(reserveprice.Text); 

      insertData.Parameters.Add("@AuctionLength", System.Data.SqlDbType.Int); 
      insertData.Parameters["@AuctionLength"].Value = Convert.ToInt32(auctionlength.Text); 

      try 
      { 
       connection.Open(); 
       insertData.ExecuteNonQuery(); 
       Response.Redirect("Categories.aspx"); 
      } 
      catch (Exception error) 
      { 
       dberror.Text = error.ToString(); 
      } 
      finally 
      { 
       connection.Close(); 
      } 
     } 
    } 
} 
+0

쿼리 당 하나의 행이 필요합니까 ?? –

+2

나는 당신에게 제안을 줄 수있다. 논리를 여러 계층으로 분리하는 것이 좋습니다. 적어도 두 명. 첫 번째는 데이터베이스에 질의를하고 그 결과를 메모리 객체로 변환 한 다음 UI를 채우는 것이다. 코드 레이아웃을 사용하면 버그를 추적하기가 정말 어렵습니다. 이뿐만 아니라 일반적으로. – Oybek

+0

왜 그 3 개의 선택을 결합하고 있습니까? 그것들을 분리 할 수있게해라. 카테고리에 따라서 "USE LakerBids SELECT Category from ProductCategories;" " – Thousand

답변

1

데이터 집합을 사용하거나 컬렉션 내의 비즈니스 엔터티를 채워서 컬렉션에 바인딩해야합니다.

List<Category> cats = new List<Category>(); 

while (reader.Read()) 
{ 
    Category cat = new Category(); 

    // fill properties from DataReader 
    cats.Add(cat); 
} 

pcategory.DataSource = cats; 
pcategory.DataValueField = "Category"; 
pcategory.DataBind(); 
0

Sab0tr0n, 나는 두 가지 중 하나가 발생하고 있다고 생각합니다.

1) "Add Category (범주 추가)"작업을 수행 한 후 첫 번째 항목이 나타나지 않는다고 말하면 삽입이 완료되기 전에 드롭 다운이 채워진 것일 수 있습니다. 즉, 삽입을 데이터베이스에 커밋 한 후에 다시 쿼리해야합니다.

또는

2

)이 줄에 중단 점을 넣어 :

string connectionString = ConfigurationManager.ConnectionStrings["LakerBids"].ConnectionString; 

을 그런 다음 ConnectionString을 확인 올바른 데이터베이스입니다. 테스트 또는 준비 데이터베이스를 가리키는 오래된 구성 파일이 이런 종류의 혼란을 일으키는 것을 보았습니다.

행운을 빈다. 이것들이 답이 아니라면, 우리에게 예제를 단순화 시키거나 애플리케이션으로 무엇을하는지 정확하게 그리고 문제를 보았을 때 정교하게 작성하십시오.

0

각 블록의 "reader.read()"문은 실제로 데이터의 첫 번째 행을 읽으므로 DataSource를 설정하면 첫 번째 행이 이미 읽혀집니다. 그것을 꺼내보십시오.

각 결과에 대해 반복 수행하고 resulset을 한 번에 바인딩하지 않으려면 "while (reader.Read())"를 사용해야합니다.

데이터 집합, 분리 논리 등의 사용에 대한 의견은 유효합니다.

관련 문제