Avatar billede semso Nybegynder
19. februar 2008 - 19:53 Der er 15 kommentarer og
1 løsning

opdatering af Dato til Access db Java

Hej,
Jeg har forsøgt at opdatere flere felter i Access db, det lykkedes for de fleste men ikke med feltet af type "Date". Ved konvertering af Dato som:
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        df.format(sms.getTimeStamp());

-sms.getTimestamp() returnere en Date objekt.

får jeg en Dato format som feks: 2008-02-19 og det er også mening,men senere hen kan jeg ikke gemme den i en tabel i Acces db.

ved setningen:
stmt = con.createStatement(); for jeg Exception som siger at der  er en fejl ved UPDATE query.
Avatar billede arne_v Ekspert
19. februar 2008 - 20:05 #1
Brug prepared statement saa undgaar du den slags problemer.
Avatar billede _carsten Nybegynder
19. februar 2008 - 20:34 #2
Mangler du ikke bare en ' omkring datoen, altså '2008-02-12'
Avatar billede semso Nybegynder
19. februar 2008 - 21:53 #3
Hej,
Der mangler ikke ' omkring datoen feks: '2008-02-12'.Har spekuleret på flere muligheder såsom # og lignede men ingen resultater. Når jeg henter tingene ud fra databasen få jeg sådan en format :
    2008-02-12 00:00:00
og igen har jeg forsøgt at formater den Dato, jeg skule gemme til databasen på  den samme måde, og ingen resultater. Som sagt får jeg samme fejl- fejl ved UPDATE query- som jeg endelig ikke kan farstå.
SQL query fungere fint nok hvis jeg ikke tage feltet -til Date updatering- dvs. at rækken i tabelen bliver opdateret bortset feltet for Date updatering.
Avatar billede semso Nybegynder
19. februar 2008 - 22:01 #4
Jeg har ikke prøvet ved prepared statement fordi mine kolleger siger at det vil give andre problemmer.
Avatar billede _carsten Nybegynder
19. februar 2008 - 22:04 #5
Jeg kan ikke lige få øje på de andre problemer, men kan vi ikke se HELE fejlkoden ?
Avatar billede semso Nybegynder
19. februar 2008 - 22:10 #6
Jeg har den desværre ikke med på denne PC, men vil gerne sende den i morgen fra min arbejdstation.
Avatar billede _carsten Nybegynder
19. februar 2008 - 22:11 #7
OK
Avatar billede arne_v Ekspert
19. februar 2008 - 22:12 #8
Problemer med at bruge prepared statement ??

Jeg vil da gaette paa at 99% af den kode der bruges professionelt bruger prepared statement ....
Avatar billede _carsten Nybegynder
19. februar 2008 - 22:12 #9
Det blver aften inden jeg vender tilbage - bare til orientering
Avatar billede semso Nybegynder
19. februar 2008 - 22:17 #10
OK, som lige har skrevet vil jeg sende hele fejlkode og hvis ikke andet, så må jeg også prøve med dit forslag (prepared statement).
Avatar billede semso Nybegynder
19. februar 2008 - 22:20 #11
OK
Avatar billede semso Nybegynder
20. februar 2008 - 19:41 #12
Hej igen,
Jeg fik løst problemet. Problemmet var p.g.e. en reserveret ord som er blevet lagt til feltets navn.
Du få pointer aligeved. Her er den del af kode som hondtere den scenario:


Handler klase
------------------------------------

package com.ioc;
import java.util.*;
import java.text.SimpleDateFormat;

public class DbHandler
{
    private DBConnection dbCon;
   
    public DbHandler(DBConnection dbCon)
    {
        this.dbCon = dbCon;
    }
   
    public void newSmsUpdateFromCustomer(SMS sms, String mobilNr) throws Exception
    {       
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
       
        StringBuffer sb = new StringBuffer();
        sb.append("UPDATE T_ACTIONS SET DAGSTIME='");
        sb.append(df.format(sms.getTimeStamp()));   
        sb.append("', AIRCON='");
        sb.append(sms.getAircon());
        sb.append("', ELVARME='");
        sb.append(sms.getElectricHeater());
        sb.append("', INDELYS='");
        sb.append(sms.getInternalLights());
        sb.append("', STROM='");
        sb.append(sms.getPower());
        sb.append("', VANDVARMER='");
        sb.append(sms.getWaterHeater());
        sb.append("', UDELYS='");
        sb.append(sms.getOutsiteLights());
        sb.append("', TYVERIALARM='");
        sb.append(sms.getBurglerAlarm());
        sb.append("', BRANDALARM='");
        sb.append(sms.getFireAlarm());
        sb.append("', ELMAALER='");
        sb.append(sms.getElectricMeter());
        sb.append("', VANDMAALER='");
        sb.append(sms.getWaterMeter());
        sb.append("', RUMTEMP='");
        sb.append(sms.getRoomTemp());
        sb.append("'  WHERE MOBILE='");
        sb.append(sms.getMobail());   
        sb.append("'");                   
       
        dbCon.createConnection();
        dbCon.update(sb.toString());
        dbCon.closeConnection();
    }       
}


Database connection klase
-------------------------------------
package com.ioc;
import java.sql.*;
import java.util.*;
import java.io.*;


/**
* DBConnection klassen er en form for konsol til Access databasen, og accepterer SQL sætninger
*/
public class DBConnection
{
    private Connection con;
//    private String conNavn;
    private Statement stmt;
    private Vector<String> values;
    private int current;
    private int last;
   
    /**
    *Kan ændre indhold i en database via SQL sætninger som UPDATE, DELETE, osv
    *@param    sql    SQL sætning
    */
    public void update(String sql)
    {       
        try
        {       
            stmt = con.createStatement();
            stmt.executeUpdate(sql);           
            con.commit();
            stmt.close();
        }
        catch(SQLException e)
        {
            e.printStackTrace();
        }   
    }
   
    /**
    *select metoden markerer en række felter i Access databasen, ud fra den SQL sætning
    *den blir fodret med. Det gemmes i "values" vectoren, og hentes ud via getValue metoden
    *@param    sql    SQL sætning
    */
    public synchronized void select(String sql)
    {
        values = new Vector<String>();
        try
        {   
        //    createConnection();
            stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            ResultSetMetaData rsmd = rs.getMetaData();
           
            while(rs.next())
            {
                for(int i = 1; i <= rsmd.getColumnCount(); i++)
                {
                   
                    String value = rs.getString(i);
                    System.out.println("Value :" +value);
                    if(value == null)
                        values.addElement(" ");
                    else
                        values.addElement(value);
                }
            }
            stmt.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        if(values == null)
            System.err.println("Ingen værdier fra select sætning");
        else
        {
            current = 0;
            last = values.size();
        }
    //    closeConnection();
    }
   
    /**
    *getValue returnerer værdien der er markeret ved brug af select metoden, og hopper så ét
    *hak videre til næste værdi i vectoren
    */
    public String getValue()
    {
        if(values == null)
        {
            System.out.println("Ingen data");
            return "";
        }
        else
        if(current == last)
            return "#";
        else
            return (String)values.elementAt(current++);
    }
   
    /**
    *Opretter en forbindelse til en Access database   
    */
    public void createConnection()
    {   
        Properties property = new Properties();       
        try
        {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
           
            FileInputStream in = new FileInputStream("C:\\Documents and Settings\\Semso\\workspace\\SMSApp\\bin\\com\\ioc\\IODemo.properties");
            property.load(in);
            in.close();
           
            String driver = property.getProperty("db.driver");           
            String url = "jdbc:odbc:" +driver;
            System.out.println("HER ER URL : "+url);
            con = DriverManager.getConnection(url);
            con.setAutoCommit(false);               
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }   
    }   
    /**
    *LukForbindelse afbryder forbindelsen til Access databasen
    */
    public void closeConnection()
    {
        try
        {
            con.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }   
   
    /**
    *Udskriver indholdet i values Vectoren til konsolen
    */
    public void vis()
    {
        System.out.println(values.toString());
    }
}

Hvis arne v kan integrer eller giver en forslag hvordan man kan bruger (Prepered Statement), vil jeg meget gerne have den.
Avatar billede _carsten Nybegynder
20. februar 2008 - 19:52 #13
Det kan han!

Jeg vil afholde mig fra at gøre det, da jeg ikke kender Access godt nok.

Ved første øjekast undrer det mig du kører en UPDATE og ikke en REPLACE eller lignende, men det er nok igen mit kendskab til Access der gør det, eller din tabel er bredere end det du viser :)
Avatar billede semso Nybegynder
20. februar 2008 - 20:00 #14
Tabelen er ikke breder end det jeg viser men det er godt du siger det. Jeg skal nok husk e det til næste gang
Avatar billede arne_v Ekspert
24. februar 2008 - 06:36 #15
Der er ikke den store forskel på Access og andre databaser med hensyn til prepared statement.

Jeg har skrevet en artikel om det:
  http://www.eksperten.dk/artikler/830

Og her er et lille Access eksempel:

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Date;

public class AccessPrep {
    private static final String CONURL = "jdbc:odbc:;Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\\Databases\\MSAccess\\Test.mdb";
    public static void insert(int f1, double f2, String f3, BigDecimal f4, boolean f5, Date f6) throws SQLException {
        Connection con = DriverManager.getConnection(CONURL);
        PreparedStatement pstmt = con.prepareStatement("INSERT INTO pt VALUES (?, ?, ?, ?, ?, ?)");
        pstmt.setInt(1, f1);
        pstmt.setDouble(2, f2);
        pstmt.setString(3, f3);
        pstmt.setBigDecimal(4, f4);
        pstmt.setBoolean(5, f5);
        pstmt.setTimestamp(6, new Timestamp(f6.getTime()));
        pstmt.executeUpdate();
        con.close();
    }
    public static void updateF5(boolean f5, int f1) throws SQLException {
        Connection con = DriverManager.getConnection(CONURL);
        PreparedStatement pstmt = con.prepareStatement("UPDATE pt SET f5 = ?, f6 = ? WHERE f1 = ?");
        pstmt.setBoolean(1, f5);
        pstmt.setTimestamp(2, new Timestamp(System.currentTimeMillis()));
        pstmt.setInt(3, f1);
        pstmt.executeUpdate();
        con.close();
    }
    public static void printRange(int startf1, int endf1) throws SQLException {
        Connection con = DriverManager.getConnection(CONURL);
        PreparedStatement pstmt = con.prepareStatement("SELECT f1, f2, f3, f4, f5, f6 FROM pt WHERE f1 BETWEEN ? AND ?");
        pstmt.setInt(1, startf1);
        pstmt.setInt(2, endf1);
        ResultSet rs = pstmt.executeQuery();
        while(rs.next()) {
            System.out.println(rs.getInt(1) + " " + rs.getDouble(2) + " " +
                              rs.getString(3) + " " + rs.getBigDecimal(4) + " " +
                              rs.getBoolean(5) + " " + rs.getTimestamp(6));
        }
        con.close();
    }
    public static void main(String[] args) throws Exception {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        // tabel pt:
        //  f1 - long integer
        //  f2 - double
        //  f3 - text
        //  f4 - currency
        //  f5 - yes/no
        //  f6 - date/time
        insert(1, 1.2, "ABC", new BigDecimal("1.20"), true, new Date());
        Thread.sleep(2000);
        insert(2, 3.4, "DEF", new BigDecimal("3.40"), true, new Date());
        updateF5(false, 2);
        printRange(1, 2);
    }
}
Avatar billede semso Nybegynder
25. februar 2008 - 20:06 #16
Det er den vist ikke. Tak for det og du få pointer.
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