Avatar billede webcreator Nybegynder
12. maj 2005 - 15:29 Der er 25 kommentarer og
1 løsning

MySQL Kald giver fejl

Hej Eksperter.

string dml = "SELECT timestamp, navn, alder FROM " + myTable + " WHERE (timestamp BETWEEN " + start + " AND " + slut + ")";

Ovenstående SQL kald giver problemer, hvilket jeg ikke forstår. myTable er en string med navnet på tabellen - 'start' og 'slut' er af typen DateTime.

Nogen af jer derude, der kan se fejlen ?
Avatar billede ldanielsen Nybegynder
12. maj 2005 - 15:31 #1
Ja, tænk på at du jo laver en streng, og datoerne kommer til at indgå som strenge, så der skal være anførselstegn omkring, og de skal være formateret så MySql kan forstå dem
Avatar billede arne_v Ekspert
12. maj 2005 - 15:31 #2
sandsyneligvis er det dato tid formatering som driller dig ddmmyyyy versus
mmddyyyy eller skal det i '' eller i ## eller ...

universal løsning : brug parameters
Avatar billede ldanielsen Nybegynder
12. maj 2005 - 15:32 #3
Jeg ved ikke hvilke anførselstegn der skal bruges i MySql, i MSSQL vil det være ', og i Access vil det være #
Avatar billede ldanielsen Nybegynder
12. maj 2005 - 15:33 #4
7 sekunder :o)
Avatar billede arne_v Ekspert
12. maj 2005 - 15:33 #5
eksempel:

using System;
using System.Threading;
using ByteFX.Data.MySqlClient;

class MainClass
{
    public static void Main(string[] args)
    {
        MySqlConnection con = new MySqlConnection("Database=Test;Data Source=localhost;User Id=;Password=");
        con.Open();
        MySqlCommand cre = new MySqlCommand("CREATE TABLE dtest (i INTEGER PRIMARY KEY, d DATETIME)", con);
        cre.ExecuteNonQuery();
        MySqlCommand ins = new MySqlCommand("INSERT INTO dtest VALUES (@i, @d)", con);
        ins.Parameters.Add("@i", MySqlDbType.Int);
        ins.Parameters.Add("@d", MySqlDbType.Datetime);
        for(int i = 0; i < 10; i++)
        {
            ins.Parameters["@i"].Value = i;
            ins.Parameters["@d"].Value = DateTime.Now;
            Thread.Sleep(1000);
            ins.ExecuteNonQuery();
        }
        MySqlCommand sel = new MySqlCommand("SELECT * FROM dtest", con);
        MySqlDataReader rdr = sel.ExecuteReader();
        while(rdr.Read())
        {
            int i = (int)rdr[0];
            DateTime d = (DateTime)rdr[1];
            Console.WriteLine(i + " " + d);
        }
        rdr.Close();
        MySqlCommand drp = new MySqlCommand("DROP TABLE dtest", con);
        drp.ExecuteNonQuery();
        con.Close();
    }
}
Avatar billede nielle Nybegynder
12. maj 2005 - 15:33 #6
"SELECT timestamp, navn, alder FROM " + myTable + " WHERE timestamp BETWEEN " + start + " AND " + slut;
Avatar billede nielle Nybegynder
12. maj 2005 - 15:35 #7
Jeg har bare fjernet dine parenteser.
Avatar billede webcreator Nybegynder
12. maj 2005 - 15:36 #8
Ah, jeg har faktisk brugt danske formateringer. Det havde jeg rent overset. Troede at det som standard var på formen YYYY-MM-DD H:i:s - mange tak. Jeg tjekker lige, om det mon kunne være fejlen.
Avatar billede ldanielsen Nybegynder
12. maj 2005 - 15:39 #9
Du skal stadig enten bruge anførselstegn, eller arne_v's fornemme parameter løsning, der gør at din engine ordner det hele, både format og anførselstegn.

I sidste ende "ser" databasen alligevel kun en streng, sådan er det med SQL og databaser
Avatar billede arne_v Ekspert
12. maj 2005 - 15:49 #10
nielle>

() burde være valide i SQL
Avatar billede webcreator Nybegynder
12. maj 2005 - 15:52 #11
Hvad er det for nogle parametre i hentyder til? Og hvordan skal jeg bruge anførselstegnene? Vil variablen ikke blive betragtet som en string, hvis jeg quoter den ?
Avatar billede nielle Nybegynder
12. maj 2005 - 15:54 #12
Burde være... men MySQL har nu ikke altid været lige glad for dem. Og de er under alle omstændigheder lidt malplaceret i netop det der meget simple SQL-kald.

Men jeg tror nu mere på at du har fat i den rigtige ende.
Avatar billede nielle Nybegynder
12. maj 2005 - 15:56 #13
webcreator> Parenteserne i del-udtrykket:

... " WHERE (timestamp BETWEEN " + start + " AND " + slut + ")";

Men bare glem det ... jeg tror ikke så meget mere på at det ændre noget at fjerne dem.
Avatar billede webcreator Nybegynder
12. maj 2005 - 15:57 #14
Oh, fik lige læst koden ordentligt. Virker ret besværligt. Så vil jeg hellere manuelt konvertere tidsformatet.
Avatar billede arne_v Ekspert
12. maj 2005 - 15:57 #15
Ideen er at du bruger:

"SELECT timestamp, navn, alder FROM " + myTable + " WHERE (timestamp BETWEEN @start AND @slut)";

og så putter biinære værdier idn for @start og @slut
Avatar billede nielle Nybegynder
12. maj 2005 - 15:57 #16
Undfskyld - det er sent på dage og jeg kan ikek læse. "Parmetre" og "parenteser" er ikke det samme ord. :^|
Avatar billede webcreator Nybegynder
12. maj 2005 - 15:57 #17
Jo, hvis jeg fjerner WHERE-delen, så virker det fint - eller hvis jeg manuelt skriver en DateTime i korrekt format. Så virker det også korrekt.
Avatar billede webcreator Nybegynder
12. maj 2005 - 15:58 #18
Ahh :)
Avatar billede arne_v Ekspert
12. maj 2005 - 15:59 #19
man skal lige vende sig til at bruge parameters og hvis du er meget nystartet
så skal du måske vente

men det er det som man bruger i virkeligheden ikke kun p.g.a. tidsformater men
også fordi det håndterer strenge med ' og dermed også indeholder beskyttelse mod
SQL injection
Avatar billede webcreator Nybegynder
12. maj 2005 - 16:02 #20
Ok. Men ja, jeg er lidt grøn i det endnu :)
Hvordan kan problemet ellers løses? Skal jeg hen og laver en parser, som opbygger en streng med det korrekte tidsformat?
Avatar billede arne_v Ekspert
12. maj 2005 - 16:04 #21
Hvis du kalder ToString på en System.DateTime så kan du angive formatet som argumnt
Avatar billede webcreator Nybegynder
12. maj 2005 - 16:06 #22
Ah ja, det er da rigtigt. Havde jeg rent glemt. Mange tak for hjælpen :)
Avatar billede webcreator Nybegynder
12. maj 2005 - 16:27 #23
Svartid :)
Avatar billede webcreator Nybegynder
12. maj 2005 - 18:50 #24
Arne > Det var dig jeg gerne ville bede om et svar fra.
- Men også tak til jer andre :)
Avatar billede arne_v Ekspert
12. maj 2005 - 18:51 #25
ok
Avatar billede webcreator Nybegynder
12. maj 2005 - 20:39 #26
Tak for det :)
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