我有一個SqlDataReader
,我從中提取數據。我試圖根據閱讀器的數據向用戶顯示不同的消息。當if語句返回false我得到一個漫長的錯誤數據被正確地顯示,當我的if語句返回true:來自SqlDataReader的數據不會顯示在其他語句中
System.InvalidOperationException: Invalid attempt to read when no data is present.
at System.Data.SqlClient.SqlDataReader.CheckDataIsReady(Int32 columnIndex, Boolean allowPartiallyReadColumn, Boolean permitAsync, String methodName)
at System.Data.SqlClient.SqlDataReader.TryReadColumn(Int32 i, Boolean setTimeout, Boolean allowPartiallyReadColumn) at System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32 i)
at System.Data.SqlClient.SqlDataReader.GetValue(Int32 i)
at System.Data.SqlClient.SqlDataReader.get_Item(String name)
這裏是我的代碼:
protected void Page_Load(object sender, EventArgs e)
{
MembershipUser user = Membership.GetUser();
string key = user.ProviderUserKey.ToString();
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("usp_GetDetails", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@UserKey", key);
SqlDataReader reader;
try
{
con.Open();
reader = cmd.ExecuteReader();
reader.Read();
getBidNumber = reader["SelectedBid"].ToString();
getCompanyName = reader["CompanyName"].ToString();
getUserKey = reader["MembershipUserKey"].ToString();
getMerchantKey = reader["MerchantKey"].ToString();
getMerchantName = reader["MerchantName"].ToString();
this.DataBind();
if (getBidNumber != null)
{
lblBidSelected.Text = "Congratulations you have selected #" + getBidNumber + " from " + getCompanyName + ". Click here to review you bid details.";
}
else
{
lblNoBidSelected.Text = "You have not selected a processor. Please <a href='bids-visit.aspx?mkey=" + getMerchantKey + "'>click here</a> to review your bids.";
}
}
catch (Exception err)
{
lblError.Text = "There was an error " + err;
}
finally
{
con.Close();
}
}
這會照顧我的錯誤,但當我的if語句中的條件爲false時,我仍然無法將數據傳遞給我的else語句。 – brandozz
爲什麼不只是'if(reader.Read())'?這個更短,並且足夠可讀。 –
@JoelCoehoorn - '.Read()'返回一個布爾值,但是你能從方法的名稱中知道嗎?與'.HasRows'相比,很明顯真假是這個名字的答案。 –