2013-02-21 4 views
3

В моей winform я пытаюсь получить цену элемента из базы данных, передав имя элемента. Пользователь может видеть элементы в поле со списком, которое заполняет элемент из базы данных. Когда пользователь выбирает элемент из поля со списком и добавляет клики, он добавляет этот элемент в базу данных.Index Out of Range exception visual studio

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

Теперь, когда пользователь хочет удалить элемент из списка, пользователь выбирает элемент и нажимает на элемент delete, визуальная студия выдает ошибку «Указатель вне диапазона».

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

кода для добавления Цены

public int addPrice() 
     { 

      DataSet ds = searchforPrice(comboBox2.Text); 
      int sum; 
      bool success = int.TryParse(maskedTextBox10.Text, out sum); 
      int price = Convert.ToInt32(ds.Tables[0].Rows[0]["Price"]); 
      return sum + price; 

     } 

кода для цены вычитать

public int subPrice() 
     { 

      DataSet ds = searchforPrice(listBox1.GetItemText(listBox1.SelectedItem)); 
      int sum; 
      bool success = int.TryParse(maskedTextBox10.Text, out sum); 
      int price = Convert.ToInt32(ds.Tables[0].Rows[0]["Price"]); 
      return sum - price; 

     } 

Код для получения Цены от базы данных

public DataSet searchforPrice(string itemName) 
{ 
    DataSet dataSet = new DataSet(); 

    // Create connection object 
    OleDbConnection oleConn = new OleDbConnection(connString); 
    try 
    { 
     oleConn.Open(); 
     string sql = "SELECT [Price] FROM [Product] WHERE [Product Name] ='" + itemName + "'"; 
     OleDbDataAdapter dataAdapter = new OleDbDataAdapter(sql, oleConn); 
     dataAdapter.Fill(dataSet, "Product"); 

    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.ToString()); 
    } 
    finally 
    { 
     oleConn.Close(); 
    } 
    return dataSet; 
} 

enter image description here

+3

В данном случае это означает, что ваш стол пуст. И сделайте себе одолжение и загляните в параметризованные запросы. –

+0

Поместите точку останова в код и посмотрите, где вы получаете исключение. Если вы получаете индекс за пределами диапазона, он имеет тенденцию означать, что вы обращаетесь к массиву с числом больше длины. – TYY

+0

listBox1.GetItemText (listBox1.SelectedItem) подходит как null не уверен, почему –

ответ

1

Либо нет таблицы или нет строки в наборе результатов. Это означает, что доступ к первой записи (индекс 0) не будет работать, потому что нет первой записи. Вы получаете IndexOutOfRangeException. Проверьте свой запрос и источник данных.

+0

, но он отлично подходит для метода добавления, почему бы и нет для вычитания, поскольку я передаю имя элементов как строку из обоих методов. –

0

Метод searchforPrice возвращает набор данных без строк. Итак, строки [0] не существует. Проверьте свой метод и адаптируйте его к случаям, когда searchforPrice не возвращает данные (не нашел никакой цены).

if (ds.Tables[0].Rows.Count != 0 

{...}

1

Это не удается, потому что searchForPrice не возвращает ни одной строки в таблице. Таким образом, ошибка

Там нет строки в позиции 0.

Итак, если вы измените строку, чтобы получить значение из выпадающего списка, или где-то еще в форме, которая будет возвращать данные ваша ошибка будет исправлена.

Реальная базовая проблема - это стоимость, передаваемая в searchForPrice.

0

Проблема в том, что набор данных возвращает 0 строк. Это потому, что имя элемента не передается в SQL-запрос. Вам просто нужно небольшое изменение в вашей функции subPrice(),

public int subPrice() 
     { 

      DataSet ds = searchforPrice(listBox1.SelectedItem.ToString()); 
      int sum; 
      bool success = int.TryParse(maskedTextBox10.Text, out sum); 
      int price = Convert.ToInt32(ds.Tables[0].Rows[0]["Price"]); 
      return sum - price; 

     } 
+0

Visual Studio не распознает ListBoxItem –

+0

http://stackoverflow.com/questions/7887829/listbox-selected-item- content-to-textblock – Ankit

+0

Просто используйте listBox1.SelectedValue.ToString напрямую. Если выбранный объект имеет сложный объект, вы можете сделать ((CAST) ListBox.SelectedItem) .THE_PROPERTY_YOU_NEED. – TYY

0

Код, который был поставлен должен работать.

Вам нужно проверить, что столбцы в вашем фактическом источнике данных соответствуют тому, что передается через элементы ListBox. Мне кажется, что у вас, скорее всего, есть несоответствие в вашем соглашении об именах.

Если имена столбцов передается через матч ListBox те, в вашем источнике данных, то следующий код должен работать: -

public int subPrice() 
     { 
      if (listBox1.SelectedItems.Count > 0) 
      { 
       string SearchString = listBox1.SelectedItem.ToString().Trim(); 
       DataSet ds = searchforPrice(SearchString); 

       if (ds.Tables["Product"].Rows.Count > 0) 
       { 
        bool success = int.TryParse(maskedTextBox10.Text, out sum); 
        int price = Convert.ToInt32(ds.Tables["Product"].Rows[0]["Price"]); 
        return sum - price; 
       }     
      } 

      return null; 
     } 
+0

Дает мне ошибку «не все пути к кодам возвращают значение» –

+0

См. Мое обновление, пожалуйста. – Derek