没有从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();
}
}
}
}
答
您需要可以使用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())”。
这就是说,关于使用数据集,分离逻辑等的意见是有效的
您是否期待每个查询一行? –
我可以给你一个建议。你最好把你的逻辑分成几个层次。至少两个。首先是对数据库进行查询并将结果转换为内存对象然后填充UI的dal。使用您的代码布局,追踪错误非常困难。不仅这一个,而且一般。 – Oybek
你为什么要结合这3个选择?尝试将它们分开,它更易于管理。 因此对于您的类别,只需使用“USE LakerBids SELECT Category FROM ProductCategories”;“” – Thousand