2012-02-15 22 views
1

私はこのコードを持っていて、最初の文字列[0]を返すだけで、残りの部分はインデックスが配列から外れているという意味です。つまり、1行だけが引かれています。なぜExecuteReaderは1行分のデータしか返しませんか?

MySqlConnection connection = new MySqlConnection(MyConString); 
MySqlCommand command = new MySqlCommand("SELECT email_address FROM account_info", connection); 
MySqlDataReader reader; 

try 
{ 

    connection.Open(); 
    reader = command.ExecuteReader(); 
    if (reader.HasRows) 
    { 
     while (reader.Read()) 
     { 
      textBox1.Text = reader[0].ToString(); 

      textBox2.Text = reader[0].ToString(); 

      textBox3.Text = reader[0].ToString(); 
     } 


     reader.Close(); 
    } 

答えて

2

reader.Read()を1回だけ呼び出すため、1行しか取得できません。 Read()に電話するたびに、リーダーは次の行に進み、真を返します。リーダが最後の行を超えて進むと、falseを返します。

インデクサーは、追加のからデータを返します。クエリには1つの列しかありません。インデックス1と2が失敗している理由です。

EDIT:

あなたがリーダーをループしようとしている場合、あなたは彼らが同様にループスルーすることができた構造で、あなたの3つのテキストボックスを配置する必要があります。単純な、あまり柔軟ではなく正しい:より柔軟

if (reader.HasRows) 
{ 
    reader.Read() 
    textBox1.Text = reader[0].ToString(); 
    reader.Read() 
    textBox2.Text = reader[0].ToString(); 
    reader.Read() 
    textBox3.Text = reader[0].ToString(); 
    reader.Close(); 
} 

List<TextBox> boxes = new List<TextBox> { textBox1, textBox2, textBox3 }; 
for (int index = 0; index < boxes.Count; index++) 
{ 
    if (!reader.Read()) 
    { 
     break; // in case there are fewer rows than text boxes 
    } 
    boxes[index] = reader[0].ToString(); 
}  
+0

だから私は、各テキストボックスの間にそれを呼び出しますか? –

+0

@DevinPrejeanこれはその方法の1つです。通常、 'Read()'はループ内で呼び出されます。 (そして、それはブール値を返すので、すべての行が読み込まれた時を知ることに注意してください)。この場合、一定数のコントロールを書き込むので、 'Read()'を繰り返し呼び出すか、ループを使用できるコレクション。 – phoog

+0

実行中のreader.read 3つの異なる時間が動作しませんでした... –

5

reader[0]は、リーダではなく、最初の行から最初のフィールドにアクセスします。サンプルコードはMSDNからチェックしてください。

// Call Read before accessing data. 
while (reader.Read()) 
{ 
    Console.WriteLine(String.Format("{0}, {1}", 
      reader[0], reader[1])); 
} 

これは、各行の1番目と2番目の列を書き出します。

はまた、私はあなたがusingステートメントを使用していない理由は本当にわからないんだけど、なぜあなたはfinallyブロック内ExecuteReader呼んでいる - の両方が奇妙に見えるもの。ここで

+0

私はWindowsフォームを使用していますが、console.writelineの代わりにどのように見えるでしょうか? –

+0

未知数の電子メールアドレスを表示しようとしていますか、最初の3つだけを表示しようとしていますか?最初の3つの場合は、whileループをforループに置き換えてください。未知数の場合は、それを行うために何らかの種類のデータグリッド、おそらく 'DataGridView'が必要です。 – dsolimano

+0

私は最初の3が必要です。私はforループを試していますし、aparently私はそれが必要な構文を理解していない –

0

は何が必要で、文字列のEmailAddress部品を交換、私は何をすべきかの基本です:

 using (SqlConnection SQL_Conn01 = new SqlConnection(SQLSync)) 
     { 
      bool IsConnected = false; 
      try 
      { 
       SQL_Conn01.Open(); 
       IsConnected = true; 
      } 
      catch 
      { 
       // unable to connect 
      } 
      if (IsConnected) 
      { 

       SqlCommand GetSQL = new SqlCommand("SELECT email_address FROM account_info", SQL_Conn01); 

       using (SqlDataReader Reader = GetSQL.ExecuteReader()) 
       { 
        while (Reader.Read()) 
        { 
         string EmailAddress = Reader.GetString(0).TrimEnd(); 
        } 
       } 
       GetSQL.Dispose(); 
      } 
     } 
関連する問題