ercizMedlem sedan maj 20011 826 inlägg Jag försöker få Java att arbeta med SQLite, men jag får det inte att fungera.
Hittade en JDBC-drivare för SQLite här: http://www.zentus.com/sqlitejdbc/
tankade jar-filen och lade in den i mitt projekt i Eclipse.
Koden ser ut såhär:
import java.sql.*;
public class Test {
public Test() {
try {
Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db");
Statement stat = conn.createStatement();
stat.executeUpdate("drop table if exists people;");
stat.executeUpdate("create table people (name, occupation);");
PreparedStatement prep = conn.prepareStatement(
"insert into people values (?, ?);");
prep.setString(1, "George");
prep.setString(2, "politics");
prep.addBatch();
prep.setString(1, "Turing");
prep.setString(2, "computers");
prep.addBatch();
conn.setAutoCommit(false);
prep.executeBatch();
conn.setAutoCommit(true);
ResultSet rs = stat.executeQuery("select * from people;");
while (rs.next()) {
System.out.println("name = " + rs.getString("name"));
System.out.println("job ) " + rs.getString("occupation"));
}
rs.close();
conn.close();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
public static void main(String[] args) {
new Test();
}
}
Det blir kompileringsfel:
[Test] java.sql.SQLException: No suitable driver found for jdbc:sqlite:test.db
[Test] at java.sql.DriverManager.getConnection(DriverManager.java:602)
[Test] at java.sql.DriverManager.getConnection(DriverManager.java:207)
[Test] at Test.<init>(Test.java:28)
[Test] at Test.main(Test.java:86)
Förstår inte riktigt varför. Men jag vet inte heller hur jag gör en test.db-fil med sqlite3, vad jag förstått så lär man göra det innan.
GeinMedlem sedan sep. 20005 700 inlägg Det du får är inte ett kompileringsfel utan ett runtime-fel.
Har du provat att skriva
Class.forName("org.sqlite.JDBC");
överst i ditt try-block (precis som exemplet på SQLiteJDBC-hemsidan gör)? Det kommer att försöka ladda in JDBC-klassen och smäller det på den raden så har du ett CLASSPATH-problem.
Jag gissar på att du helt enkelt inte lagt in den nerladdade jar-filen i din CLASSPATH när du kör programmet. Har du, i Eclipse, högerklicklat på Jar-filen och valt "Build Path > Add to Build Path"?
ercizMedlem sedan maj 20011 826 inlägg
Gein skrev:
Har du, i Eclipse, högerklicklat på Jar-filen och valt "Build Path > Add to Build Path"?
Jo, har Eclipse och har gjort sådär, så jar-filen ska finnas där.
Men jag får ännu mer fel när jag lägger till raderna
try {
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
så får jag felet:
[Test] java.lang.ClassNotFoundException: org.sqlite.JDBC
[Test] at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
[Test] at java.security.AccessController.doPrivileged(Native Method)
[Test] at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
[Test] at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
[Test] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
[Test] at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
[Test] at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
[Test] at java.lang.Class.forName0(Native Method)
[Test] at java.lang.Class.forName(Class.java:169)
[Test] at Test.<init>(Test.java:17)
[Test] at Test.main(Test.java:11)
[Test] java.sql.SQLException: No suitable driver found for jdbc:sqlite:test.db
[Test] at java.sql.DriverManager.getConnection(DriverManager.java:602)
[Test] at java.sql.DriverManager.getConnection(DriverManager.java:207)
[Test] at Test.<init>(Test.java:24)
[Test] at Test.main(Test.java:11)
Ett fel kan naturligtvis vara att jag inte lyckats skapa en test.db-fil, men antar att det är nåt mer.
ercizMedlem sedan maj 20011 826 inlägg Misstänker att Eclipse kan trassla till det lite så jag testade nu att kopiera Test.java direkt från hemsidan, och lade sqlitejdbc-v054.jar i samma katalog:
import java.sql.*;
public class Test {
public static void main(String[] args) throws Exception {
Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db");
Statement stat = conn.createStatement();
stat.executeUpdate("drop table if exists people;");
stat.executeUpdate("create table people (name, occupation);");
PreparedStatement prep = conn.prepareStatement(
"insert into people values (?, ?);");
prep.setString(1, "Gandhi");
prep.setString(2, "politics");
prep.addBatch();
prep.setString(1, "Turing");
prep.setString(2, "computers");
prep.addBatch();
prep.setString(1, "Wittgenstein");
prep.setString(2, "smartypants");
prep.addBatch();
conn.setAutoCommit(false);
prep.executeBatch();
conn.setAutoCommit(true);
ResultSet rs = stat.executeQuery("select * from people;");
while (rs.next()) {
System.out.println("name = " + rs.getString("name"));
System.out.println("job = " + rs.getString("occupation"));
}
rs.close();
conn.close();
}
}
kompilerade med
javac Test.java
det gick bra.
Sen när jag körde med
java -cp .:sqlitejdbc-v054.jar Test
exakt som på hemsidan, men det resulterade i detta fel:
Exception in thread "main" java.lang.NoClassDefFoundError: Test
Caused by: java.lang.ClassNotFoundException: Test
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
Could not find the main class: Test. Program will exit.
Sen testade jag med det enkla kommandot:
java Test
Men inte heller det hjälpte, fick följande fel:
Exception in thread "main" java.lang.ClassNotFoundException: org.sqlite.JDBC
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at Test.main(Test.java:6)
GeinMedlem sedan sep. 20005 700 inlägg
erciz skrev:
Jo, har Eclipse och har gjort sådär, så jar-filen ska finnas där.
Men jag får ännu mer fel när jag lägger till raderna
try {
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
så får jag felet:
[Test] java.lang.ClassNotFoundException: org.sqlite.JDBC
[Test] at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
[Test] at java.security.AccessController.doPrivileged(Native Method)
[Test] at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
[Test] at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
[Test] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
[Test] at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
[Test] at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
[Test] at java.lang.Class.forName0(Native Method)
[Test] at java.lang.Class.forName(Class.java:169)
[Test] at Test.<init>(Test.java:17)
[Test] at Test.main(Test.java:11)
[Test] java.sql.SQLException: No suitable driver found for jdbc:sqlite:test.db
[Test] at java.sql.DriverManager.getConnection(DriverManager.java:602)
[Test] at java.sql.DriverManager.getConnection(DriverManager.java:207)
[Test] at Test.<init>(Test.java:24)
[Test] at Test.main(Test.java:11)
Ett fel kan naturligtvis vara att jag inte lyckats skapa en test.db-fil, men antar att det är nåt mer.
Vilket tydligt indikerar att din JDBC driver inte finns i din CLASSPATH.
GeinMedlem sedan sep. 20005 700 inlägg
erciz skrev:
Jo, har Eclipse och har gjort sådär, så jar-filen ska finnas där.
Så för att vara övertydlig. Om du expanderar ditt projekt i Eclipse och sedan tittar under "Referenced Libraries" så hittar du sqlitejdbc-v054.jar där, eller hur?
Och om du går in i arkivmenyn "Run" och sedan "Run Configurations", markerar den konfiguration som du använder för att starta din test-applikation, klickar på fliken "Classpath" så hittar du även sqlitejdbc-v054.jar under "User Entries", korrekt?
Isåfall ska du ha JDBC drivern på din classpath när du kör ditt program genom Eclipse.
ercizMedlem sedan maj 20011 826 inlägg
Gein skrev:
Så för att vara övertydlig. Om du expanderar ditt projekt i Eclipse och sedan tittar under "Referenced Libraries" så hittar du sqlitejdbc-v054.jar där, eller hur?
Och om du går in i arkivmenyn "Run" och sedan "Run Configurations", markerar den konfiguration som du använder för att starta din test-applikation, klickar på fliken "Classpath" så hittar du även sqlitejdbc-v054.jar under "User Entries", korrekt?
Isåfall ska du ha JDBC drivern på din classpath när du kör ditt program genom Eclipse.
Ja, jar-filen finns under "Referenced Libraries" och under fliken "Classpatch". Bifogar en skärmdump.
GeinMedlem sedan sep. 20005 700 inlägg Då vet jag inte riktigt vad du gör för fel. Så här gjorde jag nu iaf:
Skapade ett nytt Java-projekt, döpt till "SqlLiteTest".
Skapade en lib-katalog.
Kopierade in sqlitejdbc-v054.jar i lib.
La till jar-filen till Build Path.
Skapade Test.java innehållandes följande:
import java.sql.*;
public class Test {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db");
Statement stat = conn.createStatement();
stat.executeUpdate("drop table if exists people;");
stat.executeUpdate("create table people (name, occupation);");
PreparedStatement prep = conn.prepareStatement(
"insert into people values (?, ?);");
prep.setString(1, "George");
prep.setString(2, "politics");
prep.addBatch();
prep.setString(1, "Turing");
prep.setString(2, "computers");
prep.addBatch();
conn.setAutoCommit(false);
prep.executeBatch();
conn.setAutoCommit(true);
ResultSet rs = stat.executeQuery("select * from people;");
while (rs.next()) {
System.out.println("name = " + rs.getString("name"));
System.out.println("job = " + rs.getString("occupation"));
}
rs.close();
conn.close();
}
}
Sedan körde jag Test-klassen och det fungerade. test.db skapades i projekt-katalogen.
ercizMedlem sedan maj 20011 826 inlägg
Gein skrev:
Då vet jag inte riktigt vad du gör för fel. Så här gjorde jag nu iaf:
Skapade ett nytt Java-projekt, döpt till "SqlLiteTest".
Skapade en lib-katalog.
Kopierade in sqlitejdbc-v054.jar i lib.
La till jar-filen till Build Path.
Skapade Test.java innehållandes följande:
...
Sedan körde jag Test-klassen och det fungerade. test.db skapades i projekt-katalogen.
Stort tack! Det fungerade! Även jag vet inte riktigt vad det var för fel förut, men får kolla upp det lite noggrannare. Men nu fungerade det utmärkt!
GeinMedlem sedan sep. 20005 700 inlägg
erciz skrev:
Stort tack! Det fungerade! Även jag vet inte riktigt vad det var för fel förut, men får kolla upp det lite noggrannare. Men nu fungerade det utmärkt!
Det du kan testa med ditt "gamla" projekt är att ta bort din run configuration och skapa en ny. Troligtvis är det något i den som inte står rätt till.