gözyaşı ve acı
Bir Java programını çalıştırırken hatalar oluşabilir. Veritabanı ile çalışırken hatalar oluşacaktır . Her şey, bunlardan hangisini tahmin edebileceğiniz ve yeterli bir çözüm sunabileceğinizle ilgili.
Bu satırı çalıştırırken ilk büyük hata grubu sizi bekliyor olacak:
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "secret");
Burada ne bekleyebilirsiniz?
Hata 1. Sürücü bulunamadı .
“… için uygun sürücü bulunamadı” hatasını alırsanız bu, DriverManager'ın URL'nizin arkasında ne tür bir DBMS olduğunu anlayamadığı anlamına gelir. Örneğin, jdbc:mysql yerine jdbc_mysql: yazdınız:
Hata 2. Bağlantı hatası .
Ana bilgisayar adında bir hata yaparsanız, büyük olasılıkla "Böyle bir ana bilgisayar bilinmiyor" veya "İletişim bağlantı hatası" gibi bir mesaj alırsınız.
Hata 3. Veritabanı adı yanlış .
Veritabanı adını yanlış yazdıysanız veya var olmayan başka bir sunucuya bağlandıysanız, “Bilinmeyen veritabanı 'supershop3'” gibi bir mesaj alırsınız .
Hata 4. Yanlış oturum açma veya şifre .
Veritabanı şifresini unuttuysanız veya yanlış girdiyseniz, büyük ihtimalle “'root'@'localhost' kullanıcısı için erişim reddedildi (kullanılan şifre: YES)” gibi bir mesaj alacaksınız .
SQL İstisnası
Yine de üsse bağlantı kurulursa, o zaman daha da ilginç olacaktır. Veritabanıyla çalışırken hata olması durumunda, JDBC'nin özel bir istisnası vardır - java.sql.SQLException . Çeşitlerinin yanı sıra.
Bu istisnanın yalnızca bir ek yöntemi vardır (Exception sınıfına kıyasla) - SQL sunucusunun kendisine döndürdüğü durum kodunu (dize) döndüren getSQLState() yöntemi. Hata işleme şöyle görünür:
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();
}
Yüzlerce hata kodu var. Listenin tamamını burada görebilirsiniz .
Ancak bazen hata kodları, JDBC'nin hatayı daha iyi anlamasına yardımcı olur ve ardından yalnızca SQLException'ı değil, özel SQLException'ı da atar:
BatchUpdateException | Grup isteği sırasında hata |
Veri Kesme | Genellikle uzun verileri keserken oluşur |
SQLClientInfoException | İstemci, bağlantıda ayarlanamayan parametreleri geçti: Bağlantı |
SQLDataException | Veri hatası, ayrıntılar DBMS türüne bağlıdır |
SQL İstisnası | Veritabanı erişim hatası veya diğer genel hatalar |
SQLFeatureNotSupportedException | DBMS bu işlevi desteklemiyor |
SQLIntegrityConstraintViolationException | SQLState için tüm hatalar ==22 |
SQLInvalidAuthorizationSpecException | Erişim ve/veya yetkilendirme hatası |
SQLNonTransientConnectionException | SQLState için tüm hatalar ==08 |
SQLKurtarılabilirİstisna | Hata var ama uygulamanın müdahalesi ile düzeltilebilir. |
SQLSyntaxErrorException | Sorgu söz diziminde hata |
SQLTimeoutException | İstek çok uzun sürdü |
SQLTransactionRollbackException | İşlem geri alma sırasında hata |
SQL Uyarısı | VTYS tarafından verilen uyarı |
Hata örnekleri
Sunucu uygulaması aşamasında bir hata meydana gelirse, genellikle yalnızca günlüğe kaydedilebilir ve ardından daha ayrıntılı olarak ele alınabilir. Ancak bu, programcının bilgisayarında uygulama çalışırken meydana geldiyse, bunun nedenini dikkatlice araştırmanız gerekir.
Bir veritabanıyla çalışırken en büyük iki hata sınıfı vardır:
- Metin hatası iste
- ResultSet ile çalışırken hata oluştu
İstek metninde bir hata çok sık meydana gelebilir. Sorgu çok uzun olabilir, birkaç tablo (JOIN aracılığıyla birleştirilmiş) ve alt sorgular (SUBSELECT) içerebilir. Böyle bir talepte hata bulmak kolay değildir. Ek olarak, istekler genellikle parçalardan yapıştırılır, veriler oraya eklenir.
Farkında olmanız gereken ilk hata SQLSyntaxErrorException hatasıdır . Böyle bir hata genellikle istek gövdesinde bir yazım hatası yaptığınız anlamına gelir.
En sevdiğimiz örneği ele alalım:
ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
results.next();
int count = results.getInt(1);
Ve istek gövdesindeki yıldızı "yanlışlıkla" silin:
ResultSet results = statement.executeQuery("SELECT Count() FROM user");
results.next();
int count = results.getInt(1);
O zaman bir istisna alacağız:
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 sunucusu, FROM'dan önce bir sözdizimi hatası olduğunu söylüyor.
Talebe dikkatlice bakar ve düşünürüz. Aklınıza hiçbir şey gelmiyorsa ve bu çok sık oluyorsa, birinden neyin yanlış olduğuna bakmasını istemeniz gerekir.
Diğer bir popüler hata, ResultSet ile yanlış çalışmadır - isteğin sonucu. Verileri okumadan önce ResultSet nesnesinin “geçerli satırının” ilk satırdan önce geldiğini unuttuğunuzu varsayalım, o zaman aşağıdaki koda sahip olacaksınız:
ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
// results.next();
int count = results.getInt(1);
Bu hatayı alacaksınız:
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)
Hataya dikkatlice bakar ve düşünürüz. Daha sonra Google'da birkaç örnek bulup çözümü anlamaya çalışıyoruz.