Hej!
Jag ska kolla om en post i db finns, gör den det ska den uppdateras annars ska en ny läggas till. Jag fick hjälp av LarsG med en bra kodsnutt för att göra det i ASP men jag lyckas inte med det i ASP.NET. Koden:
public void AddItem(int productid,int quantity)
{
DbUtil db = new DbUtil();
DataSet ds = new DataSet();
string sqltemp,sql;
sql = "UPDATE Cart SET Quantity = Quantity + " + quantity + " WHERE CartID = '" + Session.SessionID + "' AND ProductID = " + productid;
try
{
db.getRecords(ds,sql,"CheckItem"); Trace.Warn("ds=",ds.GetXml());
[b]if (ds.Tables["CheckItem"].Rows.Count == 0)[/b]
{
sqltemp = "INSERT INTO Cart(CartID,ProductID,Quantity,DateAdded) VALUES('" + Session.SessionID + "'," + productid + "," + quantity + ",#" + DateTime.Now + "#)";
db.executeQuery(sqltemp);
}
}
catch(OleDbException)
{
//Felhantering! }
Felmeddelandet jag får är: "Value null was found where an instance of an object was required." och den pekar på rad 105 (fetmarkerad). Jag får det att fungera om jag först gör en select och sedan, beroende på resultatet, gör en update eller insert. Men på det här sättet slipper jag en fråga. Är det någon som vet hur man ska få det att fungera?
------------------
mvh André
VideMedlem sedan dec. 19998 577 inlägg Du får nog visa koden i funktionen getRecords för att man skall kunna se felet, det är ju trots allt där du fyller ditt dataset. :)
------------------
Mostly Harmless
Hej!
Ok, här kommer lite mer kod:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
[b]using DatabaseUtilities[/b];
namespace eShop
{
public class Cart : System.Web.UI.Page
{
public void AddItem(int productid,int quantity)
{
DbUtil db = new DbUtil();
DataSet ds = new DataSet();
string sqltemp,sql;
sql = "UPDATE Cart SET Quantity = Quantity + " + quantity + " WHERE CartID = '" + Session.SessionID + "' AND ProductID = " + productid;
try
{
db.getRecords(ds,sql,"CheckItem"); Trace.Warn("ds=",ds.GetXml());
[b]felet kommer nedan![/b]
if (ds.Tables["CheckItem"].Rows.Count == 0)
{
sqltemp = "INSERT INTO Cart(CartID,ProductID,Quantity,DateAdded) VALUES('" + Session.SessionID + "'," + productid + "," + quantity + ",#" + DateTime.Now + "#)";
db.executeQuery(sqltemp);
}
}
catch(OleDbException)
{
//Felhantering!
}
ds.Dispose();
}
Det är koden i cart.aspx.cs. Den fetmarkerade raden i början länkar till en dll som sköter db-hanteringen. Funktionen 'getRecords' finns där och koden ser så här:
public void getRecords(DataSet ds,string Sql,string DataTableName)
{
OleDbConnection myConnection = new OleDbConnection(connectionString);
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.SelectCommand = new OleDbCommand(Sql,myConnection);
try
{
adapter.Fill(ds,DataTableName);
}
catch (OleDbException e)
{
throw e;
}
finally
{
myConnection.Close();
adapter.Dispose();
}
}
red: Kanske borde tillägga att om jag kör en trace på cart.aspx och skriver ut innehållet i datasetet är värdet '<NewDataSet/>'
------------------
mvh André
[Redigerat av juventus1 den 02 jan 2002]
ToonsterMedlem sedan feb. 20001 590 inlägg Har inte kollat igenom koden, men vill komma med ett tips:
Vid databasoperationer som inte returnerar värden, kan man använda ExecuteNonQuery() detta gäller vid UPDATE och DELETE, troligen även för INSERT
/T
------------------
Jensen Ambassadör, mitt bästa köp! www.jensen.no
Tack för tipset! Läste detta i doc:en:
"Executes a SQL statement against the Connection and returns the number of rows affected." Verkar ju vara precis det jag ska ha!
------------------
mvh André
Nu har jag fått mer problem. I min dll hade jag redan en funktion som hette executeQuery men den var deklarerad som void så jag kan inte se hur många rader den påverkar. Nu vill jag överlagra den såhär:
public void executeQuery(string Sql)
{
//KOD
}
public int executeQuery(string Sql)
{
//KOD
}
Men den påstår att signaturen är densamma. Ingår inte returtypen i signaturen?? Hur ska man göra?
------------------
mvh André
Jag fattar verkligen inte varför det inte fungerar!! Detta finns att läsa i dokumentationen: "Each type member has a unique signature. Method signatures consist of the method name, a parameter list (the order and types of the method's arguments) and the type of the method's return value. (The return value's type is the method type.) More than one method with the same name can be defined within a type as long as the signatures differ. "
Enligt det här ska två likadana metoder men med två olika returtyper kunna ha samma namn. Är det någon som ser vad jag missat?
------------------
mvh André
[Redigerat av juventus1 den 05 jan 2002]
[Redigerat av juventus1 den 05 jan 2002]
spangoMedlem sedan juni 20008 205 inlägg Jag tvivlar extemt starkt på att det går. Eftersom man inte vet vilken metod som anropas om man inte lagrar returvärdet i en int (eftersom man inte behöver ta hand om returvärden) så borde det verkligen inte vara tillåtet.
------------------
Vaddå HTLM design? Jag e UTVECKLARE för fan! /mrblonde
Jag tänkte inte på att man inte behöver ta emot returvärdet. Då håller jag med dig - det borde inte fungera. Tack för hjälpen nu fungerar det perfekt :)
------------------
mvh André