2013-09-11 2 views
1

У меня есть база данных SQL Server в C# [она была создана до того, как я добрался до моей нынешней работы, создатель ушел], и все было нормально до последней недели. На первой странице clerk_search.aspx он ищет SQL Server для людей и отправляет обратно в datagrid, это нормально.Неверная попытка чтения данных, когда данных нет

Нажав кнопку ASP Image, она перейдет на следующую страницу, чтобы указать причину, по которой клиенты посещают загруженные поля о клиенте, которые отправляют обратно. Для некоторых людей следующая страница заполняется, а для других - нет. Используемый SQL-запрос отлично проверяет в анализаторе запросов, я не понимаю. Я не думаю, что его читатель, потому что другие зарегистрированы в порядке, а другие клиенты присутствуют в строках в SQL и могут быть запрошены просто отлично. Все опубликовано ниже, я не разбираюсь в кодировании, пожалуйста, помогите.

System.InvalidOperationException: Неверная попытка прочитать, когда данных нет.

SqlDataReader reader2 = cmd.ExecuteReader();
reader2.Read();

[InvalidOperationException: Invalid попытка чтения, когда нет данных нет.]

Вот фактический: .... clerk_create.aspx.cs

public partial class clerk_create : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (Request.Cookies["us"] == null) 
     { 
      Response.Write("Sorry, you do not have access to this page. Please see  
data systems."); 
      Response.End(); 
     } 

     if (!IsPostBack) 
     { 
      using (SqlConnection connection = new SqlConnection  
(WebConfigurationManager.ConnectionStrings["walkin2"].ConnectionString)) 
      { 
       TextBox txtsct = (TextBox)Page.PreviousPage.FindControl("Txtsct"); 
       Txtsct.Text = txtsct.Text; 
       TextBox txt = (TextBox)Page.PreviousPage.FindControl("Txtssn"); 
       Txtssn.Text = "" + txt.Text; 
       connection.Open(); 
       string strsql2 = "SELECT dbo.table_name.SSN, 
       dbo.table_name.LAST_NAME,  
       dbo.table_name.FIRST_NAME, dbo.table_name.MIDDLE_INITIAL, 
       dbo.table_name.COMPONENT_CODE, dbo.table_name.PRESENT_CODE FROM 
       dbo.table_name INNER JOIN dbo.table_name ON dbo.table_name.SSN = '" + 
       Txtssn.Text + "')"; 
       SqlCommand cmd = new SqlCommand(strsql2, connection); 
       SqlDataReader reader2 = cmd.ExecuteReader(); 
       reader2.Read(); 
       LblLName.Text = "" + reader2["LAST_NAME"]; 
       LblFName.Text = "" + reader2["FIRST_NAME"]; 
      } 
     } 
    } 
... 
} 
+2

Может быть целый ряд вещей, но нет 'using' построить вокруг читателя, чтобы убедиться, что он правильно расположен. – Arran

+0

Метод '.Read()' возвращает bool - ** true **, если есть данные, которые читаются и могут быть доступны, ** false **, если не было данных (что может быть полностью выполнено при поиске - правильно?). Вы должны это проверить! 'if (reader2.Read()) {......}' –

+0

В этом коде есть всевозможные ошибки. – Romoku

ответ

3

Вы должны проверить возвращаемое значение метода Read ,

Если метод чтения возвращает false, данных больше нет. В этом случае вы не должны читать данные от читателя. Это приведет к этому исключению.

Если вы уверены, что вы получите только один рекорд попробовать это

if(reader2.Read()) 
{ 
    LblLName.Text = "" + reader2["LAST_NAME"]; 
    LblFName.Text = "" + reader2["FIRST_NAME"]; 
} 

обычно DataReader используется как ниже, так как он может содержать количество записей

while (reader2.Read()) 
{ 
    //Consume reader using reader2["Column"] etc 
} 
+0

Та же недопустимая ошибка Mr Sriram Неверная попытка ... когда данных нет, говорит ошибка строка 42 ..... Строка 40: SqlDataReader reader2 = cmd.ExecuteReader(); Строка 41: if (reader2.Read()); Строка 42: LblLName.Text = "" + reader2 ["LAST_NAME"]; Строка 43: LblFName.Text = "" + reader2 ["FIRST_NAME"]; Строка 44: LblMI.Text = "" + reader2 ["MIDDLE_INITIAL"]; – user2769225

+0

'читатель2 [" MIDDLE_INITIAL "];' также должен войти внутрь, если заявление –

0

Ваш код не правильно располагая некоторые объекты, и он уязвим для SQL injection.

DTO:

public class Employee 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

Код:

private static readonly Lazy<string> ConnectionString = new Lazy<string>(() => WebConfigurationManager.ConnectionStrings["walkin2"].ConnectionString); 
private const string GetEmployeeBySSNQuery = "SELECT dbo.table_name.SSN, dbo.table_name.LAST_NAME, dbo.table_name.FIRST_NAME, dbo.table_name.MIDDLE_INITIAL, dbo.table_name.COMPONENT_CODE, dbo.table_name.PRESENT_CODE FROM dbo.table_name INNER JOIN dbo.table_name ON dbo.table_name.SSN = @SSN"; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    // ... 
    if(!IsPostBack) 
    { 
     GetEmployeeInformation(); 
    } 
} 

private void GetEmployeeInformation() 
{ 
    var sctTextBox = (TextBox)Page.PreviousPage.FindControl("Txtsct"); 
    Txtsct.Text = txtsct.Text; 
    var ssnTextBox = (TextBox)Page.PreviousPage.FindControl("Txtssn"); 
    Txtssn.Text = ssnTextBox.Text; 

    var ssn = ssnTextBox.Text; 

    var employee = GetEmployeeBySSN(ConnectionString.Value, ssn); 

    if(employee != null) 
    { 
     LblFName.Text = employee.FirstName; 
     LblLName.Text = employee.LastName; 
    } 
} 

private Employee GetEmployeeBySSN(string connectionString, string ssn) 
{ 
    Employee employee = null; 

    using(var connection = new SqlConnection(connectionString)) 
    { 
     connection.Open(); 
     using(var command = new SqlCommand(GetEmployeeBySSNQuery, connection) 
     { 
      command.Parameters.AddWithValue("@SSN", ssn); 

      using(var reader = command.ExecuteReader()) 
      { 
       if(reader.Read()) 
       { 
        employee = new Employee 
           { 
            FirstName = Convert.ToString(reader["FIRST_NAME"]), 
            LastName = Convert.ToString(reader["LAST_NAME"]) 
           }; 
       } 
      } 
     } 
    } 

    return employee; 
} 
+0

Добрый день, господа, Во-первых, большое спасибо за все попытки этого, спасибо за ваши мысли и предоставили . База данных была написана несколькими лет назад, и продолжает служить. Вставка SQL не является проблемой, если есть уязвимая точка. Он очень защищен. Им просто интересно, почему ....... – user2769225

+0

строка strsql2 = «SELECT dbo.table_name.SSN, dbo.table_name.LAST_NAME, dbo.table_name.FIRST_NAME, dbo.table_name.MIDDLE_INITIAL, dbo.table_name. COMPONENT_CODE, dbo.table_name.PRESENT_CODE FROM dbo.table_name INNER JOIN dbo.table_name ON dbo.table_name.SSN = '"+ Txtssn.Text +"') "; SqlCommand cmd = новый SqlCommand (strsql2, соединение); – user2769225

+0

Ошибки в нижнем выражении для фамилии, когда данные явно находятся в таблице, должен ли я удалить таблицу и перестроить? Я не думаю, что это поможет, но я чувствую себя не в логических вариантах SqlDataReader reader2 = cmd.ExecuteReader(); reader2.Read(); LblLName.Text = "" + reader2 ["LAST_NAME"]; LblFName.Text = "" + reader2 ["FIRST_NAME"]; – user2769225

Смежные вопросы