1

を使用しSqlDataReaderてクエリを実行し、結果をメッセージボックスに表示しようとしていますが、エラーが発生し続けます

データが存在しない場合の読み取りの試みは無効です。

これが私のコードです。

 public void button1_Click(object sender, EventArgs e)
 {
    string results = "";
    using (SqlConnection cs = new SqlConnection(@"Server=100-nurex-x-001.acds.net;Database=Report;User Id=reports;Password=mypassword"))
    {
         cs.Open();
         string query = "select stationipaddress from station where stationname = @name";
         using (SqlCommand cmd = new SqlCommand(query, cs))
         {
              // Add the parameter and set its value -- 
              cmd.Parameters.AddWithValue("@name", textBox1.Text);
              using (SqlDataReader dr = cmd.ExecuteReader())
              {
                   while (dr.Read())
                   {
                        label3.Text = dr.GetSqlValue(0).ToString();
                        results = dr.GetValue(0).ToString();
                        //MessageBox.Show(dr.GetValue(0).ToString());
                        //MessageBox.Show(results);
                    }
                    MessageBox.Show(results);
              }
         }
    } 
}
4

2 に答える 2

6

そのとおりです。
whileループを終了すると、DataReaderはロードされたデータの最後に到達したため、存在しない現在のレコードの値を取得するために使用することはできません。

Readメソッドは、SqlDataReader(dr)を次のレコードに進め、さらに行がある場合はtrueを返し、それ以外の場合はfalseを返します。

レコードが1つしかない場合はresults、このように変数を使用できます

MessageBox.Show(results);

これで、SQLステートメントにTOP 1があるため、これは機能しますが、複数のレコードがある場合は、最後のレコードの値のみが表示されます。

また、コメントのmarc_sに示されているように、テーブルが空の場合、コードはwhileループ内に含まれないため、次のようなメッセージで結果変数を初期化できます。

 results = "No data found";

編集:以下のコメントを見て、この方法でコードを変更する必要があります

.....
// Use parameters **ALWAYS** -- **NEVER** cancatenate/substitute strings 
string query = "select stationipaddress from station where stationname = @name";
using (SqlCommand cmd = new SqlCommand(query, cs))
{
    // Add the parameter and set its value -- 
    cmd.Parameters.AddWithValue("@name", textBox1.Text);
    using (SqlDataReader dr = cmd.ExecuteReader())
    {

        while (dr.Read())
        {
            label3.Text = dr.GetSqlValue(0).ToString();
            results = dr.GetValue(0).ToString();
        }
    }
}
.....
于 2012-11-29T21:51:25.477 に答える