Avatar billede Slettet bruger
05. april 2005 - 12:31 Der 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;
       
        // **************************************
        // Page_Load()
        // **************************************
        private void Page_Load(object sender, System.EventArgs e)
        {
            // Globale variable sættes
            ip = Request.ServerVariables["REMOTE_ADDR"];
            //ip = "212.242.110.197";
            index = Convert.ToInt32(Request.QueryString["Index"]);

            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);

        }
        #endregion

        // **************************************
        // InsertRecord()
        // **************************************
        private void InsertRecord(DateTime datoNow, string ip, int index)
        {
            this.datoNow = datoNow;
            this.ip = ip;
            this.index = index;
           
            try
            {
                command.CommandText = "INSERT INTO Statistik(Dato, Ip, Index) VALUES('" + datoNow + "', '" + ip + "', " + index + ")";
                command.Connection = connection;
                command.ExecuteNonQuery();
            }
            catch(Exception ex)
            {
                Response.Write("Problemer med indsættelse: " + ex.ToString());
            }
        }
    }

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).

Håber på hjælp!
Avatar billede medions Nybegynder
05. april 2005 - 12:49 #1
Den her:
command.CommandText = "INSERT INTO Statistik(Dato, Ip, Index) VALUES('" + datoNow + "', '" + ip + "', " + index + ")";


Skal se sådan her ud:
command.CommandText = "INSERT INTO Statistik(Dato, Ip, [Index]) VALUES
('" + datoNow + "', '" + ip + "', " + index + ")";
Avatar billede Slettet bruger
05. april 2005 - 13:07 #2
Virker ikke meget bedre.
Må jeg spørge hvorfor index egentlig skal i klammer?
Avatar billede segato Nybegynder
05. april 2005 - 13:15 #3
Må vi se dine tabeller. Ved jo ik om det er strenge det hele PRIMARY keys osv.
Avatar billede segato Nybegynder
05. april 2005 - 13:16 #4
Jo det siger du jo i toppen:D Jeg tror ikke du skal have klammer rundt om din dato.
Avatar billede 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...
Avatar billede 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();
Avatar billede www.jakub.dk Nybegynder
05. april 2005 - 14:46 #7
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?
Avatar billede 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();?
Avatar billede 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.

Jeg fatter ikke en klaphat :-)
Avatar billede michael_stim Ekspert
05. april 2005 - 15:07 #10
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.
Avatar billede michael_stim Ekspert
05. april 2005 - 15:11 #11
Egenskaber->sikkerhed og så give rettigheder. (Sådan var det ;o))
Avatar billede Slettet bruger
05. april 2005 - 15:16 #12
Ok, tak for input. Jeg havde kun givet de nødvendige rettigheder på selve databasen, der ligger i en undermappe til selve hjemmemappen.

Dog virker det stadig ikke :-(
Avatar billede Slettet bruger
05. april 2005 - 15:42 #13
Det her virker:

command.CommandText = "INSERT INTO Statistik(Dato, Ip) VALUES('05-04-2005 15:39:00', '127.0.0.1')";
                command.Connection = connection;
                command.ExecuteNonQuery();

Det her virker ikke?!?

command.CommandText = "INSERT INTO Statistik(Dato, Ip, Index) VALUES('05-04-2005 15:39:00', '127.0.0.1', 15)";
                command.Connection = connection;
                command.ExecuteNonQuery();
Avatar billede www.jakub.dk Nybegynder
05. april 2005 - 16:54 #14
Hvilken datatype er Index?
Avatar billede Slettet bruger
05. april 2005 - 17:32 #15
Int og tal i databasen (Access)
Avatar billede www.jakub.dk Nybegynder
05. april 2005 - 17:34 #16
Kan det være fordi Index er et reserveret ord. Prøv at ændre navnet til noget andet og så prøv.
Avatar billede michael_stim Ekspert
05. april 2005 - 19:11 #17
Avatar billede www.jakub.dk Nybegynder
05. april 2005 - 22:52 #18
Måske ikke i selve SQL, men måske i Access
Avatar billede Slettet bruger
06. april 2005 - 12:11 #19
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!
Avatar billede Slettet bruger
16. oktober 2007 - 16:48 #20
closed
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester