05. april 2005 - 12:31Der er
19 kommentarer og 1 løsning
SELECT og INSERT gir grå hår på hovedet
Hejsa,
Jeg er ved at lave et simpelt statistik-system, der registrerer et side hit og ud fra den pågældende ip-adresse finder ud af om hittet skal registreres i en database.
Databasen som er en access database indeholder et id(autonummer), en dato(dato/klokkeslet), en ip(tekst) og en index(tal).
Min klasse ser ud som følger:
public class Top : System.Web.UI.Page { protected DateTime datoDb; protected DateTime datoNow = DateTime.Now; protected string ip; protected int index; protected DbConnection conn; protected OleDbConnection connection; protected OleDbCommand command;
try { conn = new DbConnection(); connection = conn.OpenConnection();
try { // Find ud af om Ip-adressen findes i DB command = new OleDbCommand(); command.CommandText = "SELECT Top 1 * FROM Statistik WHERE Ip = '" + ip + "' ORDER BY Id DESC"; command.Connection = connection;
OleDbDataReader reader = command.ExecuteReader();
// Ip fandtes allerede if(reader != null) { while(reader.Read()) { datoDb = reader.GetDateTime(0); if(ip.Equals(reader.GetString(2))) Response.Write(ip); } reader.Close();
// Se om der er gået mindst 10 minutter // siden sidste besøg TimeSpan timespan = (datoNow - datoDb);
if(timespan.Minutes > 10) InsertRecord(datoNow, ip, index); } // Ip fandtes ikke - sæt den ind i DB else { InsertRecord(datoNow, ip, index); } } catch(Exception ex) { Response.Write("Problemer med forespørgsel: " + ex.Message); } } catch(OleDbException ex) { Response.Write(ex.Message); } finally { conn.CloseConnection(); } }
#region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); }
/// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.Load += new System.EventHandler(this.Page_Load);
Jeg får nogle forskellige fejlmeddelelser afhængig af om ip allerede eksisterer i databasen, om jeg medtager index og forsøger at indsætte denne, eller om ip ikke eksisterer.
Jeg nåede så langt som til at det virkede hvis ikke den samme ip eksisterede i db og index ikke var med.
Fejlmeddelelserne er herunder:
Hvis ip eksisterer i forvejen:
The data value could not be converted for reasons other than sign mismatch or data overflow. For example, the data was corrupted in the data store but the row was still retrievable.
Hvis ip ikke eksisterer i databasen og index ikke forsøges indsat:
System.Data.OleDb.OleDbException: Handlingen skal bruge en opdaterbar forespørgsel. at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(Int32 hr) at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object&....
Hvis ip ikke eksisterer og index forsøges indsat:
System.Data.OleDb.OleDbException: Der er en syntaksfejl i INSERT INTO-sætningen. at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(Int32 hr) at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object&...
Når der endelig bliver indsat noget, er både ip og dato korrekte nok i databasen, men index kan som sagt ikke indsættes (ud over manuelt).
Jo det siger du jo i toppen:D Jeg tror ikke du skal have klammer rundt om din dato.
Synes godt om
Slettet bruger
05. april 2005 - 14:19#5
Den sætter jo datoen ind uden problemer. Der hvor der er problemer er omkring index, der er en int på siden og et tal i databasen. Jeg har ærlig talt ikke prøvet at have så mange problemer med indsættelse af data før. Gad vide hvad jeg har gjort forkert.
Nogen der kan gennemskue det? Jeg har vidst stirret mig totalt blind på det nu...
Synes godt om
Slettet bruger
05. april 2005 - 14:27#6
Når jeg igen fjerner index fra command.text får jeg en fejl om at der skal bruges en opdaterbar forespørgsel.
System.Data.OleDb.OleDbException: Handlingen skal bruge en opdaterbar forespørgsel. at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(Int32 hr) at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object&
Command ser ud sådan her:
command.CommandText = "INSERT INTO Statistik(Dato, Ip) VALUES('" + datoNow + "', '" + ip + "')"; command.Connection = connection; command.ExecuteNonQuery();
Jeg har selv rodet en del med INSERT i en Access DB og fandt ud af følgende: Insert skal se således ud: INSERT INTO Statistik([Dato], [Ip], [Index]) VALUES('" + datoNow + "', '" + ip + "', " + index + ")"; Der skal nemlig klammer [] på rundt om alle kolonne navne. (Fandt aldrig en forklaring, så det må bare være noget som Access SQL statements kræver)
Fejler din Select?
Synes godt om
Slettet bruger
05. april 2005 - 14:57#8
Hej,
Min select fejlede nogle gange hvis den samme ip-adresse fandtes i databasen?!? Jeg har sat klammer om alle kolonnenavnene, men lige lidt hjælper det. Har forøvrigt aldrig brugt det før og det har da altid virket.
Jeg får den fejl om at der skal bruges en opdaterbar forespørgsel. Er der noget i min command der er forkert? skal man ikke bruge command.ExecuteNonQuery();?
Synes godt om
Slettet bruger
05. april 2005 - 14:59#9
Jeg har forsøgt at udskrive typen for mine værdier i metoden InsertRecord() og de passer alle sammen med det forventede - altså DateTime, string og int.
Mange gange når man redigerer i en accessdatabase og den kommer med den fejl, er det fordi du skal give rettigheder i den mappe databasen ligger i. Höjreklik på mappen, der skal du finde rettigheder under egenskaber(tror jeg) og give IUSR_maskinenavn rettigheder.
www.jakub.dk, du har ikke mindre end reddet min dag. Takker for det :-) En gang imellem kan man stirre sig blind på helheden så man mister overblikket over de små detaljer. Jeg troede selv jeg havde testet alle mulige kilder til fejl, men desværre fik jeg ikke testet denne og fik derfor et par ekstra grå hår på toppen af hovedet.
Det virker fint hvis jeg eks,s. kalder det SideIndex i DB, så hvis du ligger et svar får du fluks point for din hjælp.
Mange tak til alle der har bidraget med forslag til tråden!
Synes godt om
Slettet bruger
16. oktober 2007 - 16:48#20
closed
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.