Avatar billede trp79 Nybegynder
19. august 2003 - 10:25 Der er 26 kommentarer og
2 løsninger

indsætte dato i mysql db

Hejsa,
når jeg smider data i min db gør jeg det fx som følgende:

for(int j=0;j<budgetListe.size();j++){
tempBudget = (Budget)budgetListe.get(j);
String d = "INSERT INTO Budget (Bruger, Aar, Budget, Oprettet, Uploaded, Firma) " + "VALUES ('"+bruger+"', '"+tempBudget.getAar()+"', '"+tempBudget.getBudget()+"', '"+tempBudget.getOprettet()+"', '"+df.format(date)+"', '"+tempBudget.getFirma()+"')";

  db.doUpdate(d);
}

1#
men hvordan indstiller jeg datatypen i mysql db'en til at tage imod DateFormat df = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss")? Jeg vil gerne have at datatypen er det eller noget i den stil og ikke varchar.

2#
Hvordan læser jeg denne datatype tilbage i en string efterfølgende?
Avatar billede trp79 Nybegynder
19. august 2003 - 10:29 #1
Jeg bruger MySQL control Center 0.9.2 beta til at styre min db.
Avatar billede jakoba Nybegynder
19. august 2003 - 10:35 #2
Jeg vil anbefale at du laver datatypen til datetime. det er mysql's egen datatype og der er masser af funktioner til at handtere sådanne dates; regne på dem, og udtrække den i det format du ønsker.

http://www.mysql.com/doc/en/Date_and_time_types.html

mvh JakobA
Avatar billede trp79 Nybegynder
19. august 2003 - 10:40 #3
Men hvordan indsætter jeg en tid fra java til den? Det er vigtigt for mig at det er præcis det samme tidspunkt der bliver skrevet for samtlige gennemløbninger af forløkke.
Avatar billede arne_v Ekspert
19. august 2003 - 10:50 #4
Brug PreparedStatement !

Og:
  pstmt.setDate(4, new java.sql.Date((new java.util.Date()).getTime()));
Avatar billede jakoba Nybegynder
19. august 2003 - 10:53 #5
Du giver den tiden som en streng, mysql er rimeligt god til selv at gætte hvilket format du har valgt og så 'oversætte' korrekt. det er beskrevet i undersiderne til ovenstående link.

til beregninger eller udtræk på datoer er der så: http://www.mysql.com/doc/en/Date_and_time_functions.html

du kan udtrække diverse komponenter (dag, år, minut) i datoen separat eller samlet og formattere dem efter behag i en streng.
Avatar billede arne_v Ekspert
19. august 2003 - 10:57 #6
Men man gør sig lidt afhængig af MySQL så.

Med en PreparedStatement og setDate så er man totalt uafhængig af
database, da setDate er implementeret af den enkelte JDBC driver.

Og udover tids problemet så løser PreparedStatement også problemet med
quotes i strenge.
Avatar billede trp79 Nybegynder
19. august 2003 - 11:01 #7
Jeg har aldrig arbejded med prepared statement før, så jeg har ikke den fjerneste anelse om, hvordan jeg skal flette det ind i koden. Men jeg prøver lige om det her funker:
PreparedStatement pstmt;
pstmt.setDate(4, new java.sql.Date((new java.util.Date()).getTime()));

for(int j=0;j<budgetListe.size();j++){
tempBudget = (Budget)budgetListe.get(j);
String d = "INSERT INTO Budget (Bruger, Aar, Budget, Oprettet, Uploaded, Firma) " + "VALUES ('"+bruger+"', '"+tempBudget.getAar()+"', '"+tempBudget.getBudget()+"', '"+tempBudget.getOprettet()+"', pstmt, '"+tempBudget.getFirma()+"')";

  db.doUpdate(d);
}
Avatar billede jakoba Nybegynder
19. august 2003 - 11:03 #8
Det har du ret i arne. man binder sig til mysql.
Men er man ikke ret sikker på at binde sig alligevel; jeg synes der er lovlig langt imellem de virkelig ANSI compatible SQL'er.

mvh JakobA
Avatar billede arne_v Ekspert
19. august 2003 - 11:08 #9
PreparedStatement er lidt anderledes.

Det skal være noget a la:

PreparterStatement pstmt = con.prepareStatement("INSERT INTO Budget (Bruger, Aar, Budget, Oprettet, Uploaded, Firma) VALUES (?,?,?,?,?,?)");

...

pstmt.setString(1, bruger);
...
pstmt.setDate(5, new java.sql.Date(date.getTime());
pstmt.setString(6, tempBudget.getFirma());
pstmt.executeUpdate();
Avatar billede arne_v Ekspert
19. august 2003 - 11:18 #10
Man preparer sin SQL sætning med ? for værdierne og så erstatter
man ? med en værdi med en set metode og når alle værdier
er sat kalder man executeUpdate.

Hvis den samme sqætning skal udføres mange gange performer det bedre.

Man slipper for problemer med quotes i strenge.

Man slipper for problemer med dato formater.

Kort sagt: anbefalelses værdigt.
Avatar billede trp79 Nybegynder
19. august 2003 - 11:29 #11
Det lyder jo godt! :o) Men det er vel stadigvæk smart at forberede sin preparedStatement og så tildele den værdi i forløkken, så den ikke skal oprettes hver gang?
Altså
PreparterStatement pstmt;

for(int j=0;j<budgetListe.size();j++){
tempBudget = (Budget)budgetListe.get(j);
pstmt = con.prepareStatement("INSERT INTO Budget (Bruger, Aar, Budget, Oprettet, Uploaded, Firma) VALUES (?,?,?,?,?,?)");
pstmt.setString(1, bruger);
pstmt.setString(2, tempBudget.getAar());
pstmt.setString(3, tempBudget.getBudget());
pstmt.setString(4, tempBudget.getOprettet());
pstmt.setDate(5, new java.sql.Date(date.getTime());
pstmt.setString(6, tempBudget.getFirma());
pstmt.executeUpdate();
}

Hov, men det holder jo stadigvæk ikke. Så bliver det jo en ny tid for hvert gennemløb. Det var jo ikke meningen. Alle elemter i budgetListe skal skrives ind med samme tid, hvordan kommer jeg udover det?
Avatar billede arne_v Ekspert
19. august 2003 - 11:34 #12
Flyt:

pstmt = con.prepareStatement("INSERT INTO Budget (Bruger, Aar, Budget, Oprettet, Uploaded, Firma) VALUES (?,?,?,?,?,?)");

udenfor for-løkken.
Avatar billede arne_v Ekspert
19. august 2003 - 11:35 #13
Hvis

Date date = new Date();

ligger udenfor for-løkken så får de alle samme tid.

[bemærk at jeg ændrede lidt i forhold til det oprindelige forslag, hvor
jeg satte "nu" ind]
Avatar billede trp79 Nybegynder
19. august 2003 - 12:21 #14
Jeg har nu fået sat det ind, men jeg får en fejl på preparedStatement.setDate :(

Error(103,10): method setDate(int, java.util.Date) not found in interface java.sql.PreparedStatement

Hvad kan det skyldes?
Avatar billede arne_v Ekspert
19. august 2003 - 12:28 #15
SUN har lavet en lille bøf.

Der er en java.util.Date og en java.sql.Date !

pstmt.setDate(5, new java.sql.Date(date.getTime());

omformer en java.util.Date til en java.sql.Date ...
Avatar billede trp79 Nybegynder
19. august 2003 - 12:30 #16
arh... jeg skal lige have noget med sql date....
Avatar billede trp79 Nybegynder
19. august 2003 - 13:01 #17
Når man nu gør det på den her måde, hvilken datatype skal man så vælge i databasen? datetime eller hvad ville du vælge? jeg får nemlig ikke nogen tid når jeg vælger den blot 2003-08-19 00:00:00
Men det er vel date.getTime() der bestemmer det?
Avatar billede arne_v Ekspert
19. august 2003 - 13:21 #18
Det lyder som dit felt er af typen DATE.

DATETIME må være helt fin.
Avatar billede trp79 Nybegynder
19. august 2003 - 22:41 #19
Nu har jeg knoklet og knoklet med det, men den vil altså stadig kun datoen, dvs. tidspunket kommer på som 00:00:00 (fx 2003-08-19 00:00:00),selvom jeg har DATETIME som datatype.
Jeg laver:

date = new java.util.Date();
...
psOms.setDate(5, new java.sql.Date((date).getTime()));


Er der iøvrigt en begrænsning på hvor lang en preparedstatement må være? Jeg synes det begynder at drille når jeg når op på 10 values :(
Avatar billede arne_v Ekspert
19. august 2003 - 22:46 #20
Du har ret.

Jeg har lige næræst dokumentationen.

To conform with the definition of SQL DATE, the millisecond values wrapped by a java.sql.Date instance must be 'normalized' by setting the hours, minutes, seconds, and milliseconds to zero in the particular time zone with which the instance is associated.
Avatar billede arne_v Ekspert
19. august 2003 - 22:47 #21
Jeg overvejer lige hvordan det kan løses.

Nej der burde ikke være nogen begrænsning på antal værdier.
Avatar billede arne_v Ekspert
19. august 2003 - 22:51 #22
Prøv med:

date = new java.util.Date();
...
psOms.setTimestamp(5, new Timestamp(date.getTime()));
Avatar billede arne_v Ekspert
19. august 2003 - 22:53 #23
Andre har iøvrigt haft problemet.

Se f.eks.:

http://dbforums.com/arch/174/2003/6/830918
Avatar billede trp79 Nybegynder
19. august 2003 - 23:17 #24
Forrygende Arne! Så funker det jo! Endda selvom datatypen stadig er DATETIME, den kan åbenbart selv finde ud af at konverterer fra timestamp til datetime :o)
Mange tak for hjælpen!
Jeg har smidt lidt extra points i puljen...

Jeg bøvler dog stadig lidt med med den med de mange values i... jeg får hele tiden fejlen:
java.sql.SQLException: Syntax error or access violation,  message from server: "You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near ') VALUES ('tope01ab','Karens Kaffebiks','','','','http://','','"

selvom jeg har løbet koden igennem bogstav for bogstav... men jeg må jo have lavet en åndsvag fejl! Det ser jo ud somom, at der mangler en ' ifl. fejlen. Men faktisk ser det sådan her ud:

psFirma = con.prepareStatement("INSERT INTO Firma (Bruger, Navn, Adresse1, Adresse2, Adresse3, Hjemmeside, Land, Tlf, Fax, Email, Noter, Uploaded, Oprettet)) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)");

Så jeg kan ikke få det til at hænge helt sammen.. :(
Avatar billede arne_v Ekspert
19. august 2003 - 23:24 #25
Jeg synes også at der er 13 begge steder.

Men stemmer data typerne også ?
Avatar billede trp79 Nybegynder
19. august 2003 - 23:36 #26
Ja alle datatyper er sat til varchar med undtagelse af "uploaded". Min kode ser således ud:

      try{
          psFirma = con.prepareStatement("INSERT INTO Firma (Bruger, Navn, Adresse1, Adresse2, Adresse3, Hjemmeside, Land, Tlf, Fax, Email, Noter, Uploaded, Oprettet)) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)");
      }
      catch(Exception e){System.out.println("Fejl ved initialisering af preparedstatement(psFirma) i Database.java "+e);}

            for(int j=0;j<firmaListe.size();j++)
            {
                tempFirma = (Firma)firmaListe.get(j);
        try{
          psFirma.setString(1, bruger);
          psFirma.setString(2, tempFirma.getNavn());
          psFirma.setString(3, tempFirma.getAdresse1());
          psFirma.setString(4, tempFirma.getAdresse2());
          psFirma.setString(5, tempFirma.getAdresse3());
          psFirma.setString(6, tempFirma.getBy());
          psFirma.setString(7, tempFirma.getLand());
          psFirma.setString(8, tempFirma.getTlf());
          psFirma.setString(9, tempFirma.getFax());
          psFirma.setString(10, tempFirma.getEmail());
          psFirma.setString(11, tempFirma.getNoter());
          psFirma.setTimestamp(12, new Timestamp(date.getTime()));
          psFirma.setString(13, tempFirma.getOprettet());
          psFirma.executeUpdate();
        }
        catch(Exception e){System.out.println("Fejl ved preparedstatement(psFirma).setstring eller preparedstatement.executeUpdate i Database.java "+e);}
        }

Har jeg bare stirret mig total blind?
Avatar billede arne_v Ekspert
19. august 2003 - 23:43 #27
Er der ikke en parentes for meget efter oprettet ?
Avatar billede trp79 Nybegynder
20. august 2003 - 08:26 #28
Jo! Du har atter ret :o)
Mange tak for al hjælpen Arne, det var jo helt forrygende!

JakobA får også lige et par points, for haans interesse og hans links.

Mvh
Torben
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