2015-11-26 8 views
0

Я работаю над проектом электронной коммерции и испытываю небольшие проблемы с читателем. Вот мой ShoppingCartController код, который не работаетЯ пользуюсь читателем неправильно или, возможно, у моего читателя есть нулевые значения?

public List<PRODUCT> GetCartItems() 
    { 
     SqlConnection sqlConnection1 = new SqlConnection("MyConnection"); 
     SqlCommand cmd = new SqlCommand("uspGetCart", sqlConnection1); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.Add("@Username", SqlDbType.VarChar).Value = User.Identity.GetUserName(); 
     sqlConnection1.Open(); 
     SqlDataReader reader = cmd.ExecuteReader(); 
     List<PRODUCT> cartList = new List<PRODUCT>(); 
     PRODUCT product; 

     while (reader.Read()) 
     { 
      product = new PRODUCT(); 
      product.MANUFACTURER.ManufacturerName = reader["ManufacturerName"].ToString(); 
      product.Name = reader["Name"].ToString(); 
      product.Cost = decimal.Parse(reader["Cost"].ToString()); 
      cartList.Add(product); 
     } 
     sqlConnection1.Close(); 
     return cartList; 
    } 

ошибка, что я получаю это ссылка объект не указывает на экземпляр объекта.

Трассировка стека является

[NullReferenceException: Object reference not set to an instance of an object.] 
    SeeSharpBeans.Controllers.ShoppingCartController.GetCartItems() in c:\Users\Andrew\Documents\Visual Studio 2013\Projects\SeeSharpBeans\SeeSharpBeans\Controllers\ShoppingCartController.cs:54 
    SeeSharpBeans.Controllers.ShoppingCartController.Index() in c:\Users\Andrew\Documents\Visual Studio 2013\Projects\SeeSharpBeans\SeeSharpBeans\Controllers\ShoppingCartController.cs:22 
    lambda_method(Closure , ControllerBase , Object[]) +101 
    System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +59 
    System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +435 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +60 
    System.Web.Mvc.Async.ActionInvocation.InvokeSynchronousActionMethod() +76 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState) +36 
    System.Web.Mvc.Async.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult) +73 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +136 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +102 



System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +49 
    System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +117 
    System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +323 
    System.Web.Mvc.Async.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult) +44 
    System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +47 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +136 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +102 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +50 
    System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +72 
    System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +185 
    System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +42 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +133 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +56 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +40 
    System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +34 
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +70 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +133 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +56 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +37 
    System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +44 
    System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller) +39 
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +62 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +133 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +56 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +37 
    System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +39 
    System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +39 

Моя модель продукта выглядит следующим образом

public partial class PRODUCT 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public PRODUCT() 
    { 
     this.PURCHASES = new HashSet<Purchase>(); 
     this.TRANSACTIONS = new HashSet<TRANSACTION>(); 
    } 

    public int ProductID { get; set; } 
    public int ManufacturerID { get; set; } 
    public string Name { get; set; } 
    public int Quantity { get; set; } 
    public decimal Cost { get; set; } 

    public virtual MANUFACTURER MANUFACTURER { get; set; } 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<Purchase> PURCHASES { get; set; } 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<TRANSACTION> TRANSACTIONS { get; set; } 
} 
+0

Какую ошибку вы получаете? –

+0

[NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта.] – apkisbossin

+0

Почему ваши свойства являются виртуальными? Являются ли эти классы сущностей? Почему вы явно подавляете предупреждения, а не прислушиваетесь к их советам? –

ответ

2

Если данные не содержат нулевые значения, то скорее всего проблема в том, что вы не инициализировать MANUFACTURER недвижимость значение в конструкторе PRODUCT, что означает, что он равен нулю, когда вы пытаетесь установить значение product.MANUFACTURER.ManufacturerName.

Также обратите внимание, что классы наименования и члены во ВСЕХ CAPS, как правило, плохие - рассмотрим их изменение на Product и Manufacturer.

+0

Как ее инициализировать в классе PRODUCT? – apkisbossin

+0

В какой-то книге мне сказали, что я делаю классы базы данных во всех кепках, я думал, что это мусор, но я был как то, что знаю, и когда я сначала делал базу данных, он помещал класс Product и Manufacturer во все кепки – apkisbossin

2

Я думаю, что проблема может быть с линией

product.MANUFACTURER.ManufacturerName = reader["ManufacturerName"].ToString(); 

инициализируется ПРОИЗВОДИТЕЛЬ в классе продукта?

+0

Выполняет ли виртуальная инициализация Это? – apkisbossin

+1

Неважно, виртуально это или нет. Вы можете сделать что-то вроде этого: product.MANUFACTURER = new MANUFACTURER(); а затем инициализировать ManufaturerName –

0

Попытка переместить коллекцию определение элемента в сферу время цикла:

while (reader.Read()) 
{ 
PRODUCT product = new PRODUCT(); 
product.MANUFACTURER.ManufacturerName = reader["ManufacturerName"].ToString(); 

product.Name = reader["Name"].ToString(); 

product.Cost = decimal.Parse(reader["Cost"].ToString()); 
cartList.Add(product); } 
+0

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

+0

Это не сработало, такая же ошибка – apkisbossin

0
This line is the issue 
product.MANUFACTURER.ManufacturerName = reader["ManufacturerName"].ToString(); 

Use 
product.MANUFACTURER.ManufacturerName = Convert.ToString(reader["ManufacturerName"]) 

product.Cost = decimal.Parse(Convert.ToString(reader["Cost"])); 
instead of .ToString(); 
+0

Это дало мне ту же ошибку. Я сделал чистую и восстановил, чтобы убедиться. – apkisbossin

+0

Что касается этой строки product.Cost = decimal.Parse (reader ["Cost"]. ToString()); –

+0

Это не ударит по этой строке, потому что она ломается перед ней – apkisbossin

0

нужно инициализировать ПРОИЗВОДИТЕЛЬ, используя их конструктор, как: -

while (reader.Read()) 
      { 
       product = new PRODUCT(); 
       product.MANUFACTURER=new MANUFACTURER(); 
       product.MANUFACTURER.ManufacturerName = reader["ManufacturerName"].ToString(); 
       product.Name = reader["Name"].ToString(); 
       product.Cost = decimal.Parse(reader["Cost"].ToString()); 
       cartList.Add(product); 
      } 

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

  • Нет связанных вопросов^_^