2016-07-30 15 views
0

sqlreaderに問題があります。列内のすべてのレコードを表示する必要がある場合にのみ、最初の結果が表示されます。 私はこのサイトを徹底的に検索しましたが、すべての回答が私にとってうまくいかないようです。sqlReaderで複数の結果を取得

str2 = "SELECT CPU FROM Clients"; 
      connection = new SqlConnection(str); 
      connection.Open(); 
      command = new SqlCommand(str2, connection); 
      reader = command.ExecuteReader(); 
      try 
      { 
       while (reader.Read()) 
       { 
        num = 0; 
        string col1Value = reader[0].ToString(); 
        if (reader.HasRows) 
        { 
         enumerator = reader.GetEnumerator(); 
         record = (DbDataRecord)enumerator.Current; 
         if (j.Connect(out j)) 
         { 
          //string col1Value = reader[0].ToString();//str3 = reader["CPU"].ToString(); 
          num += 1; 
          MessageBox.Show(col1Value); 
          if (col1Value == j.GetCPUKey()) 
          { 
           this.j.XNotify("Connected! Welcome: " + j.GetCPUKey()); 
           MessageBox.Show(col1Value); 
           connection.Close(); 
           CheckAuth(); 
           break; 
          } 
          else 
          { 
           MessageBox.Show("You Are Not Authorised!"); 
           connection.Close(); 
          } 
          if (!j.Connect(out j)) 
          { 
           MessageBox.Show("Could Not Connect to Default Console"); 
           connection.Close(); 
          } 
         } 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("" + ex); 
       Environment.Exit(0); 
       connection.Close(); 
      } 

が助けてください: はここに私のコードです。

+0

ループ内で接続を閉じるのはなぜですか?接続を閉じる...それは接続を閉じます=それ以上のデータは閉じません。また、リレーショナルデータベースは、列にレコードを表示するのではなく、レコードに列を表示することによって機能します。 'j'とは何ですか?またwhileループの中で 'reader.HasRows'がなぜwhileループにあるかのように、これは常に最初のレコードを指しているので、これは常に真です? – Igor

+0

接続が閉じていなくても、まだ1つの行が表示されます。 jは私が使用している図書館のものですが、読者とは関係ありません。 – Liam

+0

SqlReader.Readのドキュメントを参照し、利用可能な次のレコードにリーダーを進め、trueを返します。レコードがない場合はfalseを返します。それはループ内でリーダーが進化したことを意味します – Igor

答えて

0

これがすべて必要な場合(「CPU」が許可されているかどうかを確認する)、本当に必要のないコードがたくさんある場合は、
ちょうどCPUを見つけることができないデータベースが要求された場合は、何のレコードを持っていないため、クエリによって返されたレコードをループする必要はありませんあなたはこのアプローチでは

try 
{ 
    if (j.Connect(out j)) 
    {  
     string cpuToSearchFor = j.GetCPUKey(); 
     str2 = "SELECT CPU FROM Clients WHERE CPU = @cpu"; 
     using(connection = new SqlConnection(str)) 
     using(SqlCommand command = new SqlCommand(str2, connection); 
     { 
      connection.Open(); 
      command.Parameters.Add("@cpu", SqlDbType.NVarChar).Value = cpuToSearchFor; 
      using(reader = command.ExecuteReader()) 
      { 
       if(reader.HasRows) 
       { 
        MessageBox.Show("Authenticated"); 
        j.XNotify("Connected! Welcome: " + cpuToSearchFor); 
        CheckAuth(); 
       } 
       else 
        MessageBox.Show("Unauthorized"); 
      } 
     } 
    } 
} 
catch(Exception ex) 
{ 
    MessageBox.Show("" + ex); 
    Environment.Exit(0); 
} 

をしたいCPU値を検索するためのデータベースを頼みます。したがって、読者がレコードを持っているかどうかを確認するだけです。

また、usingステートメントでは、接続の終了を管理するすべての行を削除できます。接続は、使用ブロックからの出口で自動的に閉じられます。

+0

完璧に働く! – Liam

+0

あなたがサイトの新しいユーザーであることを助けてくれることを嬉しく思います。私は[どのように回答を受け入れていますか?](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer -作業) – Steve

関連する問題