2012-04-13 3 views
4

Вот мои GeneralFunctions:«Invalid попытка чтения при отсутствии данных присутствует» при использовании SqlDataReader

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Configuration; 
using System.Data; 
using System.Data.SqlClient; 

/// <summary> 
/// Summary description for GeneralFunctions 
/// </summary> 
public class GeneralFunctions 
{ 
    public GeneralFunctions() 
    { 
     // 
     // TODO: Add constructor logic here 
     // 
    } 

    public static DataTable GetData (string query) 
    { 
     SqlDataAdapter dataAdapter; 
     DataTable table; 

     try 
     { 
      dataAdapter = new SqlDataAdapter(query, GetConnectionString()); 
      table = new DataTable(); 

      dataAdapter.Fill(table); 
      return table; 
     } 
     catch (Exception ex) 
     { 
     } 
     finally 
     { 
      dataAdapter = null; 
      table = null; 
     } 

     return table; 
    } 

    private static string GetConnectionString() 
    { 
     string connectionString = ConfigurationManager.ConnectionStrings[ "CAPortalConnectionString" ].ConnectionString; 

     return connectionString; 
    } 

    public static int? AuthenticateLogin (string username, string password) 
    { 
     using (var conn = new SqlConnection(GetConnectionString())) 
     using (var cmd = conn.CreateCommand()) 
     { 
      conn.Open(); 
      cmd.CommandText = 
      @"SELECT 
       DistID 
      FROM 
       Distributor 
      WHERE 
       Username = @username 
      AND 
       Password = @password"; 
      cmd.Parameters.AddWithValue("@username", username); 
      cmd.Parameters.AddWithValue("@password", password); 
      using (var reader = cmd.ExecuteReader()) 
      { 
       if (!reader.Read()) 
       { 
        // no results found 
        return null; 
       } 
       return reader.GetInt32(reader.GetOrdinal("DistID")); 
      } 
     } 
    } 

    public static string GetDistInfo (int distID) 
    { 
     using (var conn = new SqlConnection(GetConnectionString())) 
     using (var cmd = conn.CreateCommand()) 
     { 
      conn.Open(); 
      cmd.CommandText = 
      @"SELECT 
       FName + ' ' + LName AS Name 
      FROM 
       Distributor 
      WHERE 
       DistID = @distid"; 
      cmd.Parameters.AddWithValue("@distid", distID); 
      using (var reader = cmd.ExecuteReader()) 
      { 
       return reader.GetString(reader.GetOrdinal("Name")); 
      } 
     } 
    } 

} 

Вот мой Логин страница:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public partial class index : System.Web.UI.Page 
{ 
    protected void Page_Load (object sender, EventArgs e) 
    { 

    } 
    protected void but_login_Click (object sender, EventArgs e) 
    { 
     if (username_id.Text != "" || password.Text != "") 
     { 
      // Verify the username and password match the database 
      var distId = GeneralFunctions.AuthenticateLogin(username_id.Text, password.Text); 

      if (distId != null) 
      { 
       // User is authenticated 
       var name = GeneralFunctions.GetDistInfo((int)distId); 
       Session[ "DistName" ] = name; 
       Session[ "DistID" ] = distId; 

       Response.Redirect("dashboard.aspx", false); 
      } 
      else 
      { 
       // provide error label here username and password do not match 
       authentFailed.Text = "Username/Password did not match our records"; 
      } 
     } 
     else 
     { 
      // Username or Password blank error lable 
      authentFailed.Text = "Please Input Username/Password"; 
     } 
    } 
} 

Прежде чем я добавил метод GetDistInfo он работал просто отлично, вошел в систему пользователя. Затем я попытался добавить переменные сеанса и метод GetDistInfo. Я передаю DistID, возвращенный из AuthenticateLogin, в метод GetDistInfo. Он выдает ошибку со следующей ошибкой:

Сведения об исключении: System.InvalidOperationException: Неправильная попытка чтения, когда данные отсутствуют.

Source Error: 

Line 95:    using (var reader = cmd.ExecuteReader()) 
Line 96:    { 
Line 97:     return reader.GetString(reader.GetOrdinal("Name")); 
Line 98:    } 
Line 99:   } 


Source File: c:\inetpub\wwwroot\Base\ClientAccessPortal\App_Code\GeneralFunctions.cs Line: 97 

Когда я запускаю SQL по базе данных, он правильно отбрасывает имя клиента. Я не уверен, почему он не делает этого внутри кода. Любой, кто может видеть то, что мне не хватает?

ответ

10

Попробуйте заменить это. Фактически Read() отсутствовал в вашем коде.

using (var reader = cmd.ExecuteReader()) 
{ 
    return reader.GetString(reader.GetOrdinal("Name")); 
} 

со следующими

using (var reader = cmd.ExecuteReader()) 
{ 
    if(reader.Read()) 
    { 
      return reader.GetString(reader.GetOrdinal("Name")); 
    } 
    return null; 
} 
+0

Я добавил возврат null, и это исправлено. Можете ли вы помочь мне понять, почему это искало нуль, когда чтение всегда будет возвращать результат? –

+0

Компилятор замечает, что нет оператора возврата. Компилятор не может доказать, что путь кода никогда не уйдет, и поэтому он ожидает, чтобы он нажал оператор return. – Pankaj

+0

вы были первыми, кто опубликовал обратное нулевое решение, и это сработало как шарм. Должен проверить это как ответ. Спасибо всем за вашу помощь и быстрые ответы. –

2

Вы должны прочитать первый (вы делаете это при использовании читателя выше в коде):

using (var reader = cmd.ExecuteReader()) 
{ 
    // you haven't positioned yourself on a record yet. 
    while (reader.Read()) 
    { 
     return reader.GetString(reader.GetOrdinal("Name")); 
    } 
    return string.Empty; 
} 

EDIT Чтобы ответить к полученной вами ошибке; так как вы определяете свою функцию

public static string GetDistInfo (int distID) 

все возможные способы «из функции» должны что-то вернуть. В вашем случае вы должны вернуть строку или, возможно, null в зависимости от того, что вы хотите сделать.

+0

Это, казалось, шаг в правильном направлении, но теперь он дает мне новую ошибку: Compiler 'Сообщение об ошибке: CS0161: 'GeneralFunctions.GetDistInfo (int)': не все пути кода возвращают значение« Anyideas »? –

+0

Пожалуйста, проверьте мои изменения. – Pankaj

+0

'String.Empty' возьмет память, как шоколад. – Pankaj