"В экземпляре объекта не задана ссылка на объект." в C #, SQL 2005, VS 2008 - PullRequest
2 голосов
/ 19 августа 2010

Я пытаюсь выбрать «food_ItemName» и «food_UnitPrice» из таблицы «t_Food» в SQL Server 2005.

У меня есть следующий код:

private void GetDatabaseConnection()
{
    string connectionString = @"Server = RZS-F839AD139AA\SQLEXPRESS; Integrated Security = SSPI; Database = HotelCustomerManagementDatabase";
    connection = new SqlConnection(connectionString);
    connection.Open();
}

и .....

public Food PopulateFoodItemListview()
{
    GetDatabaseConnection();
    string selectFoodItemQuery = @"SELECT food_ItemName, food_UnitPrice FROM t_Food";
    SqlCommand command = new SqlCommand(selectFoodItemQuery, connection);
    SqlDataReader reader = command.ExecuteReader();

    while (reader.Read())
    {
        food.ItemName.Add(reader.GetString(0));  // Exception is generated in this line
        food.UnitPrice.Add(reader.GetDouble(1));
    }
    connection.Close();
    return food;
}

В классе еды у меня есть следующий код:

public class Food
{
    private List<string> itemName;
    private List<double> unitPrice;
    private double itemUnit;
    private Customer foodCustomer = new Customer();

    public Food ()
    {
    }

    public Food(List<string> itemName, List<double> unitPrice) : this()
    {
        this.itemName = itemName;
        this.unitPrice = unitPrice;
    }

    public List<string> ItemName
    {
        get { return itemName; }
        set { itemName = value ; }
    }

    public List<double> UnitPrice
    {
        get { return unitPrice; }
        set { unitPrice = value; }
    }

    public double ItemUnit
    {
        get { return itemUnit; }
        set { itemUnit = value; }
    }
}

но оно породило следующее исключение. Почему?

"Ссылка на объект не установлена ​​для экземпляра объекта."

Ответы [ 4 ]

2 голосов
/ 19 августа 2010

Вам необходимо создать экземпляр переменных 'itemName' и 'unitPrice', прежде чем вы сможете добавить их в одну из них. Вы можете пойти дальше и сделать это, когда объявляете их.

private List<string> itemName = new List<string>();
private List<double> unitPrice = new List<string>();
2 голосов
/ 19 августа 2010

Хорошо, чтобы начать:

ConnectionStrings должны находиться в app.config / web.config.

ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString

Используйте следующий код для открытия / закрытия соединения:

using(SqlConnection connection = new SqlConnection(ConnectionString))
{
  connection.Open();

}

И постарайтесь избежать появления нулей в считывателе ...

SELECT ISNULL(food_ItemName, ''), ISNULL(food_UnitPrice, 0.0) 

EDIT:

Вы забыли инициализировать закрытого члена класса Food

Изменить на эти строки:

private List<string> itemName = new List<string>; 
private List<double> unitPrice = new List<double>; 

Или сделай так

public List<string> ItemName 
{ 
   get 
   { 
     if (itemName == null) itemName = new List<string>; 
     return itemName; 
   } 
}


public List<double> UnitPrice 
{ 
  get 
  { 
    if (unitPrice== null) unitPrice= new List<double>; 
    return unitPrice; 
  } 
} 
1 голос
/ 19 августа 2010

На какую переменную он жалуется?

Похоже, проблемным (ну, может быть, есть и другие проблемы, но это наверняка может вызвать исключение) является ItemName, который не инициирован.

0 голосов
/ 19 августа 2010

Вы смотрели на свою трассировку стека, чтобы выяснить, в какой строке происходит ошибка или в какой функции?

Из того, что я видел, похоже, что оно ссылается на ваш объект питания в PopulateFoodItemListview () метод.Пищевой объект никогда не создается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...