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?
Annonceindlæg fra SoftwareOne
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.
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");
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)
LAST_INSERT_ID() hedder @@IDENTITY i Access.
Hov - to ting... Hvor ligger "sun.jdbc.odbc.JdbcOdbcDriver"? Skal jeg "import" noget? Jeg behøver ikke at installere noget ekstra?
Vedr. 06/06-2004 14:50:52: Tak!
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.
Til gengæld skal du have defineret en DSN til at pege på din Access database.
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.
06. juni 2004 - 20:09
#10
simonvalter >> Smart. Det vil jeg da prøve. arne_v >> Hvor (og hvorledes) definerer man "en DSN"?
06. juni 2004 - 20:11
#11
control panel administrative tools data sources (ODBC)
07. juni 2004 - 12:48
#12
Tusind tak!
07. juni 2004 - 14:06
#13
arne_v >> Har du mulighed til at give et tip om hvordan jeg bruger @@IDENTITY?
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()
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"); ??
07. juni 2004 - 14:40
#16
ResultSet rs = pstmt.executeQuery("SELECT @@IDENTITY");
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.
07. juni 2004 - 14:51
#18
Det må jeg vist lige teste selv - stay tuned
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(); } } }
07. juni 2004 - 22:12
#20
Hvilken version af Access ODBC driver bruger du ?
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
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
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(); } } }
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?
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();
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?
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.
Kurser inden for grundlæggende programmering