2017-11-13 31 views
0

ich den Code Gefolgt haben, dass mein Dozent mich auf dem Labor Klasse unterrichten, aber ich kann es immer noch ausführenCheck out Warenkorb keine Arbeits asp.net

dies ist eine Funktion Warenkorb und ich habe ausgecheckt und gehen mit der Zahlung Taste (es gibt, wo der Fehler passieren)

Es gibt 2 verschiedene Fehler

protected void btnPay_Click(object sender, EventArgs e) 
    { 
     //get userId 
     String userId = HttpContext.Current.User.Identity.GetUserId(); 
     //get cart Session 
     CartDataSet.CartDataTable orderTable; 
     orderTable = Session["cartSession"] as CartDataSet.CartDataTable; 
     string connString = System.Configuration.ConfigurationManager. 
     ConnectionStrings["DefaultConnection"].ConnectionString; 
     SqlConnection connection = new SqlConnection(connString); 
     connection.Open(); 
     SqlCommand insertCommand = new SqlCommand("Insert into [order] (OrderDate, MemberId, Total, Status) values (@OrderDate, @MemberId, @Total, @Status)", connection); 
     insertCommand.Parameters.AddWithValue("@OrderDate", DateTime.Now); 
     insertCommand.Parameters.AddWithValue("@MemberId", userId); 
     insertCommand.Parameters.AddWithValue("@Total", 
     Convert.ToDouble(orderTable.Rows[0]["Total"])); 
     insertCommand.Parameters.AddWithValue("@Status", "Pending"); 
     insertCommand.ExecuteNonQuery(); 
     connection.Close(); 
     //get orderId 
     connection.Open(); 
     int maxId; 
     SqlCommand maxIdCommand = new SqlCommand("Select MAX(OrderId) from [Order]", connection); 
     SqlDataReader myReader = maxIdCommand.ExecuteReader(); 
     myReader.Read(); 
     maxId = Convert.ToInt16(myReader.GetValue(0)); 
     connection.Close(); 
     insertCommand = new SqlCommand("Insert into OrderItem (OrderId, ProductId, Price, Quantity, Subtotal) values " +"(@OrderId, @ProductId, @Price, @Quantity, @Subtotal)", connection); 
     insertCommand.Parameters.Add("@OrderId", SqlDbType.Int); 
     insertCommand.Parameters.Add("@ProductId", SqlDbType.Int); 
     insertCommand.Parameters.Add("@Price", SqlDbType.Money); 
     insertCommand.Parameters.Add("@Quantity", SqlDbType.Int); 
     insertCommand.Parameters.Add("@Subtotal", SqlDbType.Money); 
     connection.Open(); 
     foreach (DataRow row in orderTable.Rows) 
     { 
      insertCommand.Parameters["@OrderId"].Value = maxId; 
      insertCommand.Parameters["@ProductId"].Value = row["ProductId"]; 
      insertCommand.Parameters["@Price"].Value = row["Price"]; 
      insertCommand.Parameters["@Quantity"].Value = row["Quantity"]; 
      insertCommand.Parameters["@Subtotal"].Value = row["Subtotal"]; 
      insertCommand.ExecuteNonQuery(); 
     } 
     connection.Close(); 
     Session["cartSession"] = null;} 

enter image description here enter image description here

Antwort

0

Das erste durch diese Aussage verursachte Problem:

CartDataSet.CartDataTable orderTable = Session["cartSession"] as CartDataSet.CartDataTable; 

Wenn Session["cartSession"] null ist, offensichtlich orderTable Nullwert enthält und orderTable.Rows[0]["Total"]NullReferenceException werfen. Setzen Sie ein if Zustand zu überprüfen gegen Nullwert in orderTable:

if (orderTable != null) 
{ 
    insertCommand.Parameters.AddWithValue("@Total", Convert.ToDouble(orderTable.Rows[0]["Total"])); 
} 
else 
{ 
    // put other values to insert with '@Total' parameter 
} 

Das zweite Problem tritt auf, weil Sie versuchen, Wert in OrderId hinzufügen, die möglicherweise als Identitätsspalte gesetzt (automatisch generiert). Hier können Sie eine von drei Möglichkeiten wählen:

  • OrderId Einsetzen entfernen, indem Sie diese Zeilen Strippen -

    insertCommand.Parameters.Add("@OrderId", SqlDbType.Int); 
    insertCommand.Parameters["@OrderId"].Value = maxId; 
    
  • Oder SET IDENTITY INSERT OrderItem [ON|OFF] vor verwenden und nach INSERT Abfrage ausgeführt wird, aber nicht empfohlen, da es möglich ist, zu duplizierten ID einfügen -

    insertCommand = new SqlCommand(@"SET IDENTITY_INSERT OrderItem ON; 
               Insert into OrderItem (OrderId, ProductId, Price, Quantity, Subtotal) values (@OrderId, @ProductId, @Price, @Quantity, @Subtotal); 
               SET IDENTITY_INSERT OrderItem OFF;", connection); 
    
  • Remove OrderId as identity column definition aber es halten s Primärschlüsseleinstellung.