Как я могу обновить таблицу базы данных из каталога данных?

#c# #asp.net #database #datalist

#c# #asp.net #База данных #datalist

Вопрос:

Я создаю веб-сайт электронной коммерции и использовал каталог данных для отображения своих товаров, и когда я нажимаю кнопку «Добавить в корзину», они должны быть добавлены в таблицу базы данных, но по какой-то причине товары не обновляются в таблице базы данных. Кроме того, нажатие на 1-й продукт выдает сообщение об ошибке «уже открыто средство чтения», а строка, отображающая ошибку, является «int result = comm.ExecuteNonQuery();»

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Globalization;

namespace MWM1812
{
    public partial class productCatalog : System.Web.UI.Page
    {
        public enum MessageType { Success, Error, Info, Warning };
        protected void ShowMessage(string Message, MessageType type)
        {
            ScriptManager.RegisterStartupScript(this, this.GetType(), System.Guid.NewGuid().ToString(), "ShowMessage('"   Message   "','"   type   "');", true);
        }

        protected void Page_Load(object sender, EventArgs e)
        {
        }




        protected void DataList1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        protected void DataList1_ItemCommand(object source, DataListCommandEventArgs e)
        {
            if (e.CommandName == "AddToCart")
            {
                Session["uid"] = 1;
                Label lbl = (Label)e.Item.FindControl("PIDLabel");
                lblAtC.Text = lbl.Text;
                ShowMessage("Product successfully added to Cart", MessageType.Success);

                string connStr = ConfigurationManager.ConnectionStrings["MWM1812ConnString"].ConnectionString;
                SqlConnection conn = new SqlConnection(connStr);

                conn.Open();

                string sqlQuery = "SELECT * FROM tblShoppingCart WHERE uid=@uid AND pid=@pid";
                SqlCommand comm = new SqlCommand(sqlQuery, conn);
                comm.Parameters.AddWithValue("@uid", Session["uid"]);
                comm.Parameters.AddWithValue("@pid", lblAtC.Text.Trim());
                using (SqlDataReader reader = comm.ExecuteReader())
                {
                    if (reader.HasRows)
                    {
                        string sqlQuery2 = "UPDATE tblShoppingCart SET qty=qty 1 WHERE uid=@uid AND pid=@pid";
                        SqlCommand comm1 = new SqlCommand(sqlQuery2, conn);
                        comm1.Parameters.AddWithValue("@qty", 1);
                        comm1.Parameters.AddWithValue("@dtShopped", DateTime.Now.ToString());
                        //// Add code for adding parameters and executing sqlQuery2 
                        int result = comm1.ExecuteNonQuery();
                    }
                    else
                    {



                        string sqlQuery1 = "INSERT INTO tblShoppingCart (uid, pid, qty, dtShopped) VALUES (@uid, @pid, @qty, @dtShopped)";
                        SqlCommand comma = new SqlCommand(sqlQuery1, conn);
                        comma.Parameters.AddWithValue("@uid", Session["uid"]);
                        comma.Parameters.AddWithValue("@pid", lblAtC.Text);
                        comma.Parameters.AddWithValue("@qty", 1);
                        //comm.Parameters.AddWithValue("@dtShopped", DateTime.Now.ToLongDateString());
                        comma.Parameters.AddWithValue("@dtShopped", DateTime.Now.ToString());

                        int result = comma.ExecuteNonQuery();


                    }
                }
            }
        }
    }
}

  

Ответ №1:

Попробуйте обновить код следующим образом:

 if (e.CommandName == "AddToCart") {
     bool productExists = false;

     Session["uid"] = 1;
     Label lbl = (Label) e.Item.FindControl("PIDLabel");
     lblAtC.Text = lbl.Text;
     ShowMessage("Product successfully added to Cart", MessageType.Success);

     string connStr = ConfigurationManager.ConnectionStrings["MWM1812ConnString"].ConnectionString;
     SqlConnection conn = new SqlConnection(connStr);

     conn.Open();

     string sqlQuery = "SELECT * FROM tblShoppingCart WHERE uid=@uid AND pid=@pid";
     SqlCommand comm = new SqlCommand(sqlQuery, conn);
     comm.Parameters.AddWithValue("@uid", Session["uid"]);
     comm.Parameters.AddWithValue("@pid", lblAtC.Text.Trim());

     using(SqlDataReader reader = comm.ExecuteReader()) {    
        productExists = reader.HasRows;
     }

      if (productExists) {
       string sqlQuery2 = "UPDATE tblShoppingCart SET qty=qty 1 WHERE uid=@uid AND pid=@pid";

       // Add code for adding parameters and executing sqlQuery2 
      } else {



        string sqlQuery1 = "INSERT INTO tblShoppingCart (uid, pid, qty, dtShopped) VALUES (@uid, @pid, @qty, @dtShopped)";
        SqlCommand comma = new SqlCommand(sqlQuery, conn);
        comma.Parameters.AddWithValue("@uid", Session["uid"]);
        comma.Parameters.AddWithValue("@pid", lblAtC.Text);
        comma.Parameters.AddWithValue("@qty", 1);
        //comm.Parameters.AddWithValue("@dtShopped", DateTime.Now.ToLongDateString());
        comma.Parameters.AddWithValue("@dtShopped", DateTime.Now.ToString());

        int result = comma.ExecuteNonQuery();


      }     
    }
  

Обратите внимание на использование reader.Свойство HasRows для определения, существует ли продукт уже. Кроме того, SqlDataReader заключен в using блок для удаления его.

Комментарии:

1. Я попробовал это, но это выдает то же самое «Уже есть открытый DataReader, связанный с этой командой, который должен быть закрыт первым». ошибка

2. Вы опубликовали свой полный код как часть вопроса? Кроме того, в какой строке кода вы получаете это исключение?

3. Да, это был код всей страницы. проблема в том, что int result = comm . ExecuteNonQuery();

4. Я думаю, что ваше имя команды insert comma (обратите внимание на «a» в конце) вместо comm , которое вызывает проблему. Я также обновил ответ. comma.Parameters.AddWithValue("@uid", Session["uid"]); comma.Parameters.AddWithValue("@pid", lblAtC.Text); comma.Parameters.AddWithValue("@qty", 1); comma.Parameters.AddWithValue("@dtShopped", DateTime.Now.ToString()); int result = comma.ExecuteNonQuery();

5. Я пытался, но выдает ту же ошибку с той же строкой