无法从 SqlDataReader 获取所有结果

本文关键字:结果 获取 SqlDataReader | 更新日期: 2023-09-27 18:33:20

有人可以帮助我解决我看到的问题吗?出于某种原因,当我运行我的页面时,我会获取我的下拉列表来填充数据,但是我的数据库中的第一项,每个 SQL 查询,都不会填充。

例如,我的数据库表是:

类别

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

无法从 SqlDataReader 获取所有结果

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

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)如果您说在执行某种"添加类别"操作后没有出现第一项,那么可能是在插入完成之前填充了下拉列表。这意味着,在允许将插入提交到数据库后,您需要重新查询。

2) 在此行上放置一个断点:

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

然后确认连接字符串指向正确的数据库。我见过指向测试或临时数据库的旧配置文件会导致这种混乱。

祝你好运。如果这些不是答案,可以向我们简化您的示例,或者详细说明您对应用程序执行的操作以及何时发现问题。

每个块中的 "reader.read()" 语句实际上是在读取第一行数据,因此当您设置 DataSource 时,第一行已经被读取。尝试将其取出

您应该使用"而(读者。Read())"如果要遍历每个结果,请不要在一个步骤中绑定 resulset。

话虽如此,关于使用数据集、分离逻辑等的评论是有效的