2013-04-26 113 views
2

我遇到了一個問題,希望您能幫助我。我是C#,ASP.NET和SQL的新手,請耐心等待。我在我的數據庫中創建了一個包含有關狗的信息的表格。我創建了一個包含下拉列表和幾個文本框的網頁。 ddl中填充了表格中的「name」字段(該部分正在工作)。我想要的是允許用戶從ddl中選擇一個名稱,然後讓文本框自動填充選定記錄的相應信息。每次我嘗試,我得到的錯誤:"Invalid attempt to read when no data is present."在SQL數據庫的網頁上填充文本框

這裏是我的事件處理程序代碼:用變得有點

protected void ddlDog_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     String connectionString = WebConfigurationManager.ConnectionStrings["Dogs"].ConnectionString; 
     string selectSQL = "SELECT * FROM dog WHERE [email protected]"; 

    SqlConnection con = new SqlConnection(connectionString); 
    SqlCommand cmd = new SqlCommand(selectSQL, con); 
    SqlDataReader reader; 
    cmd.Parameters.AddWithValue("@name", txtName.Text); 

    try 
    { 
     con.Open(); 
     reader = cmd.ExecuteReader(); 
     reader.Read(); 
     txtName.Text = reader["name"].ToString(); 
     txtBreed.Text = reader["breed"].ToString(); 
     txtAge.Text = reader["age"].ToString(); 
     txtAddress.Text = reader["address"].ToString(); 
     txtCity.Text = reader["city"].ToString(); 
     /*if ((bool)reader["pure"] == true) 
     { 
      cbxPure.Checked = true; 
     }*/ 
     reader.Close(); 
    } 
    catch (Exception err) 
    { 
     lblMsg.Text = err.Message; 
    } 
    finally 
    { 
     con.Close(); 
    } 
} 

你可以從註釋掉的部分看,我也有麻煩表中的字段更新網頁上的複選框。任何幫助表示讚賞!

+0

Melissa,請在調試器中逐步完成此操作,並讓我知道哪一行會引發錯誤。這個特定的錯誤信息有點誤導 - 這並不意味着人們認爲它的意思。同時檢查你的列名 - 從你的查詢中移除*並列出列名,然後當你閱讀這些列時,你的C#代碼中的名字是CASE-SENSITIVE,所以確保你的外殼匹配查詢(它沒有以匹配表def,因爲SQL不區分大小寫)。切勿在代碼查詢中使用*,這是您應該只在即時模式下使用的快捷方式。 – Jasmine 2013-04-26 23:04:18

+0

順便說一句,如果有零行,HasRows可能仍然是true,並且Read()將返回false但不拋出異常。 – Jasmine 2013-04-26 23:06:01

回答

0

嘗試封閉在括號中的任務,如果有一個行前檢查,以閱讀

if (reader.HasRows) 
{ 
    while(reader.Read()){ 
     txtName.Text = reader["name"].ToString(); 
     txtBreed.Text = reader["breed"].ToString(); 
     txtAge.Text = reader["age"].ToString(); 
     txtAddress.Text = reader["address"].ToString(); 
     txtCity.Text = reader["city"].ToString(); 
     } 
} 
else{ 
//Empty datareader 
} 
+0

我仍然收到相同的錯誤。 – 2013-04-26 22:38:30

+0

請參閱編輯代碼 – 2013-04-26 22:46:32

0

試試這個:

if (reader.Read()) 
{ 
     txtName.Text = reader["name"].ToString(); 
     txtBreed.Text = reader["breed"].ToString(); 
     txtAge.Text = reader["age"].ToString(); 
     txtAddress.Text = reader["address"].ToString(); 
     txtCity.Text = reader["city"].ToString(); 
     /*if ((bool)reader["pure"] == true) 
     { 
      cbxPure.Checked = true; 
     }*/ 
} 

如果你期望大於1分的結果比你可以使用while (reader.Read())代替。

+0

我嘗試使用while循環 - 它仍然不起作用,但現在我沒有得到任何錯誤。 – 2013-04-26 22:42:25