2012-02-21 6 views
1

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

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

Я считаю, что это происходит потому, что исключение было брошено, включите исключения в 'меню Visual Studio -> Debug -> Исключения -> CLR exceptions' – sll

+0

является' loadNewProject' вызова каких-либо заявлений попробовать/поймать? –

+0

Неспособность ударить точки останова на определенных линиях, которые, по вашему мнению, должны попадать, часто означает, что ваша база кода не синхронизирована с тем, что выполняется (то есть exe устарел из-за ошибок сборки). – dasblinkenlight

ответ

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

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

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

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

Это именно то, что происходило и как именно я исправил его. (код не выполняется, не знал, почему) был вызван тем исключением, которое было выбрано, но VS2010 не уведомляет меня, не меняя настройки. – ntnunk

2

Um Я думаю, что это неправильно, ваша петля должна быть.

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

Обратите внимание, что bucle находится с while(reader.Read())

+0

The HasRows не требуется. – usr

+0

Я согласен. Я просто позволяю ему избегать путаницы с OP –

2

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

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

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

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

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

using(var reader = cmd.ExecuteReader()) 
{ 
    if(reader.HasRows) 
    { 
     while(reader.Read()) 
     { 
      cboState.Items.Add(reader["State"].ToString().Trim()); 
     } 
    } 
} 
+1

'if (reader. HasRows()) 'is wrong is' if (reader.HasRows) ' –

+0

+1, неплохо иметь компилятор :) – mynkow

Смежные вопросы