2010-03-30 22 views
5

SonuçSetSet nasıl yineleyebilir? Aşağıdaki kod ile denedim, ancak java.sql.SQLException: boş sonuç kümesinde geçersiz işlem hatası alıyorum.SQL ile sorun, ResultSet java

Güncelleştirme: Sorunu buldum. SQL singleton'dan sadece bir ifade kullandım. Deyim kapatıldığında tekrar kullanılamaz. JDBC tutorial gereğince

cevap

11

:

resultSet = statement.executeQuery(); 
while (resultSet.next()) { 
    int id = resultSet.getInt("id"); 
    // ... 
} 

ResultSet#next() hamle onun bulunduğunuz konumdan ileri bir satırda imleç ve yeni akım satır geçerli olup olmadığını true döndürür. Böylece, while döngü daha fazla satır olmadığında otomatik olarak durur.

o sıfır veya bir satır yerine birden fazla satır döndürür sonra yerine yerine if kullanmak gerekiyorduysa:

resultSet = statement.executeQuery(); 
if (resultSet.next()) { 
    int id = resultSet.getInt("id"); 
    // ... 
} 

bir else eklemek fırsatınız olur.

numaralı güncelleştirme, gerçek sorunla ilgili ve bununla ilgisi olmayan, kodunuzda daha fazla olası sorun görüyorum: ilk olarak, birbirine bağımlı birden çok sorguyu tetikliyor gibi görünüyorsunuz. Bu daha verimli yapılabilir. SQL Joins ile tanıyor musunuz? İkincisi, JDBC kaynaklarını sızdırmıyor musunuz? Bir ifade aldığınıza benziyor, ancak kullanımdan sonra düzgün bir şekilde kapatabilmeniz için bir işlem yapmıyorsunuz. JDBC kodunun düzgün bir şekilde nasıl çalıştırılacağını öğrenmek için JDBC öğreticisine başvurmadan önce, JDBC kodunun düzgün bir şekilde nasıl çalıştırılacağına dair temel açıklama örnekleri için this article ile nasıl çalışacağınızı öğrenin. Aksi halde, DB kaynak yetersiz kaldığında başvurunuz er ya da geç çökebilir.

+0

while ifadesinde rs.next() yöntemini kullanmaya çalıştığımda aynı hatayı alıyorum. – aphex

+0

Yeni alınmış bir sonuç kümesinde 'next()' öğesini çağırırken 'Boş sonuç kümesinde Yasadışı işlem 'olanaksız bir şekilde alabilirsiniz. Senin problemin başka bir yerde yatıyor. Ya yanlış sonuçlara erişiyorsunuz ya da istisnayı ve/veya neden olduğu kod satırını yanlış yorumluyorsunuz. – BalusC

+0

Eğer "getSt" (tam kelimeleri kullanmamı öneririm) aynı "Deyim" değerini döndürürse, o zaman bir sızıntı değildir. JDBC'm çok paslı, 'İfade' hakkında başka bir açıklama yürütürken bir yineleyici kullanmaya devam etmenize izin veriyor musunuz (kötü bir benzetme: üzerinde yinelenen bir koleksiyon mutasyona uğratıyor)? Her neyse, dinamik SQL yerine 'PreparedStatement' kullanın. Düzenleme: "Bildirim" API'sinin ikinci satırı: "Varsayılan olarak, her bir Statement nesnesine yalnızca bir ResultSet nesnesi aynı anda açılabilir." –

2
while(rs.next()) { 
    // iterate 
}