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.