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?
Annonceindlæg fra Academic Work Denmark A/S
prøv med: INSERT INTO UgeMenu (UgeRetID, RetNavn, Pris) VALUES('30-5-2003' , 'ft' , 350)
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)
Dog holder jeg lige spg åbent lidt endnu, just in case...
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?
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.
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...
Jeg vil nok anbefale: til database ------------- PreparedStatement SimpleDateFormat parse setDate fra database ------------ getDate SimpleDateFormat format så har man styr på hvordan de bliver vendt.
Det til database forstår jeg ikke lige, hvad du mener!?!
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.
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.
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?
adg> Øh. Din SQL INSERT ligner ikke en PreparedStatement.
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...
Date d; PreparedStatement pstmt = conn.prepareStatement("INSERT INTO tabel VALUES(?,?,?)"); pstmt.setInt(1,123); pstmt.setString(2,"ABC"); pstmt.setDate(3,d); pstmt.executeUpdate();
Så det er en INSERT men alligevel anderledes.
Jeg forstår ikke lige parametrene...
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.
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...
Ja. Men der er stor forskel på PreparedStatement og Statement i den her henseende !
Men hvad skal der stå i (?) i denne linje: Date d; PreparedStatement pstmt = conn.prepareStatement("INSERT INTO tabel VALUES(?,?,?)");
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.
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); } } }
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"
Prøv og udskriv exception i din catch - det vil nok forklare hvad der sker.
Den udskriver en nullPointerException...
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)
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
Også "Efter" ? Mystisk. Enten burde den INSERT'e eller throwe en exception.
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...
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
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)
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?
Kurser inden for grundlæggende programmering