2012-02-21 27 views
1

私は、奇妙な動作をしているタブ付きインターフェイスを備えたC#/ WPFアプリケーションを用意しています。最初は私の問題はTabControlに関連していたと思った後、私は今それが何か違うと信じて、私は完全に立ち往生しています。以下のメソッドは、データベースからいくつかのデータを取り出し、いくつかのWPFコンボボックスをロードすることになっています。奇妙なことは、コードが特定のポイント、具体的にはcboStateのItemコレクションをロードするループの最後に到達し、続いていることです。そのループの下に配置されたコードは実行されません。見つけたり見たりすることはできません。ループの下にブレークポイントが到達することはありません。私は完全に困惑している。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のメニューの例外を有効に、スローされたためであると考えている - >デバッグ - >例外 - > CLR exceptions' – sll

+0

がloadNewProject'はどんなのtry/catchステートメントを呼び出す'のですか? –

+0

ヒットすると思われる特定の行のブレークポイントをヒットできない場合は、コードベースが実行されるコードと同期していない(つまり、ビルドエラーのためにexeが古くなっている)ことを意味します。 – dasblinkenlight

答えて

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

reader.HasRowsはtrueを返します。その時点で、reader["State"]の例外が発生します。

reader.Read()は、現在の行がありますかどうかを示すブール値を返しますので、あなたは完全にreader.HasRowsを呼び出すスキップする必要があります。

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

これは正確に何が起こっているか正確にどのように修正したかです。 (コードが実行されていない、理由を知らない)例外がスローされたために発生しましたが、VS2010は設定を変更せずに私に通知しません。 – ntnunk

2

私は間違ったループだと思います。 bucleがwhile(reader.Read())

+0

HasRowsは必要ありません – usr

+0

私は同意しますOPの混乱を避けるためにしました –

2

とこれはあなたの問題であることを

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

注:

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

HasRowsは、読者が何を取得したか否かを示しています。それを読んでも変わりません(言い換えれば、ファイルの終わりのインジケーターと似ていません)。代わりに、あなたはこれを行う必要があります:あなたはすべての行を読み、reader.Read()との最後の1を超えて移動した後でさえも

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()) 'が間違っている場合' if(reader.HasRows) ' –

+0

+1、それはコンパイラを持っているといいです:) – mynkow

関連する問題