:
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.
while ifadesinde rs.next() yöntemini kullanmaya çalıştığımda aynı hatayı alıyorum. – aphex
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
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." –