2016-04-25 1 views
-1

Я устал от этой ошибки. Во время входа я аутентифицирую пользователя, а затем загружаю важную информацию в переменные сеанса. Я размещал свое приложение на IIS, а клиентские компьютеры использовали приложение через IP-адрес. Вот мой C# код ...Исключение IndexOutOfRange в SqlDataReader в asp.net 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 

Все хранимые процедуры, вызываемые из веб-приложения, должны использовать транзакции.

+0

@Clint B это не проблема, связанная с базой данных. Проблема с индексом, связанная только с C# –

+0

По моему опыту, прерывистые необъяснимые исключения, возникающие в веб-приложении во время вызова хранимой процедуры, часто вызваны тем, что хранимая процедура не была должным образом разработана для одновременного использования. –