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

C#代码未执行

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