2011-10-25 5 views
1

私は、次の機能があります:reader = command.ExecuteReader();がスキップされた後、次のSqlDataReader.ExecuteReader後のすべてのコードはスキップ

private void populate() 
    { 
     String connectionString = Properties.Settings.Default.Database; 

     String selectString = "select artikelnummer, omschrijving from Artikels"; 

     SqlDataReader reader = null; 

     SqlConnection connection = new SqlConnection(connectionString); 
     SqlCommand command = new SqlCommand(selectString); 

     reader = command.ExecuteReader(); 
     connection.Open(); 
     int x = 0; 
     while (reader.Read()) 
     { 
      String item = String.Empty; 
      item = Convert.ToString(reader["Artikelnummer"]) + "\t" + Convert.ToString(reader["Omschrijving"]); 
      x++; 
      listboxGeselecteerd.Items.Add(item); 
     }    
    } 

すべてを。

私が間違っていることはありますか?

更新:connection.Open();を正しい場所に移動しました。今、私がその行に到達すると、出力はStep into: Stepping over non-user code 'System.Data.SqlClient.SqlConnection.Open

と表示され、残りの機能はスキップされます。

答えて

1

私のお金は、接続が開かれていないために例外が発生したため、例外を摂取するコールスタックのメソッドのほうが高くなっています。それがあなたの最大の問題です。

次の問題は、接続がSqlCommandに関連付けられていないため、開かれていても問題ではないことです。

最後に、connection.Open();はExecuteReaderの前にある必要があります。

それに加えて、本当にusingブロックを使用する必要があります。

{ 
    String connectionString = Properties.Settings.Default.Database; 

    String selectString = "select artikelnummer, omschrijving from Artikels"; 

    SqlDataReader reader = null; 

    using (SqlConnection connection = new SqlConnection(connectionString)) 
    /* you also need to associate the connection with the command */ 
    using (SqlCommand command = new SqlCommand(selectString, connection)) 
    { 
     connection.Open(); 
     reader = command.ExecuteReader(); 
     int x = 0; 
     while (reader.Read()) 
     { 
      String item = String.Empty; 
      item = Convert.ToString(reader["Artikelnummer"]) + "\t" + Convert.ToString(reader["Omschrijving"]); 
      x++; 
      listboxGeselecteerd.Items.Add(item); 
     }    
    } 
} 

単純な「printf」スタイルのデバッグと例外の投稿はどうですか?コメント(A first chance exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll)から、例外テキストを考える

try 
{ 
    connection.Open(); 
    ... 
} 
//catch (Exception e) 
catch (SqlException e) 
{ 
    // at least one of these.. 
    Console.WriteLine(e); 
    MessageBox.Show(e); 
    Debug.WriteLine(e); 

    var inner = e.InnerException; 
    while (inner != null) 
    { 
     //display/log/view 
     inner = inner.InnerException; 
    } 
} 

は、より多くのあなたが本当のメッセージが現れた直前に、私は、SQLExceptionをキャッチしてのInnerException(複数可)を調べるでしょう取得したいメッセージのように見えます。

+0

これを試してみましたが、 'connection.Open();'の後もすべてをスキップしています。例外は呼び出されません。出力には「Step into:非ユーザコードをステップ実行する」というシステムがあります。Data.SqlClient.SqlConnection.Open'' –

+0

@SimonVerbeke:例外が_Somewhere _...である必要があります。 –

+0

実際.. 'System.Data.SqlClient.SqlException '型の最初の例外はSystem.Data.dll'で発生しました。何が間違っていたのかをどうやって把握するのですか? –

1

例外をスローしていないのに驚いていますが、リーダーを実行する前に接続を開く必要があります。

0

使用する前に接続を開く必要があります。あなたのcommand.ExecuteReader()呼び出しの上にconnection.Open()を移動します。

0

ExecuteReaderを呼び出す前に接続を開く必要があります。

また、SqlCommandに接続を割り当てないでください。あなたはこのようにそれを実行する必要があります。

using(qlConnection connection = new SqlConnection(connectionString)) 
{ 
    using(SqlCommand command = new SqlCommand(selectString,connection)) 
    { 
    connection.Open(); 
    reader = command.ExecuteReader(); 

    // rest of your code. 
    } 
} 
+0

SqlConnectionとSqlCommandは使い捨てです。いくつかの人々は、それらを使用してダウンボットに値する間違いをブロックすることを考慮していない。 –

+0

@AustinSalonen私は同意します。私はちょうど間違いを指摘していた。私は彼が 'SqlCommand'に' connection 'を割り当てていないことを実際に検出したのは私が最初だと思います。私は接続とコマンドの周りのステートメントを使用するように私の答えを編集しました。 – Icarus

0

私はあなたがリーダーを実行する前に、あなたの接続をオープンする必要があると推測し、例外がスローされているので、それはスキップされますことをすることができます。

0
private void populate(){ 
    String connectionString = Properties.Settings.Default.Database; 
    String commandString = "SELECT artikelnummer, omschrijving FROM Artikels"; 
    using (SqlConnection cn = new SqlConnection(connectionString)){ 
     using (SqlCommand cm = new SqlCommand(commandString, cn)){ 
      cn.Open(); 
      SqlDataReader dr = cm.ExecuteReader(); 
      int x = 0; 
      while (dr.Read()){ 
       String item = String.Empty; 
       item = Convert.ToString(dr["Artikelnummer"]) + "\t" + Convert.ToString(dr["Omschrijving"]); 
       x++; 
       listboxGeselecteerd.Items.Add(item); 
      } 
     } 
    } 
} 

「int x」では何をしていますか?私はあなたがそれを増やしているのを見ますが、何もしません。

+1

http://davidhayden.com/blog/dave/archive/2005/01/13/773.aspxは、 'using'ステートメントを理解するための興味深い読み物です。理由を理解したい場合。 – JClaspill

+0

'int x'は私が配列を使ったものの剰余でした。それを忘れてしまったのでしょうか? –

関連する問題