Avatar billede adagio Nybegynder
08. maj 2003 - 10:12 Der er 33 kommentarer og
1 løsning

SQL og dato

Jeg har et stort problem, med mit java-program... Når jeg gemmer en dato i databasen, ændrer den dato'en...

Når jeg gemmer, udskriver den SQL sætningen, som sådan:

INSERT INTO UgeMenu (UgeRetID, RetNavn, Pris) SELECT 30-5-2003 , 'ft' , 350

Men i databasen skrives ovenstående dato, som dette:
31-07-1894

Men hvorfor?
Avatar billede disky Nybegynder
08. maj 2003 - 10:17 #1
prøv med:

INSERT INTO UgeMenu (UgeRetID, RetNavn, Pris) VALUES('30-5-2003' , 'ft' , 350)
Avatar billede adagio Nybegynder
08. maj 2003 - 10:19 #2
Fik det til at virke selv... skulle bare skrive ## mellem dato'en...
Har ikke prøvet din endnu, men du skal nok få pointene, som tak alligevel :o)
Avatar billede adagio Nybegynder
08. maj 2003 - 10:19 #3
Dog holder jeg lige spg åbent lidt endnu, just in case...
Avatar billede disky Nybegynder
08. maj 2003 - 10:22 #4
Nul problemo :)
Avatar billede adagio Nybegynder
08. maj 2003 - 10:23 #5
Lige et hurtigt extra spg, hvis du ikke har noget imod det...

Når jeg skriver i SQL, dato'en 10-1-2003, så laver den det om til 01-10-2003... men hvorfor det?
Avatar billede disky Nybegynder
08. maj 2003 - 10:29 #6
Det afhænger af hvordan databasen gemmer datoen, med hensyn til rækkefølgen af dag-måned-år, amerikanerne har det med at ville havde måneden først.
Avatar billede adagio Nybegynder
08. maj 2003 - 10:32 #7
Når jeg kigger på dato'en, så skriver den short date: 16-06-1994
Går man ud fra det, så tager den vel dagen først, derefter måned...
Avatar billede arne_v Ekspert
08. maj 2003 - 10:32 #8
Jeg vil nok anbefale:

til database
-------------

PreparedStatement
SimpleDateFormat parse
setDate

fra database
------------

getDate
SimpleDateFormat format

så har man styr på hvordan de bliver vendt.
Avatar billede adagio Nybegynder
08. maj 2003 - 10:36 #9
Det til database forstår jeg ikke lige, hvad du mener!?!
Avatar billede arne_v Ekspert
08. maj 2003 - 10:39 #10
til = INSERT
fra = SELECT

Pointen er at ved at gøre det på den måde kan du bruge
dit format uden at bekymre dig om opsætning af database/Windows/java.
Avatar billede disky Nybegynder
08. maj 2003 - 10:40 #11
Du kan bruge SimpleDateFormat til at konverertere til og fra det format SQL vil havde datoen i.
Og du kan også anvende et PreparedStatement hvis du ønsker dette.
Avatar billede adagio Nybegynder
08. maj 2003 - 10:42 #12
Arne >> Det er også på den måde jeg gør, som du kan se i min SQl sætning

Disky >> Hvordan bruger man SimpleDateFormat?
Avatar billede arne_v Ekspert
08. maj 2003 - 10:51 #13
adg>

Øh. Din SQL INSERT ligner ikke en PreparedStatement.
Avatar billede adagio Nybegynder
08. maj 2003 - 10:57 #14
Jeg sagde også først at jeg ikke vidste hvad du snakkede om, men så sagde du at det bare var INSERT, så regnede jeg med at det var det du snakker om... jeg har ingen anelse om hvad en PreparedStatement er...
Avatar billede arne_v Ekspert
08. maj 2003 - 11:01 #15
Date d;
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO tabel VALUES(?,?,?)");
pstmt.setInt(1,123);
pstmt.setString(2,"ABC");
pstmt.setDate(3,d);
pstmt.executeUpdate();
Avatar billede arne_v Ekspert
08. maj 2003 - 11:01 #16
Så det er en INSERT men alligevel anderledes.
Avatar billede adagio Nybegynder
08. maj 2003 - 11:16 #17
Jeg forstår ikke lige parametrene...
Avatar billede arne_v Ekspert
08. maj 2003 - 11:28 #18
Ovenstående kode svarer til:

Statement stmt = conn.createStatement();
stmt.executeUpdate("INSERT INTO tabel VALUES (123,'ABC','hvad nu datoen er')");

Pointen er at Date er et binært objekt og at man derfor ikke har
problemet med syntaxen af en dato som tekst.
Avatar billede adagio Nybegynder
08. maj 2003 - 11:35 #19
Problemet er at jeg har prøvet at skrive SQL sætningen på 2 forskellige måder:

1) Hvor dato'en er en date
2) Hvor dato'en er en String

De gør ingen forskel...
Avatar billede arne_v Ekspert
08. maj 2003 - 11:49 #20
Ja. Men der er stor forskel på PreparedStatement og Statement
i den her henseende !
Avatar billede adagio Nybegynder
08. maj 2003 - 11:50 #21
Ok...
Avatar billede adagio Nybegynder
08. maj 2003 - 11:52 #22
Men hvad skal der stå i (?) i denne linje:

Date d;
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO tabel VALUES(?,?,?)");
Avatar billede arne_v Ekspert
08. maj 2003 - 11:54 #23
Der skal stå ?.

Når du så kalder setXxx(1,noget) så bliver noget sat
ind for det første spørgsmåls tegn. setXxx(2, noget)
sætter ind for det andet spørgsmålstegn.

Lidt samme princip som getXxx for ResultSet.
Avatar billede arne_v Ekspert
08. maj 2003 - 13:01 #24
Et mere komplet eksempel:

import java.sql.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

public class PrepDemo {
    public static void main(String[] args) throws Exception {
        DateFormat df = new SimpleDateFormat("dd-MM-yyyy");
        Date d = new Date(df.parse("08-05-2003").getTime());
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        Connection con =
            DriverManager.getConnection("jdbc:odbc:xxxx", "", "");
        PreparedStatement pstmt =
            con.prepareStatement("INSERT INTO tabel VALUES(?,?,?)");
        pstmt.setInt(1, 123);
        pstmt.setString(2, "ABC");
        pstmt.setDate(3, d);
        pstmt.executeUpdate();
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT * FROM tabel");
        while (rs.next()) {
            int iv = rs.getInt(1);
            String sv = rs.getString(2);
            Date dv = rs.getDate(3);
            String dvs = df.format(dv);
            System.out.println(iv + " " + dv + " " + dvs);
        }

    }
}
Avatar billede adagio Nybegynder
08. maj 2003 - 13:39 #25
System.out.println("Foerst");
PreparedStatement pstmt = con.prepareStatement("INSERT INTO UgeMenu VALUES(?,?,?)");
System.out.println("1");

Når jeg kører denne kode, så skrive den "Foerst", men ikke "1"
Avatar billede arne_v Ekspert
08. maj 2003 - 13:45 #26
Prøv og udskriv exception i din catch - det vil nok forklare hvad der sker.
Avatar billede adagio Nybegynder
08. maj 2003 - 14:17 #27
Den udskriver en nullPointerException...
Avatar billede arne_v Ekspert
08. maj 2003 - 16:09 #28
Det lyder som om con ikke er blevet korrekt initialseret.

Check om con bliver korrekt initialiseret.

(du skal selvfølgelig bruge andre argumenter til getConnection end i
mit eksempel)
Avatar billede adagio Nybegynder
09. maj 2003 - 09:17 #29
Du har ret, jeg manglede at initialisere con... nu kører den uden at sige fejl, men tilgengæld gemmer den ikke noget i databasen...

Her er min version af koden:

public static void preparedStatement(Vector v) throws Exception
{
DateFormat df = new SimpleDateFormat("dd-MM-yyyy");
Date d = new Date(df.parse("08-06-2003").getTime());
System.out.println("Foerst");
PreparedStatement pstmt = con.prepareStatement("INSERT INTO UgeMenu VALUES(?,?,?)");
System.out.println("1");
pstmt.setString(1,"Ost");
System.out.println("2");
pstmt.setDate(2,d);
System.out.println("3");
pstmt.setInt(3,50);
System.out.println("4");
pstmt.executeUpdate();
System.out.println("Efter");
}

Og den skriver alle System.out.println's
Avatar billede arne_v Ekspert
09. maj 2003 - 09:52 #30
Også "Efter" ?

Mystisk. Enten burde den INSERT'e eller throwe en exception.
Avatar billede adagio Nybegynder
09. maj 2003 - 10:07 #31
Jeps... den udskriver alt...

Men jeg fandt en nødløsning til problemet, som måske kunne give problemer senere... Når den gemmer, så vælger jeg bare at bytte rundt på måned og dag, i SQL sætningen...
Så det virker nu, men holder lige spg åbent lidt endnu...
Avatar billede -mundi- Nybegynder
09. maj 2003 - 10:10 #32
sql tror altid at datoer er mm-dd-yyyy , de kan godt vises forskelligt i databasen alt efter hvilket format man vælger i databasen. Men ved input altid mm-dd-yyyy
Avatar billede arne_v Ekspert
09. maj 2003 - 10:15 #33
Med PreparedStatement og setDate har man slet ikke problemet.

Jeg undrer mig lidt over det sidste problem.

Hvad returnerer pstmt.executeUpdate ?

(den returnerer det antal rækker der er indsat)
Avatar billede adagio Nybegynder
26. maj 2003 - 12:20 #34
Hmm... jeg har åbenbart ikke fået noget brev, om at der var kommet mere kommentarer til spg... Det er dog lidt sent nu, eftersom at projektet skulle afleveres i sidste uge.

Jeg kommer nok ikke til at abejde med dette forløbigt, så jeg kommer ikke lige til at se om jeg kan få det til at virke.

Skal jeg så bare give pointene til Arne og sig tak for svar?
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
Kurser inden for grundlæggende programmering

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