C#代码未执行

时间:2012-02-21 20:20:14

标签: c# wpf

我有一个带有选项卡式界面的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();
}

4 个答案:

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