2013-05-23 37 views
11

Tôi hy vọng ai đó có thể giúp tôi. Tôi đang làm việc trên một ứng dụng đơn giản kết nối với một cơ sở dữ liệu SQLite. Sau đây là mã kết nối của tôi:Không tìm thấy trình điều khiển phù hợp (SQLite)

try {   
    Connection con = DriverManager.getConnection("jdbc:sqlite:myDB.sqlite"); 
    PreparedStatement pstm = con.prepareStatement("insert into hell(username,pssword) " + 
"values ('"+tfUname.getText()+"','"+tfUpass.getText()+"')"); 

    pstm.close(); 
    con.close(); 
    JOptionPane.showMessageDialog(null,"Congrats, you have been registered succesfully"); 
    RegisterWindow rw = new RegisterWindow(); 
    rw.setVisible(false); 
    pack(); 
    dispose(); 
} catch(SQLException ex) { 
    setTitle(ex.toString()); 
} 

Đây chỉ là cửa sổ để tải tên người dùng và mật khẩu trong cơ sở dữ liệu. Tôi có vấn đề là khi tôi bấm vào nút ngoại lệ sau đây xuất hiện:

"java.sql.SQLException: No suitable driver found for jdbc:sqlite:C\\LoginJava2\\myDB.sqlite" 

(Tôi tìm thấy một ví dụ về làm thế nào để kết nối với một cơ sở dữ liệu SQLite trong Java, ví dụ tôi thấy hoạt động tốt)

Chương trình này tôi đang thực hiện nó trong trình tạo cửa sổ (nhật thực). Tôi đang sử dụng cùng một trình điều khiển tôi sử dụng trong ví dụ tôi tìm thấy. Tôi không biết liệu tôi có phải sử dụng một tài xế khác hay không. Trong thực tế, tôi đã thử với các trình điều khiển khác nhau nhưng tin nhắn đó vẫn xuất hiện.

+0

[Xem tại đây Ví dụ về JDBC PreparedStatement] (http://www.mkyong.com/jdbc/jdbc-preparedstatement-example-batch-update/) – Smit

+0

[JDBC + SQLite: DriveManager không tải trình điều khiển cần thiết] (http: //stackoverflow.com/questions/13637389/jdbc-sqlite-drivemanager-does-not-load-needed-driver) – Smit

+0

Điều đó không giống như một url hợp lệ. –

Trả lời

17

Đường dẫn lớp của bạn thiếu (các) bình chứa các lớp và trình điều khiển sqlite. Bạn cần một cái gì đó như sqlite-jdbc-3.7.2.jar hoặc phiên bản thích hợp của bạn.

Nếu bạn chắc chắn jar là có, hãy thử thêm dòng mã này trước khi bạn tạo một kết nối:

Class.forName("org.sqlite.JDBC"); 
+2

nó không hoạt động với sqlite-jdbc-3.7.2.jar ... và nếu tôi thêm dòng "Class.forName (" org.sqlite.JDBC ");" xuất hiện lỗi trong dòng đó với thông báo này: "Loại ngoại lệ không hợp lệ ClassNotFoundException" – Fenrir86

+0

@ Fenrir86 chỉ cần bao quanh nó bằng cách thử {.......} catch (ClassNotFoundException e) {....} –

+0

Và đảm bảo bạn có tệp sqlite-jdbc-xxxxxxx.jar trong WEB-INF/lib/nếu bạn đang chạy một máy chủ như openshift –

2

Tôi có cùng một vấn đề. tôi đã sử dụng maven và phụ thuộc thêm:

<dependency> 
     <groupId>org.xerial</groupId> 
     <artifactId>sqlite-jdbc</artifactId> 
     <version>3.15.1 
     </version> 
    </dependency> 

Nó có thể được biên dịch và tôi đã nhận:

Không lái xe phù hợp tìm thấy cho jdbc: sqlite: xx.db

Tôi đã kiểm tra classpath và tôi đã chắc chắn sqlite-jdbc-3.15.1.jar đã có. Tôi đoán rằng vì lý do nào đó, Lớp học không được tải, tôi không biết tại sao. vì vậy tôi đã thêm

Class.forName ("org.sqlite.JDBC");

ở đầu mã của tôi. Nó đã làm việc!

Và, tôi xóa dòng ở trên. Nó vẫn làm việc! Tôi làm sạch dự án và xây dựng lại nó, không cần Class.forName() nữa! Tôi vẫn không biết tại sao. Nhưng vấn đề được giải quyết. Tôi nghĩ Class.forName() có thể được sử dụng để chẩn đoán nếu lớp bạn cần là trong classpath.

+0

cho tôi vấn đề xuất hiện trở lại khi loại bỏ 'Class.forName (" org.sqlite.JDBC ")' –

2

Có điều gì đó không chỉ là Class.forName.

Trong trường hợp bạn đã thực hiện cả hai điều sau: - Thêm thư viện jar sqlite vào thư mục lib trong dự án của bạn, tham chiếu đến nó trong đường dẫn xây dựng dự án. - Đã thêm tuyên bố Class.forName ("org.sqlite.JDBC"). Và thông báo lỗi "Không có trình điều khiển phù hợp" vẫn xuất hiện, nó có thể do đường dẫn cơ sở dữ liệu của bạn gây ra. Nếu bạn đang sử dụng Windows: Thay vì:

DriverManager.getConnection("D:\\db\\my-db.sqlite"). 

Bạn nên sử dụng:

DriverManager.getConnection("jdbc:sqlite:D:\\db\\my-db.sqlite"). 

Các "jdbc: sqlite:" sẽ làm các trick.

Nếu bạn đang sử dụng Linux, chỉ cần thay đổi ký tự seperator: DriverManager.getConnection ("jdbc: sqlite: /your/somepath/my-db.sqlite").

0

Dòng "Class.forName (" org.sqlite.JDBC ");" làm việc vì nó tạo ra một thể hiện của JDBC mà kích hoạt các khối tĩnh của JDBC lớp:

static { 
     try { 
      DriverManager.registerDriver(new JDBC()); 
     } 
     catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 

Thay vì thêm các Class.forName() đề cập ở trên, bạn nên trực tiếp sử dụng dòng này có tác dụng tương tự và là tao nhã hơn (vì bạn không tạo một thể hiện của JDBC cho không có gì):

DriverManager.registerDriver(new JDBC()); 
0

Nếu bạn sử dụng Maven và muốn xây dựng một jar thực thi, bạn có thể quyết định nhập nội dung của jar sqlite thành của bạn lọ sản xuất của riêng mình:

<plugins> 
    <!-- any other plugins --> 
    <plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <executions> 
     <execution> 
     <phase>package</phase> 
     <goals> 
      <goal>single</goal> 
     </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <archive> 
     <manifest> 
      <addDefaultImplementationEntries>true</addDefaultImplementationEntries> 
      <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries> 
      <addClasspath>true</addClasspath> 
      <mainClass>MyPackage.Main</mainClass> 
     </manifest> 
     </archive> 
     <descriptorRefs> 
     <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
    </configuration> 
    </plugin> 
</plugins> 

Bạn sẽ không phải thêm đường dẫn lớp cụ thể hoặc việc sử dụng ngầm định như được đề xuất trong các câu trả lời khác.

Các vấn đề liên quan