Код C # не выполняется - PullRequest
       1

Код C # не выполняется

1 голос
/ 22 февраля 2012

У меня есть приложение C # / WPF с интерфейсом с вкладками, которое ведет себя странно. Первоначально подумав, что мои проблемы были связаны с TabControl, я теперь считаю, что это что-то другое, и я полностью застрял. Следующий метод просто должен извлечь некоторые данные из базы данных и загрузить пару WPF ComboBox. Странно то, что код достигает определенной точки, а именно конца цикла, который загружает коллекцию Item cboState и затем продолжает работу. Никакой код, помещенный ниже этого цикла, не выполняется, никаких ошибок не возникает, чем я могу найти или увидеть, и никакие точки останова, помещенные ниже этого цикла, никогда не достигаются. Я полностью сбит с толку.

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 ]

3 голосов
/ 22 февраля 2012
while(reader.HasRows) { 
    reader.Read(); 
    cboState.Items.Add(reader["State"].ToString().Trim()); 
}

reader.HasRows вернет true даже после того, как вы прочитали все строки и перешли за последнюю с помощью reader.Read(); в этот момент вы получите исключение на reader["State"].

Поскольку reader.Read() возвращает логическое значение, указывающее, существует ли текущая строка, следует полностью пропустить вызов reader.HasRows:

while(reader.Read()) { 
    cboState.Items.Add(reader["State"].ToString().Trim()); 
}     
2 голосов
/ 22 февраля 2012

Reader должен быть закрыт.

using(var reader = cmd.ExecuteReader())
{
    if(reader.HasRows)
    {
        while(reader.Read()) 
        {
            cboState.Items.Add(reader["State"].ToString().Trim());
        } 
    }
}
2 голосов
/ 22 февраля 2012

Это ваша проблема:

while(reader.HasRows) {
    reader.Read();
    cboState.Items.Add(reader["State"].ToString().Trim());
} 

HasRows указывает, извлекал ли читатель что-либо; он не меняется, когда вы читаете его (другими словами, он не аналогичен индикатору конца файла, как вы его используете). Вместо этого вы должны сделать это:

while(reader.Read()) {
    cboState.Items.Add(reader["State"].ToString().Trim());
} 
2 голосов
/ 22 февраля 2012

Хм, я думаю, что ваш цикл неправильный, он должен быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...