Avatar billede birkis Nybegynder
06. juni 2004 - 14:32 Der er 26 kommentarer og
1 løsning

Javaprogrammer for MySQL VS Microsoft Access

Jeg har lavet nogle programmer der kører med MySQL. Hvad må jeg ændre i disse programmer for at benytte Microsoft Access?
Avatar billede arne_v Ekspert
06. juni 2004 - 14:35 #1
Den driver du loader med Class.forName og connection URL i
DriverManager.getConnection.

Plus alle de steder hvor du har brugt noget SQL som er MySQL specifikt, men
det er forhåbentlogt ingen steder.
Avatar billede arne_v Ekspert
06. juni 2004 - 14:37 #2
Eksempel:

fra

        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost/Test", "", "");

til

      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
      Connection con = DriverManager.getConnection("jdbc:odbc:TestMSAccess");
Avatar billede birkis Nybegynder
06. juni 2004 - 14:49 #3
Super, Arne!

Jeg var ved at stille nogle uddybende spørgsmål, men du har allerede besvaret dem også... :-)

"Plus alle de steder hvor du har brugt noget SQL som er MySQL specifikt, men
det er forhåbentlogt ingen steder."
Jeg har brugt LAST_INSERT_ID eet sted... (rødme)
Avatar billede arne_v Ekspert
06. juni 2004 - 14:50 #4
LAST_INSERT_ID() hedder @@IDENTITY i Access.
Avatar billede birkis Nybegynder
06. juni 2004 - 14:51 #5
Hov - to ting...

Hvor ligger "sun.jdbc.odbc.JdbcOdbcDriver"? Skal jeg "import" noget?

Jeg behøver ikke at installere noget ekstra?
Avatar billede birkis Nybegynder
06. juni 2004 - 14:52 #6
Vedr. 06/06-2004 14:50:52: Tak!
Avatar billede arne_v Ekspert
06. juni 2004 - 14:55 #7
Ingen grund til import (pakken er angivet => ikke brug for import, det er
"bare" en tekst streng => ikke brug for import).

Den klasse kommer med Java runtime, så der skal ikke tilføjes nogen
jar i classpath.
Avatar billede arne_v Ekspert
06. juni 2004 - 14:55 #8
Til gengæld skal du have defineret en DSN til at pege på din Access database.
Avatar billede simonvalter Praktikant
06. juni 2004 - 18:21 #9
Eller du kan bruge dette lille trick til at få fat i den direkte
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)}; DBQ=dindatabase.mdb","", "");

Jeg ved ikke om det har nogen ulemper, men det har fordelen at der ikke skal sættes noget op i windows for at afvikle programmet.
Avatar billede birkis Nybegynder
06. juni 2004 - 20:09 #10
simonvalter >> Smart. Det vil jeg da prøve.

arne_v >> Hvor (og hvorledes) definerer man "en DSN"?
Avatar billede arne_v Ekspert
06. juni 2004 - 20:11 #11
control panel
administrative tools
data sources (ODBC)
Avatar billede birkis Nybegynder
07. juni 2004 - 12:48 #12
Tusind tak!
Avatar billede birkis Nybegynder
07. juni 2004 - 14:06 #13
arne_v >> Har du mulighed til at give et tip om hvordan jeg bruger @@IDENTITY?
Avatar billede arne_v Ekspert
07. juni 2004 - 14:11 #14
Du kan hente værdien med en query med SELECT @@IDENTITY

Du kan bruge @@IDENTITY som værdi i en INSERT

Helt ligesom MySQL LAST_INSERT_ID()
Avatar billede birkis Nybegynder
07. juni 2004 - 14:22 #15
Så enkelt som at ændre
ResultSet rs = pstmt.executeQuery("SELECT LAST_INSERT_ID()");

til
ResultSet rs = pstmt.executeQuery("@@IDENTITY"); ??
Avatar billede arne_v Ekspert
07. juni 2004 - 14:40 #16
ResultSet rs = pstmt.executeQuery("SELECT @@IDENTITY");
Avatar billede birkis Nybegynder
07. juni 2004 - 14:49 #17
Hmmm... Så må jeg gøre noget forkert...

Den siger "Driver does not support this function". Når jeg fjerner alt det, der har med den nævnte funktion at gøre, kører det uden denne fejl.
Avatar billede arne_v Ekspert
07. juni 2004 - 14:51 #18
Det må jeg vist lige teste selv - stay tuned
Avatar billede arne_v Ekspert
07. juni 2004 - 22:11 #19
Det her virker fint for mig:

import java.sql.*;

public class AutoTest {
    public static void main(String[] args) {
        try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            Connection con = DriverManager.getConnection("jdbc:odbc:TestMSAccess", "", "");
            Statement stmt = con.createStatement();
            stmt.executeUpdate("INSERT INTO AutoTest (Data) VALUES ('Test')");
            ResultSet rs = stmt.executeQuery("SELECT @@IDENTITY");
            while(rs.next()) {
                System.out.println(rs.getInt(1));
            }
            stmt.close();
            con.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
Avatar billede arne_v Ekspert
07. juni 2004 - 22:12 #20
Hvilken version af Access ODBC driver bruger du ?
Avatar billede birkis Nybegynder
08. juni 2004 - 08:21 #21
Jeg har ingen problemer med din kode, så det er mig der gør noget forkert.

Jeg kan se at jeg bruger en
PreparedStatement pstmt = con.prepareStatement("INSERT INTO blablabla)
hvor du har
Statement stmt = con.createStatement();

Hvad er forskellen?

Version af Access ODBC er 4.00.6019.00
Avatar billede arne_v Ekspert
08. juni 2004 - 08:46 #22
Der burde ikke være nogen forskel på PreparedStatement og Statement i denne
sammenhæng.

Men jeg kan selvfølgelig prøve.

4.00.6200.00
Avatar billede arne_v Ekspert
08. juni 2004 - 09:12 #23
Hm - følgende virker også hos mig:

import java.sql.*;

public class AutoTest {
    public static void main(String[] args) {
        try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            Connection con = DriverManager.getConnection("jdbc:odbc:TestMSAccess", "", "");
            PreparedStatement pstmt = con.prepareStatement("INSERT INTO AutoTest (Data) VALUES ('Test')");
            pstmt.executeUpdate();
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT @@IDENTITY");
            while(rs.next()) {
                System.out.println(rs.getInt(1));
            }
            stmt.close();
            con.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
Avatar billede birkis Nybegynder
08. juni 2004 - 11:02 #24
Fungerer også hos mig... Kan det have noget med min INSERT at gøre, mon?

Jeg får
INSERT INTO AutoTest (Data1, Data2) VALUES ('Test1', 'Test2')
til at fungere, men hvad med

String s1 = "Test1";
String s2 = "Test2";
...
INSERT INTO AutoTest (Data1, Data2 VALUES (.....?  <--- Hvad gør jeg her?
Avatar billede arne_v Ekspert
08. juni 2004 - 11:21 #25
stmt.executeUpdate("INSERT INTO AutoTest (Data1, Data2) VALUES ('" + s1 + "', '" + s2 + "')");

eller

PreparedStatement pstmt = con.prepareStatement("INSERT INTO AutoTest (Data1, Data2) VALUES (?, ?)");
pstmt.setString(1, s1);
pstmt.setString(1, s2);
pstmt.executeUpdate();
Avatar billede birkis Nybegynder
08. juni 2004 - 14:31 #26
Jeg havde oprindelig PreparedStatement, men den giver, efter hvad jeg kan se, fejl sammen med @@IDENTITY. Statement fungerer derimod udmærket.

Hvad er det der bestemmer Access ODBC-version? Er det den installerede Office?
Avatar billede arne_v Ekspert
08. juni 2004 - 14:35 #27
Bl.a.

Men du kan altid downloade nyeste.

ODBC drivere er en del af MDAC.

Og bemærk at allernyeste MDAC ikke idneholder Access, så du skal have
nyeste som indeholder Access.
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