Hi, I'm having problems with a DataTable I'm storing in a session variable. I use this as a temporary store for a shopping cart until a customer goes through the checkout and the cart is saved to my database.
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 getProductDetai l 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.
I am happy to upload the backend access database this page uses if someone wants to test the code.
Thanks in advance for any help that can offered.
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 getProductDetai l 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.
Code:
<%@ 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.
Comment