没有从SqlDataReader获得所有结果

问题描述:

任何人都可以帮我解决我看到的问题吗?出于某种原因,当我运行我的页面时,我得到我的下拉列表来填充数据,但是我的数据库中的每个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的dal。使用您的代码布局,追踪错误非常困难。不仅这一个,而且一般。 – Oybek

+0

你为什么要结合这3个选择?尝试将它们分开,它更易于管理。 因此对于您的类别,只需使用“USE LakerBids SELECT Category FROM ProductCategories”;“” – Thousand

您需要可以使用DataSet或集合中填充的业务实体,然后绑定到集合。

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

Sab0tr0n,我怀疑是发生了两件事情之一。

1)如果您说在您做某种“添加类别”操作后没有出现第一项,则可能是在插入完成之前填充下拉菜单。这意味着,在将插入提交到数据库之后,您需要重新查询。

OR

2)将在此行断点:

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

然后确认的connectionString是正确的数据库。我已经看到指向测试或登台数据库的旧配置文件会引起这种混淆。

祝你好运。如果这些都不是答案,那么也许简化你的例子给我们,或者详细说明你对你的应用程序做了什么,当你看到问题时。

每个块中的“reader.read()”语句实际上是读取第一行数据,所以当您设置数据源时,第一行已经被读取。试试把它取出

如果你想迭代每个结果,而不是在一个步骤中绑定resulset,你应该使用“while(reader.Read())”。

这就是说,关于使用数据集,分离逻辑等的意见是有效的