C#代码未执行
本文关键字:执行 代码 | 更新日期: 2023-09-27 18:25:16
我有一个C#/WPF应用程序,它有一个选项卡式接口,它的行为很奇怪。在最初认为我的问题与TabControl有关后,我现在相信它有所不同,我完全陷入了困境。下面的方法只是从数据库中提取一些数据并加载几个WPF组合框。奇怪的是,代码到达了某个点,特别是加载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();
}
while(reader.HasRows) {
reader.Read();
cboState.Items.Add(reader["State"].ToString().Trim());
}
即使在读取了所有行并使用reader.Read()
移动到最后一行之后,reader.HasRows
也将返回true;此时,您将在reader["State"]
上获得一个异常。
由于reader.Read()
返回一个布尔值来指示是否存在当前行,因此应该完全跳过调用reader.HasRows
:
while(reader.Read()) {
cboState.Items.Add(reader["State"].ToString().Trim());
}
嗯,我认为你的循环应该是错误的。
if (reader.HasRows)
{
while(reader.Read())
{
cboState.Items.Add(reader["State"].ToString().Trim());
}
}
请注意,bucle带有while(reader.Read())
这是您的问题:
while(reader.HasRows) {
reader.Read();
cboState.Items.Add(reader["State"].ToString().Trim());
}
CCD_ 7指示读取器是否检索到任何东西;当您阅读它时,它不会发生变化(换句话说,它不像您使用它那样类似于文件结尾指示符)。相反,你应该这样做:
while(reader.Read()) {
cboState.Items.Add(reader["State"].ToString().Trim());
}
Reader
应关闭。
using(var reader = cmd.ExecuteReader())
{
if(reader.HasRows)
{
while(reader.Read())
{
cboState.Items.Add(reader["State"].ToString().Trim());
}
}
}