Just nu i M3-nätverket
Gå till innehåll

Två problem


evil_eye

Rekommendera Poster

Här sitter man snart flintskallig och sliter de sista stråna från huvudet. JAg håller på med en enkel webshop men får inte inloggning och kundvagnen att samarbeta.

 

Kundvagnen sparas i en databas och inloggade användare kan fortsätta handla vid ett senare tillfälle. Här dyker problemet upp. När jag loggar in anvädaren så uppdateras inte kundvagnen, utan det gör den först när man byter sida. Alltså för att få fram rätt kundvagn så måste användaren först logga in och sen byta sida. Så ska det ju inte vara! Kundvagnen ska ju uppdateras direkt!

Jag använder mig av FormsAuthentication.SetAuthCookie för att logga in användaren, när jag kollat så lösen och så stämmer och jag satt cookien ropar ja på funktionen som ska uppdatera kundvagnen. Där kontrolleras om användaren är inloggad eller inte mha User.Identity.IsAuthenticated och sedan hämtas rätt data till kundvagnen med User.Identity.Name.

Kan det vara så att User.Identity inte fått sina värden vid det tillfället utan först nästa gång sidan laddas?

Hur som helst så fattar jag inte ett skvatt :thumbsdown: så någon vänlig själ får gärna gnugga sina geniknölar åt mig (mina är bortgnuggade tyvärr).

 

Och så till problem nummer 2: Tömma kundvagnen.

DELETE * FROM kundvagn WHERE userid = '1'

 

Då får jag felet "Det går inte att ta bort data från angivna tabeller."

Det förstår jag inte heller, eftersom det går alldeles utmärkt att ta bort med exakt samma fråga i Access (Ja! Jag vet att Access inte är bäst men det är vad jag kan!)

Precis som med mitt första problem så är jag helt lost. Fattar noll, nix, nada, ingenting!

Så om det är någon snäll person som har 2 sekunder över så skulle jag vara enormt tacksam och du ville hjälpa mig lite. :)

 

MVH Daniel (evell)

 

Länk till kommentar
Dela på andra webbplatser

Börjar med fråga 2.

Skall det inte vara "DELETE FROM kundvagn WHERE userid = '1'" i SQL

 

Fråga 1.

Är inte riktigt insatt men antagligen är det så att uppdateringen sker när sidan laddas. Kanske man kan ändra så att uppdateringen sker i en metod som anropas när sidan laddas men även kan anropas när inloggningen sker.

 

 

[Jharowski]

 

 

Länk till kommentar
Dela på andra webbplatser

Det fungerar varken med DELETE * FROM eller DELETE FROM. Tyvärr!

 

Det är så att jag har en metod som anropas när sidan laddas och när användaren loggar in. Alternativet är väl att jag kör en Response.Redirect vid inloggning så att sidan laddas om och kundvagnen också.

 

Får fungera vidare ett tag. Måste leta reda på någon med mycke hår också, mitt är slut. Någon hårdrockare? ;)

 

MVH Daniel (evell)

 

Länk till kommentar
Dela på andra webbplatser

det ska vara "delete from kundvagn where userId = 1"

Kolla så du har rättigheter att skriva till din access-fil.

 

och anledningen till att kundvagnen inte uppdateras när du loggar in är det att datan cachas när du gör en postback. Precis som du skrev så får du göra en redirect så laddas sidan om.

 

lycka till!

 

 

 

Länk till kommentar
Dela på andra webbplatser

Två problem är nu "bara" ett. Jag kör med en Response.Redirect när man har loggat in, det fungerar bra då.

 

Men databasen är ett stort mysterium. Självklart har jag skrivrättigheter i till filen. För det går väl bara att ställa in i ISS? Och se till att filen inte är skrivskyddad så klart.

 

Exakt samma SQL-sats fungerar ju i Access... Utan några som helst problem...

 

//Daniel (evell)

 

Länk till kommentar
Dela på andra webbplatser

            OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source=" + Server.MapPath("/db/db1.mdb"));
           string sqlEmptyCart = "DELETE FROM kundvagn WHERE ";
           if (User.Identity.IsAuthenticated)
           {
               sqlEmptyCart += "iKundNr = " + User.Identity.Name + ";";
           }
           else
           {
               sqlEmptyCart += "iSessionId = " + Session.SessionID.ToString() + ";";
           }
           conn.Open();
           OleDbCommand cmd = new OleDbCommand(sqlEmptyCart, conn);
           cmd.ExecuteNonQuery();
           conn.Close();

 

Känns inte som om det är i koden som felet ligger. Men man vet ju aldrig.

 

//Daniel (evell)

 

Länk till kommentar
Dela på andra webbplatser

Du har ett litet dumt sätt att bygga upp koden på. Använd parametrar och skicka in värdet på det sättet. Du kommer att få en säkrare kod och det kommer att fungera då.

 

Länk till kommentar
Dela på andra webbplatser

Har provat det nu men får samma fel

[log]Exception Details: System.Data.OleDb.OleDbException: Det går inte att ta bort data från angivna tabeller.[/log]

 

Koden ser nu ut på följande sätt:

            OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source=" + Server.MapPath("/db/db1.mdb"));
           conn.Open();
           string sqlEmptyCart = "DELETE FROM kundvagn WHERE @id = @idnr;";
           OleDbCommand cmd = new OleDbCommand(sqlEmptyCart, conn);
           if (User.Identity.IsAuthenticated)
           {
               cmd.Parameters.Add("@id", OleDbType.VarChar).Value = "iKundnr";
               cmd.Parameters.Add("@idnr", OleDbType.VarChar).Value = User.Identity.Name;
           }
           else
           {
               cmd.Parameters.Add("@id", OleDbType.VarChar).Value = "iSessionId";
               cmd.Parameters.Add("idnr", OleDbType.VarChar).Value = Session.SessionID.ToString();
           }
           cmd.ExecuteNonQuery();
           conn.Close();

 

Är den fortfarande inte rätt?

 

//daniel !

 

Länk till kommentar
Dela på andra webbplatser

Prova denna kod

 

OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source=" + Server.MapPath("/db/db1.mdb"));
conn.Open();
string sqlEmptyCart = "DELETE FROM kundvagn WHERE @id = @idnr";
OleDbCommand cmd = new OleDbCommand(sqlEmptyCart, conn);
if (User.Identity.IsAuthenticated)
{
cmd.Parameters.Add("@id", OleDbType.VarChar).Value = "iKundnr";
cmd.Parameters.Add("@idnr", OleDbType.VarChar).Value = User.Identity.Name;
}
else
{
cmd.Parameters.Add("@id", OleDbType.VarChar).Value = "iSessionId";
cmd.Parameters.Add("idnr", OleDbType.VarChar).Value = Session.SessionID.ToString();
}
cmd.ExecuteNonQuery();
conn.Close();

 

Länk till kommentar
Dela på andra webbplatser

Inte samma kod, du hade ett semi-kolon för mycket i den andra snutten. Sen hittade jag flera fel. Du anger flera parametrar som du villkorar mot varandra: "DELETE FROM kundvagn WHERE @id = @idnr";

Du ska alltså radera en post där den ena parametern är lika med den andra ;)

Blir lite jobbigt det :)

 

 

OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source=" + Server.MapPath("/db/db1.mdb"));
conn.Open();
string sqlEmptyCart = "DELETE FROM kundvagn WHERE @id = @idnr";
OleDbCommand cmd = new OleDbCommand(sqlEmptyCart, conn);
if (User.Identity.IsAuthenticated)
{
cmd.Parameters.Add("@id", OleDbType.VarChar).Value = "iKundnr";
cmd.Parameters.Add("@idnr", OleDbType.VarChar).Value = User.Identity.Name;
}
else
{
cmd.Parameters.Add("@id", OleDbType.VarChar).Value = "iSessionId";
cmd.Parameters.Add("idnr", OleDbType.VarChar).Value = Session.SessionID.ToString();
}
cmd.ExecuteNonQuery();
conn.Close();

[inlägget ändrat 2005-08-06 20:17:35 av Hasse29]

Länk till kommentar
Dela på andra webbplatser

Okej. Man avslutar SQL-satser med semikolon också ju :P

 

Men som sagt så fungerar det fortfarande inte!

 

//daniel !

 

Länk till kommentar
Dela på andra webbplatser

Har du någon bättre lösning då? Tror du förstår vad jag är ute efter.

 

Om användaren är inloggad så ska man tömma tabellen efter kundnummer, annars efter SessionsId.

 

Eller bör jag spara kundnummer alt. sessionsid i samma kolumn?

 

EDIT: Hittade ett pinsamt fel. iSessionId och iKundnr var av olika typ (text och tal) men det fungerar fortfarande inte när jag har ändrat.

 

//daniel !

 

[inlägget ändrat 2005-08-06 20:27:43 av evil_eye]

Länk till kommentar
Dela på andra webbplatser

Du kan göra villkoret först t.ex.

 

OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source=" + Server.MapPath("/db/db1.mdb"));
conn.Open();
if (User.Identity.IsAuthenticated)
{
string sqlEmptyCart = "DELETE FROM kundvagn WHERE id = @idnr";
OleDbCommand cmd = new OleDbCommand(sqlEmptyCart, conn);

cmd.Parameters.Add("@idnr", OleDbType.VarChar).Value = User.Identity.Name;
}
else
{
string sqlEmptyCart = "DELETE FROM kundvagn WHERE id = @idnr";
OleDbCommand cmd = new OleDbCommand(sqlEmptyCart, conn);

cmd.Parameters.Add("idnr", OleDbType.VarChar).Value = Session.SessionID.ToString();
}
cmd.ExecuteNonQuery();
conn.Close();

 

Du får justera lite själv efter dina variabler, men du kanske förstår min princip :)

 

Det är lördag så koden ovan funkar inte :)

Men justera den och kör efter den principen :)

[inlägget ändrat 2005-08-06 20:31:31 av Hasse29]

Länk till kommentar
Dela på andra webbplatser

Okej. Ska prova det.

 

Som sagt är det lördag så jag tror ja väntar tills imorgon. Eller till på söndag. Eller måndag :P

 

Trevlig helg!

 

[EDIT] Poäng till Hasse för att han försöker :D

 

//daniel !

 

[inlägget ändrat 2005-08-06 22:03:15 av evil_eye]

Länk till kommentar
Dela på andra webbplatser

Nu hittade jag lite energi igen och har nu orkat testa.

 

Min kod ser nu ut såhär:

 

            OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source=" + Server.MapPath("/db/db1.mdb"));
           conn.Open();
           string sqlEmptyCart = "DELETE FROM kundvagn WHERE ";
           OleDbCommand cmd;
           if (User.Identity.IsAuthenticated)
           {
               sqlEmptyCart += "iKundnr = '@kundnr'";
               cmd = new OleDbCommand(sqlEmptyCart, conn);
               cmd.Parameters.Add("@kundnr", OleDbType.VarChar).Value = User.Identity.Name;
           }
           else
           {
               sqlEmptyCart += "iSessionId = '@sessionid'";
               cmd = new OleDbCommand(sqlEmptyCart, conn);
               cmd.Parameters.Add("@sessionid", OleDbType.VarChar).Value = Session.SessionID.ToString();
           }
           cmd.ExecuteNonQuery();
           conn.Close();

 

Fortfarande samma fel. Börjar tro att själv tabellen är skrivskyddad eller ngt. Kan den vara det? :o

 

//daniel !

 

Länk till kommentar
Dela på andra webbplatser

Bort med lite apostrofer :)

 

OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source=" + Server.MapPath("/db/db1.mdb"));
conn.Open();
string sqlEmptyCart = "DELETE FROM kundvagn WHERE ";
OleDbCommand cmd;
if (User.Identity.IsAuthenticated)
{
sqlEmptyCart += "iKundnr = @kundnr";
cmd = new OleDbCommand(sqlEmptyCart, conn);
cmd.Parameters.Add("@kundnr", OleDbType.VarChar).Value = User.Identity.Name;
}
else
{
sqlEmptyCart += "iSessionId = @sessionid";
cmd = new OleDbCommand(sqlEmptyCart, conn);
cmd.Parameters.Add("@sessionid", OleDbType.VarChar).Value = Session.SessionID.ToString();
}
cmd.ExecuteNonQuery();
conn.Close();

 

Länk till kommentar
Dela på andra webbplatser

Eftersom SessionID innehåller bokstäver så måste typen på fältet i databasen vara text. Därför apostroferna är där :)

 

//daniel !

 

Länk till kommentar
Dela på andra webbplatser

Nej, inte när det är en parameter. Prova att lägga upp det så här:

 

if (User.Identity.IsAuthenticated)
{
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source=" + Server.MapPath("/db/db1.mdb"));
OleDbCommand cmd = new OleDbCommand("Delete From kundvagn Where iKundnr=@kundnr", conn);

cmd.Parameters.Add("@kundnr", User.Identity.Name);

conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
else
{
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source=" + Server.MapPath("/db/db1.mdb"));
OleDbCommand cmd = new OleDbCommand("Delete From kundvagn Where iSessionId=@sessionid", conn);

cmd.Parameters.Add("@sessionid", Session.SessionID);

conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}

 

Enkel kod att få överblick över och bort med en del onödiga kommandon :)

 

Länk till kommentar
Dela på andra webbplatser

Fortfarande, läs min kod ovan.

 

Att kundvagnen inte laddas är pga att du inte anropar den funktionen som sköter det, eller så spökar cachen, och då måste du sätta en minimitid på den.

 

Du kan inte använda koden nedan:

 

DELETE * FROM kundvagn WHERE userid = '1'

 

Korrekta koden är:

DELETE FROM kundvagn WHERE userid = '1'

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...