น้ำตาและความเจ็บปวด

อาจเกิดข้อผิดพลาดขณะเรียกใช้โปรแกรมจาวา เมื่อทำงานกับฐานข้อมูลจะเกิด ข้อผิดพลาด มันคือทั้งหมดที่คุณสามารถคาดเดาและเสนอวิธีแก้ปัญหาที่เหมาะสม

ข้อผิดพลาดกลุ่มใหญ่กลุ่มแรกจะรอคุณอยู่เมื่อดำเนินการบรรทัดนี้:

Connection connection  = DriverManager.getConnection("jdbc:mysql://localhost:3306/test",  "root", "secret");

คุณคาดหวังอะไรได้ที่นี่

ข้อผิดพลาด 1. ไม่พบไดรเวอร์

หากคุณได้รับข้อผิดพลาด“ไม่พบไดรเวอร์ที่เหมาะสมสำหรับ …”หมายความว่า DriverManager ไม่สามารถเข้าใจประเภทของ DBMS ที่อยู่เบื้องหลัง URL ของคุณ ตัวอย่างเช่น คุณเขียน jdbc_mysql: แทน jdbc:mysql:

ข้อผิดพลาด 2. ข้อผิดพลาดในการเชื่อมต่อ

หากคุณใส่ชื่อโฮสต์ผิด คุณมักจะได้รับข้อความเช่น "ไม่ทราบโฮสต์ดังกล่าว" หรือ "ลิงก์การสื่อสารล้มเหลว"

ข้อผิดพลาด 3 ชื่อฐานข้อมูลไม่ถูกต้อง

หากคุณสะกด ชื่อฐานข้อมูลผิดหรือเชื่อมต่อกับเซิร์ฟเวอร์อื่นที่ไม่มีอยู่ คุณจะได้รับข้อความเช่น“ฐานข้อมูลที่ไม่รู้จัก 'supershop3'”

ข้อผิดพลาด 4. เข้าสู่ระบบหรือรหัสผ่านไม่ถูกต้อง

หากคุณลืมรหัสผ่านของฐานข้อมูลหรือป้อนไม่ถูกต้อง เป็นไปได้มากว่าคุณจะได้รับข้อความเช่น“การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้ 'root'@'localhost' (โดยใช้รหัสผ่าน: ใช่)”

ข้อยกเว้น SQL

หากเชื่อมต่อกับฐานแล้วก็จะน่าสนใจยิ่งขึ้นไปอีก ในกรณีที่เกิดข้อผิดพลาดเมื่อทำงานกับฐานข้อมูล JDBC จะมีข้อยกเว้นพิเศษ- java.sql.SQLException เช่นเดียวกับหลายพันธุ์

ข้อยกเว้นนี้มีเพียงหนึ่งวิธีเพิ่มเติม (เทียบกับคลาสข้อยกเว้น) - เมธอด getSQLState() ซึ่งจะส่งคืนรหัสสถานะ (สตริง) ที่เซิร์ฟเวอร์ SQL ส่งคืน การจัดการข้อผิดพลาดมีลักษณะดังนี้:

Connection connection  = DriverManager.getConnection("jdbc:mysql://localhost:3306/test",  "root", "secret");
try {
   int rowsCount = statement.executeUpdate("DELETE FROM ‘Unemployees’");
} catch (SQLException ex) {
  // If table doesn't exist
   if (ex.getSQLState().compareTo("X0Y32") != 0) {
  	throw ex;
  }
 } finally {
  connection.close();
 }

มีรหัสข้อผิดพลาดหลายร้อยรายการ คุณสามารถดูรายการทั้งหมดได้ที่นี่

แต่บางครั้งรหัสข้อผิดพลาดก็ช่วยให้ JDBC เข้าใจข้อผิดพลาดได้ดีขึ้น และไม่ใช่แค่ SQLException เท่านั้น แต่ยังมี SQLException พิเศษด้วย:

BatchUpdateException เกิดข้อผิดพลาดระหว่างคำขอกลุ่ม
การตัดข้อมูล มักเกิดขึ้นเมื่อตัดทอนข้อมูลที่ยาว
SQLClientInfoException ไคลเอนต์ผ่านพารามิเตอร์ที่ไม่สามารถตั้งค่าในการเชื่อมต่อได้: Connection
SQLDataException ข้อผิดพลาดกับข้อมูล รายละเอียดขึ้นอยู่กับประเภทของ DBMS
SQLException ข้อผิดพลาดในการเข้าถึงฐานข้อมูลหรือข้อผิดพลาดทั่วไปอื่นๆ
SQLFeatureNotSupportedException DBMS ไม่รองรับการทำงานนี้
SQLIntegrityConstraintViolationException ข้อผิดพลาดทั้งหมดสำหรับ SQLState ==22
SQLInvalidAuthorizationSpecException ข้อผิดพลาดในการเข้าถึงและ/หรือการอนุญาต
SQLNonTransientConnectionException ข้อผิดพลาดทั้งหมดสำหรับ SQLState ==08
SQLRecoverableException มีข้อผิดพลาด แต่สามารถแก้ไขได้ด้วยการแทรกแซงของแอปพลิเคชัน
SQLSyntaxErrorException ข้อผิดพลาดในไวยากรณ์แบบสอบถาม
SQLTimeoutException คำขอใช้เวลานานเกินไป
SQLTransactionRollbackException เกิดข้อผิดพลาดระหว่างการย้อนกลับธุรกรรม
SQLWarning คำเตือนที่ออกโดย DBMS

ตัวอย่างข้อผิดพลาด

หากข้อผิดพลาดเกิดขึ้นที่ขั้นตอนของแอปพลิเคชันเซิร์ฟเวอร์ โดยปกติแล้วจะสามารถบันทึกได้และจัดการในรายละเอียดเพิ่มเติมเท่านั้น แต่ถ้าเกิดขึ้นในขณะที่แอปพลิเคชันกำลังทำงานบนคอมพิวเตอร์ของโปรแกรมเมอร์ คุณต้องตรวจสอบสาเหตุของสิ่งนี้อย่างรอบคอบ

มีข้อผิดพลาดที่ใหญ่ที่สุดสองประเภทเมื่อทำงานกับฐานข้อมูล:

  • ขอข้อความผิดพลาด
  • เกิดข้อผิดพลาดขณะทำงานกับ ResultSet

ข้อผิดพลาดในข้อความคำขออาจเกิดขึ้นได้บ่อยมาก ข้อความค้นหาอาจยาวมาก มีหลายตาราง (เข้าร่วมผ่าน JOIN) และข้อความค้นหาย่อย (SUBSELECT) การค้นหาข้อผิดพลาดในคำขอดังกล่าวไม่ใช่เรื่องง่าย นอกจากนี้ คำขอมักจะถูกรวมเข้าด้วยกันจากส่วนต่างๆ ข้อมูลจะถูกเพิ่มเข้าไปที่นั่น

ข้อผิด พลาดแรกที่คุณควรทราบคือSQLSyntaxErrorException ข้อผิดพลาดดังกล่าวมักจะหมายความว่าคุณพิมพ์ผิดในเนื้อหาคำขอ

ลองมาตัวอย่างที่เราชื่นชอบ:

ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
results.next();
    int count = results.getInt(1);

และ "ตั้งใจ" ลบเครื่องหมายดอกจันในเนื้อหาคำขอ:

ResultSet results = statement.executeQuery("SELECT Count() FROM user");
results.next();
    int count = results.getInt(1);

จากนั้นเราจะได้รับข้อยกเว้น:

Exception in thread "main" java.sql.SQLSyntaxErrorException:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM task' at line 1

           	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)

เซิร์ฟเวอร์ SQL บอกเราว่ามีข้อผิดพลาดทางไวยากรณ์ก่อน FROM

เราพิจารณาคำขออย่างระมัดระวังและคิด หากไม่มีอะไรอยู่ในใจและสิ่งนี้เกิดขึ้นบ่อยมาก คุณต้องขอให้ใครสักคนดูว่ามีอะไรผิดปกติ

ข้อผิดพลาดยอดนิยมอีกประการหนึ่งคือการทำงานกับ ResultsSet ที่ไม่ถูกต้อง - ผลลัพธ์ของคำขอ สมมติว่าคุณลืมว่าก่อนที่จะอ่านข้อมูล "แถวปัจจุบัน" ของวัตถุ ResultSet มาก่อนแถวแรก คุณจะมีรหัสต่อไปนี้:

ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
//    results.next();
    int count = results.getInt(1);

คุณจะได้รับข้อผิดพลาดนี้:


2012 12:55:48 AM jButton5ActionPerformed
SEVERE: null
java.sql.SQLException: Before start of result set
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
    at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:841)
    at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5650)
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5570)

เราพิจารณาข้อผิดพลาดอย่างระมัดระวังและคิด จากนั้นเรา google และค้นหาตัวอย่างสองสามตัวอย่างและพยายามทำความเข้าใจวิธีแก้ปัญหา