我有一个带有选项卡式界面的C#/ WPF应用程序,其行为一直很奇怪。在最初想到我的问题与TabControl有关之后,我现在相信它是不同的东西,我完全陷入困境。以下方法只是从数据库中提取一些数据并加载一些WPF ComboBox。奇怪的是代码到达某一点,特别是加载cboState的Item集合的循环结束,然后继续。没有放在该循环下面的代码,没有抛出比我能找到或看到的错误,并且没有达到该循环下面的断点。我完全感到困惑。
private void loadNewProjectTab() {
dpDate.SelectedDate = DateTime.Now;
cboProjectType.Items.Add("Proposal");
cboProjectType.Items.Add("Pilot");
cboProjectType.SelectedIndex = -1;
string sql = "SELECT State FROM States ORDER BY ID";
OleDbCommand cmd = new OleDbCommand(sql, connection);
if(connection.State == ConnectionState.Closed) {
connection.Open();
}
OleDbDataReader reader = cmd.ExecuteReader();
while(reader.HasRows) {
reader.Read();
cboState.Items.Add(reader["State"].ToString().Trim());
} // <-- Nothing below here executes.
connection.Close();
}
答案 0 :(得分:3)
while(reader.HasRows) {
reader.Read();
cboState.Items.Add(reader["State"].ToString().Trim());
}
即使您已阅读所有行并使用reader.HasRows
移过最后一行, reader.Read()
也会返回true;此时,您将在reader["State"]
上获得例外。
由于reader.Read()
返回一个布尔值来指示是否存在当前行,因此您应该完全跳过调用reader.HasRows
:
while(reader.Read()) {
cboState.Items.Add(reader["State"].ToString().Trim());
}
答案 1 :(得分:2)
嗯,我认为你的循环应该是错误的。
if (reader.HasRows)
{
while(reader.Read())
{
cboState.Items.Add(reader["State"].ToString().Trim());
}
}
请注意,bucle使用while(reader.Read())
答案 2 :(得分:2)
这是你的问题:
while(reader.HasRows) {
reader.Read();
cboState.Items.Add(reader["State"].ToString().Trim());
}
HasRows
表示读者是否检索了任何内容;当你通读它时它不会改变(换句话说,它不像你正在使用的那样类似于文件结束指示符)。相反,你应该这样做:
while(reader.Read()) {
cboState.Items.Add(reader["State"].ToString().Trim());
}
答案 3 :(得分:2)
Reader
应该关闭。
using(var reader = cmd.ExecuteReader())
{
if(reader.HasRows)
{
while(reader.Read())
{
cboState.Items.Add(reader["State"].ToString().Trim());
}
}
}