2016-04-25 98 views
-1

我厭倦了這個錯誤。在登錄時,我正在驗證用戶,然後在會話變量中加載一些重要信息。我在IIS上託管我的應用程序,客戶端計算機通過IP地址使用應用程序。這裏是我的C#代碼...asp.net中的SqlDataReader中的IndexOutOfRange異常c#

protected void btnLogin_Click(object sender, EventArgs e) 
    { 
     Session["UserName"] = txtUserName.Text; 
     string DefaultYear = GetDefaultFinYear();   
     if (DefaultYear != string.Empty) 
     { 
      DefaultYear = "connect" + DefaultYear; 
      Connections.Init(DefaultYear); 
      SqlDataAdapter adp = new SqlDataAdapter(); 
      SqlDataReader dr = null; 
      try 
      { 
       adp = new SqlDataAdapter("CheckLogin_sp", Connections.Connection[Session["UserName"].ToString()]); 
       adp.SelectCommand.Parameters.AddWithValue("@UserName", txtUserName.Text.Trim()); 
       adp.SelectCommand.Parameters.AddWithValue("@Pwd", txtPassword.Text.Trim()); 
       adp.SelectCommand.Parameters.AddWithValue("option", "Authenticate".Trim()); 
       adp.SelectCommand.CommandType = CommandType.StoredProcedure; 
       if (Connections.Connection[Session["UserName"].ToString()].State == ConnectionState.Closed) 
       { 
        Connections.Connection[Session["UserName"].ToString()].Open(); 
       } 
       dr = adp.SelectCommand.ExecuteReader(); 

       if (dr.HasRows) 
       { 
        while (dr.Read()) 
        {       
         Session["Name"] = dr[0].ToString(); 
         Session["CompanyName"] = dr[1].ToString(); 
         Session["UserId"] = dr[2].ToString(); 
         Session["Center"] = dr[3].ToString(); 
         Session["ClientCode"] = dr[4].ToString(); 
         Session["UserImage"] = dr[5].ToString(); 
         Session["CurrentDatabase"] = dr[6].ToString(); 
         Connections.BillReport = dr[7].ToString(); 
         Connections.DuesReport = dr[8].ToString(); 
         Connections.GeneralReport = dr[9].ToString(); 
         Connections.PendingReport = dr[10].ToString(); 
         Connections.RadiologyReport = dr[11].ToString(); 
         Connections.HistoReport = dr[12].ToString(); 
        } 
        Session["value"] = "admin"; 
        Response.Redirect("~/Masters/home.aspx", false); 
       } 
       else 
       { 
        MessageBox.Show("Invalid Password"); 
        txtUserName.Text = string.Empty; 
       }    
      } 
      catch (Exception ex) 
      { 
       Response.Write(ex.ToString()); 
      } 
      finally 
      { 
       Connections.Connection[Session["UserName"].ToString()].Close(); 
       adp.Dispose(); 
       dr.Close(); 
       dr.Dispose();   

      } 
     } 
     else 
     { 
      MessageBox.Show("Invalid UserName"); 
     }   
    } 

並不是每一個出現此錯誤,但有時當多臺計算機上訪問應用程序自帶的下面一行此錯誤

Session["Name"] = dr[0].ToString(); 

注時間: -一旦這個錯誤發生時它只在服務器計算機重新啓動時解決。

+0

你如何認證人?會話基於身份驗證。每個經過身份驗證的用戶都有自己的會話如果多人使用相同的憑證登錄,那麼它可能會混淆會話。 – neo

+0

對不起,我不明白。你可以看到我的代碼,我如何驗證用戶。我將用戶名和密碼發送到數據庫,如果它返回任何值,我會在會話變量中獲得信息。 –

+0

會話是基於用戶的,但在您的情況下,您似乎無法管理會話。每個登錄的人都會替換現有的會話。這就是爲什麼多個用戶登錄導致問題。 – neo

回答

-2

我相信用事務包裝存儲過程中的代碼可以解決您的問題。

BEGIN TRY 
    BEGIN TRANSACTION CheckLogin 

     --Existing SQL code 

    COMMIT TRANSACTION CheckLogin 
END TRY 
BEGIN CATCH 
    ROLLBACK TRANSACTION CheckLogin 
END CATCH 

從Web應用程序調用的所有存儲過程都應使用事務。

+0

@Clint B這不是數據庫相關的問題。與c#相關的索引範圍問題僅針對 –

+0

我的經驗是,在存儲過程調用期間在Web應用程序中發生的間歇性無法解釋的異常通常是由於存儲過程沒有正確設計用於同時使用而導致的。 –