2013-10-17 87 views
1

我有一個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(); 
    } 

} 

回答

2

我建議使用SqlDataReader的更可讀HasRows財產,像這樣:

if (reader.HasRows) 
{ 
    while (reader.Read()) 
    { 
     // Do your reading logic here 
     getBidNumber = reader["SelectedBid"].ToString(); 
     getCompanyName = reader["CompanyName"].ToString(); 
     getUserKey = reader["MembershipUserKey"].ToString(); 
     getMerchantKey = reader["MerchantKey"].ToString(); 
     getMerchantName = reader["MerchantName"].ToString(); 
    } 
} 

注:這使得,爲什麼或者爲什麼沒有任何數據是由你的閱讀的邏輯處理,這很明顯。

UPDATE:

if-else邏輯改成這樣:

if (!String.IsNullOrEmpty(getBidNumber)) 
{ 
    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."; 
} 

注:string將初始化爲空字符串,不爲空,而ToString()不會返回null;所以使用IsNullOrEmpty()方法來檢查一個值更符合你的方法。

+0

這會照顧我的錯誤,但當我的if語句中的條件爲false時,我仍然無法將數據傳遞給我的else語句。 – brandozz

+0

爲什麼不只是'if(reader.Read())'?這個更短,並且足夠可讀。 –

+0

@JoelCoehoorn - '.Read()'返回一個布爾值,但是你能從方法的名稱中知道嗎?與'.HasRows'相比,很明顯真假是這個名字的答案。 –

0

既然你都在裏面else它意味着:

reader==null -> getMerchantKey = reader["MerchantKey"].ToString()==null

- >你得到你的錯誤

0

該問題不在else塊內。唯一的例外是較早拋出,在這條線:

getBidNumber = reader["SelectedBid"].ToString(); 

它拋出有因爲調用reader.Read()沒有產生任何結果的原因。它只有似乎像問題是在else塊,因爲如果reader.Read()成功的調用if條件將始終測試到true。你真正需要的是這樣的代碼:

if (reader.Read()) 
{ 
    getBidNumber = reader["SelectedBid"].ToString(); 
    getCompanyName = reader["CompanyName"].ToString(); 

    lblBidSelected.Text = "Congratulations you have selected # ... " 
} 
else 
{ 
    //You'll need to change your error message, because the merchant key is unknown 
    blNoBidSelected.Text = "You have not selected a processor. ... " 
} 
+0

我在if語句中的狀況如何? if(getBidNumber!= null) – brandozz

+0

@brandozz'.ToString()'將不會**返回null。如果該列的值爲null,則.ToString()將返回一個空字符串。因此,如果對'reader.Read()'的調用成功,那麼if()條件將被視爲'true'。當前代碼不可能到達'else'塊。 –

+0

喬爾,它是否返回一個空字符串? – brandozz

0

你可能達到的if語句,因爲你的查詢沒有返回行之前收到此錯誤。在繼續之前檢查reader.Read()返回值。

0

首先初始化這樣

string getBidNumber =null; 

並做字符串轉換檢查讀卡器[「SelectedBid」當爲空或不是。

if(reader["SelectedBid"] !=null) 
{ 
getBidNumber = reader["SelectedBid"].ToString(); 
} 

其餘代碼都一樣。祝你好運

+0

我嘗試過,但我無法將數據導入else語句。 – brandozz

相關問題