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:
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?
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/>'
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!
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?
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?
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.