น้ำตาและความเจ็บปวด
อาจเกิดข้อผิดพลาดขณะเรียกใช้โปรแกรมจาวา เมื่อทำงานกับฐานข้อมูลจะเกิด ข้อผิดพลาด มันคือทั้งหมดที่คุณสามารถคาดเดาและเสนอวิธีแก้ปัญหาที่เหมาะสม
ข้อผิดพลาดกลุ่มใหญ่กลุ่มแรกจะรอคุณอยู่เมื่อดำเนินการบรรทัดนี้:
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 และค้นหาตัวอย่างสองสามตัวอย่างและพยายามทำความเข้าใจวิธีแก้ปัญหา