I have used DataTables stored in sessions before for shopping baskets with no problems. However, on this occasion I am only passing the AddHandler the product id and the quantity being added. The Handler then calls a getProductDetail method to lookup the product name & price from the database. The handler then passes these details to the AddToDataTable method to add a new row to the DataTable stored in the session.
For some reason the process of retrieving data from the database seems to be killing the session variable. Meaning everytime I add an item to the DataTable the previous item(s) already in the basket are lost and only the most recent item added appears.
I can't for the life of me figure out what is wrong. If I call the AddToDataTable method directly then everything works fine and multiple rows can be added to the TempBasket.
Here my code. Hopefullly someone can point out some stupid mistake I have made. I really need to get this working ASAP as I'm working to a deadline.
Expand|Select|Wrap|Line Numbers
- <%@ Page Language="C#" Debug="true" %>
- <%@ import Namespace="System" %>
- <%@ import Namespace="System.Data" %>
- <%@ import Namespace="System.Data.OleDb" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
- <script runat="server">
- void bindTempBasket()
- {
- DataTable dtTempBasket = mGetTempBasket();
- dgDebugTableDisplay.DataSource = dtTempBasket;
- dgDebugTableDisplay.DataBind();
- }
- public DataTable mGetDataTable(string sSQL)
- {
- string sCString = ConfigurationSettings.AppSettings["ConnectionString"];
- using (OleDbConnection myConnection = new OleDbConnection(sCString))
- {
- OleDbCommand myCommand = new OleDbCommand(sSQL, myConnection);
- OleDbDataAdapter myAdapter = new OleDbDataAdapter(myCommand);
- DataTable dtTable = new DataTable("Table");
- myAdapter.Fill(dtTable);
- return dtTable;
- }
- } //End mGetDataTable method
- public DataTable mGetProductDetails(int iID)
- {
- string sSQL = "SELECT PVariant_ID, Product_Name, Product_TradeCost FROM qryProductList WHERE PVariant_ID = " + iID + ";";
- DataTable dtProductDetails = mGetDataTable(sSQL);
- return dtProductDetails;
- } //End mGetProductDetails method
- public DataTable mCreateTempBasketTable()
- {
- DataTable myTable = new DataTable("Basket");
- DataColumn dtCol;
- dtCol = new DataColumn();
- dtCol.DataType = System.Type.GetType("System.Int32");
- dtCol.ColumnName = "PVariant_ID";
- myTable.Columns.Add(dtCol);
- dtCol = new DataColumn();
- dtCol.DataType = System.Type.GetType("System.String");
- dtCol.ColumnName = "Product_Name";
- myTable.Columns.Add(dtCol);
- dtCol = new DataColumn();
- dtCol.DataType = System.Type.GetType("System.Int32");
- dtCol.ColumnName = "IOrderLine_Quantity";
- myTable.Columns.Add(dtCol);
- dtCol = new DataColumn();
- dtCol.DataType = System.Type.GetType("System.Double");
- dtCol.ColumnName = "IOrderLine_UnitCost";
- myTable.Columns.Add(dtCol);
- DataColumn[] myPrimaryKeyColumns = new DataColumn[1];
- myPrimaryKeyColumns[0] = myTable.Columns["PVariant_ID"];
- myTable.PrimaryKey = myPrimaryKeyColumns;
- return myTable;
- }//End createBasketTable Method
- public DataTable mGetTempBasket()
- {
- if (Session["basket"] == null)
- {
- DataTable dtBasket = mCreateTempBasketTable();
- Session["basket"] = dtBasket;
- }
- return (DataTable)Session["basket"];
- }//End mGetBasket Menthod
- public void mSaveTempBasket(DataTable newTable)
- {
- Session["basket"] = newTable;
- }
- void mAddHandler(int iID, int iQuantity)
- {
- DataTable dtProductDetail = mGetProductDetails(iID);
- if (dtProductDetail.Rows.Count > 0)
- {
- int iPVariant_ID = Convert.ToInt32(dtProductDetail.Rows[0]["PVariant_ID"]);
- string sProduct_Name = Convert.ToString(dtProductDetail.Rows[0]["Product_Name"]);
- double dUnitCost = Convert.ToDouble(dtProductDetail.Rows[0]["Product_TradeCost"]);
- mAddToDataTable(iPVariant_ID, sProduct_Name, iQuantity, dUnitCost);
- }
- }
- void mAddToDataTable(int iID, string sProductName, int iQuantity, double dUnitCost)
- {
- DataTable dtBasket = mGetTempBasket();
- DataRow dtRow;
- dtRow = dtBasket.NewRow();
- dtRow["PVariant_ID"] = iID;
- dtRow["Product_Name"] = sProductName;
- dtRow["IOrderLine_Quantity"] = iQuantity;
- dtRow["IOrderLine_UnitCost"] = dUnitCost;
- dtBasket.Rows.Add(dtRow);
- mSaveTempBasket(dtBasket);
- }
- void AddItem_Click(object sender, EventArgs e)
- {
- //Temp method for debug
- int iID = Convert.ToInt32(ItemCode.Text);
- //mAddToDataTable(iID, "Test Product Name", 1, "", 99.99);
- mAddHandler(iID, 1);
- bindTempBasket();
- }
- </script>
- <html xmlns="http://www.w3.org/1999/xhtml" >
- <head runat="server">
- <title>Product Search</title>
- <link rel="Stylesheet" href="CSS/default.css" />
- </head>
- <body>
- <form id="form1" runat="server">
- <asp:TextBox ID="ItemCode" runat="server"></asp:TextBox>
- <asp:Button ID="AddItem"
- runat="server" Text="Button" onclick="AddItem_Click" />
- <asp:datagrid id="dgDebugTableDisplay" runat="server" />
- </form>
- </body>
- </html>
Thanks in advance for any help that can offered.