Untuk pembaca masa depan seperti saya: jawaban yang membantu saya adalah dari Felype dan Dermot Doherty
Benj
Jawaban:
238
Itu benar, awalnya ResultSetkursor menunjuk ke sebelum baris pertama, jika panggilan pertama next()kembali falsemaka tidak ada data di ResultSet.
Jika Anda menggunakan metode ini, Anda mungkin harus beforeFirst()segera menelepon untuk meresetnya, karena sudah diposisikan melewati baris pertama sekarang.
Namun perlu dicatat, bahwa jawaban Seifer di bawah ini adalah solusi yang lebih elegan untuk pertanyaan ini.
Namun perlu diingat, jika ada baris, setelah tes itu Anda akan menunjuk ke baris pertama. Jadi, pastikan Anda tidak melewatkan satu baris pun.
Matthew Flaschen
1
Poin yang baik bahwa kursor (pointer) menunjuk pada baris pertama
JohnMerlino
@ MatthewFlaschen, Anda benar, untuk menyelesaikan masalah lewati baris pertama, saya menggunakan do {...} while (rs.next);
Israel
8
Anda juga bisa langsung menelepon isBeforeFirst()untuk menguji apakah ada baris yang dikembalikan tanpa memajukan kursor, lalu lanjutkan secara normal.
SnakeDoc
528
Dengan asumsi Anda bekerja dengan ResultSetkursor yang baru dikembalikan yang menunjuk sebelum baris pertama, cara yang lebih mudah untuk memeriksa ini adalah dengan menelepon saja isBeforeFirst(). Ini menghindari harus kembali melacak jika data akan dibaca.
Seperti dijelaskan dalam dokumentasi , ini mengembalikan false jika kursor tidak sebelum rekaman pertama atau jika tidak ada baris di ResultSet .
Terima kasih, ya saya tahu tetapi saya mengalami masalah yang sama dan tidak senang dengan tampilan bergerak maju untuk memeriksa lalu mundur untuk membaca. Saya pikir solusi sederhana ini akan bermanfaat bagi orang lain yang berada dalam situasi yang sama juga.
Seifer
5
Perhatikan bahwa, setidaknya untuk DB2, set hasil harus tipe "scrollable". Ini dapat diatur saat Anda membuat pernyataan yang akan dieksekusi.
while( resultSet.next()){// Read the next item
resultSet.getString("columnName");}
Jika Anda ingin melaporkan set kosong, tambahkan variabel yang menghitung item yang dibaca. Jika Anda hanya perlu membaca satu item, maka kode Anda memadai.
Terbaik untuk menggunakan ResultSet.next () bersama dengan sintaks do {...} while () untuk ini.
Panggilan "periksa untuk hasil apa saja" ResultSet.next () memindahkan kursor ke baris pertama, jadi gunakan sintaks do {...} while () untuk memproses baris itu sambil terus memproses baris yang tersisa yang dikembalikan oleh loop.
Dengan cara ini Anda bisa memeriksa hasil apa pun, sementara pada saat yang sama juga memproses hasil apa pun yang dikembalikan.
if(resultSet.next()){// Checks for any results and moves cursor to first row,do{// Use 'do...while' to process the first row, while continuing to process remaining rows}while(resultSet.next());}
Menurut jawaban yang paling layak, saran adalah menggunakan "isBeforeFirst ()". Itu bukan solusi terbaik jika Anda tidak memiliki "tipe forward only" .
Ada metode yang disebut " .first () ". Kurang banyak kerja keras untuk mendapatkan hasil yang sama persis. Anda memeriksa apakah ada sesuatu di "resultset" Anda dan tidak memajukan kursor Anda.
Dokumentasi menyatakan: "(...) false jika tidak ada baris di set hasil ".
if(rs.first()){//do stuff }
Anda juga dapat memanggil isBeforeFirst () untuk menguji apakah ada baris yang dikembalikan tanpa memajukan kursor, kemudian lanjutkan secara normal. - SnakeDoc 2 Sep 14 'jam 19:00
Namun, ada perbedaan antara "isBeforeFirst ()" dan "first ()". Pertama menghasilkan pengecualian jika dilakukan pada resultset dari tipe "forward only".
Oke, pada dasarnya ini berarti Anda harus menggunakan "isBeforeFirst" selama Anda memiliki tipe "forward only". Kalau tidak, itu kurang berlebihan untuk menggunakan "first ()".
Bagaimana "kurang boros" untuk mendapatkan hasil yang sama persis? Menurut saya tujuan first () adalah memindahkan kursor ke baris pertama jika belum ada (dan mengembalikan true jika berhasil). isBeforeFirst hanya fungsi diagnostik murni dan tampaknya lebih cocok untuk tujuan penulis. Plus, cara first () adalah worded, ia mengembalikan true selama itu "pada baris yang valid" ... yang aneh karena orang akan berpikir itu akan dituliskan sebagai "pada baris pertama". Bagi saya, saya tidak melihat keuntungan menggunakan first () dalam skenario ini kecuali jika kursor Anda telah maju dan Anda ingin membawanya kembali ke awal.
Jon
5
Itu akan berhasil jika Anda ingin melihat apakah ada baris di set hasil ya.
Perhatikan bahwa next()selalu pindah ke baris berikutnya, jadi jika Anda berencana melakukan pembacaan dari set hasil, Anda harus mempertimbangkannya.
Penggunaan biasa dengan ResultSet (ketika hanya membaca) adalah:
while(resultSet.next()){... read from the row here ...}
Yang jelas tidak akan berfungsi dengan benar jika Anda dipanggil next()sekali untuk memeriksa apakah hasil yang disetel kosong, jadi waspadalah. Meskipun ada metode untuk "membuat cadangan", mereka tidak didukung untuk semua jenis set hasil.
Tapi itu memindahkan kursor ke baris pertama yang tidak perlu, dan itu dapat membingungkan penggunaan lebih lanjut dari objek "reset" ob dan mungkin kehilangan data
Tigran Babajanyan
Meskipun ini terlihat lebih baik, itu tidak akan bekerja pada hasil kursor maju hanya.
eliteproxy
1
Hal terbaik untuk dilakukan adalah memeriksa baris pertama sehingga ketika Anda berniat untuk mendapatkan data, Anda dapat menghindari kesalahan melewatkan satu baris. Sesuatu seperti: if (! ResultSet.first ()) {System.out.println ("no data"); }
Saya telah mencoba untuk mengatur baris saat ini ke indeks pertama (berurusan dengan kunci utama). saya akan menyarankan
if(rs.absolute(1)){System.out.println("We have data");}else{System.out.println("No data");}
Ketika ResultSet diisi, itu menunjuk ke sebelum baris pertama. Ketika mengaturnya ke baris pertama (ditunjukkan oleh rs.absolute(1)), ia akan mengembalikan true yang menunjukkan bahwa ia berhasil ditempatkan di baris 1, atau false jika baris itu tidak ada. Kami dapat memperkirakan ini untuk
for(int i=1; rs.absolute(i); i++){//Code}
yang mengatur baris saat ini ke posisi i dan akan gagal jika baris tidak ada. Ini hanyalah metode alternatif untuk
Saya membuat metode berikut untuk memeriksa apakah ResultSet kosong.
publicstaticboolean resultSetIsEmpty(ResultSet rs){try{// We point the last row
rs.last();int rsRows=rs.getRow();// get last row numberif(rsRows ==0){returntrue;}// It is necessary to back to top the pointer, so we can see all rows in our ResultSet object.
rs.beforeFirst();returnfalse;}catch(SQLException ex){returntrue;}}
Sangat penting untuk memiliki pertimbangan berikut:
Objek CallableStatement harus ditetapkan untuk membiarkan objek ResultSet pergi di akhir dan kembali ke atas.
TYPE_SCROLL_SENSITIVE : Objek ResultSet dapat bergeser di akhir dan kembali ke atas. Selanjutnya dapat menangkap perubahan terakhir.
CONCUR_READ_ONLY : Kita dapat membaca data objek ResultSet, tetapi tidak dapat memperbarui.
int getRow()throwsSQLExceptionRetrieves the current row number.The first row is number 1, the second number 2, and so on.Note:Supportfor the getRow method is optional forResultSets with a result set type of TYPE_FORWARD_ONLY
Returns:
the current row number;0if there is no current row
Throws:SQLException-if a database access error occurs or this method is called on a closed result set
SQLFeatureNotSupportedException-if the JDBC driver does not support this method
Since:1.2
Bagi saya periksa "jika (rs.getRow ()! = 0)" tampaknya berfungsi dengan baik.
ResultSet rs = rs.executeQuery();if(rs.next()){
rs = rs.executeQuery();while(rs.next()){//do code part}}else{//else if no result set}
Lebih baik mengeksekusi query karena ketika kita memanggil if(rs.next()){....}baris pertama ResultSet akan dieksekusi dan setelah itu di dalam while(rs.next()){....}kita akan mendapatkan hasil dari baris berikutnya. Jadi saya pikir eksekusi ulang query di dalam ifadalah pilihan yang lebih baik.
-1 Ini bukan opsi yang lebih baik. Mengapa meminta database dua kali? Bagaimana jika data berubah secara drastis di antara panggilan? Ini sia-sia.
Toby Caulk
-2
Awalnya, objek set hasil (rs) menunjuk ke BFR (sebelum catatan pertama). Setelah kita menggunakan rs.next (), kursor menunjuk ke catatan pertama dan rs memegang "true". Menggunakan loop sementara Anda bisa mencetak semua catatan tabel. Setelah semua catatan diambil, kursor bergerak ke ALR (Setelah catatan terakhir) dan akan diatur ke nol. Mari kita perhatikan bahwa ada 2 catatan dalam tabel.
if(rs.next()==false){// there are no records found}while(rs.next()==true){// print all the records of the table}
Singkatnya, kita juga dapat menuliskan kondisi sebagai while (rs.next ()).
Loop sementara Anda tidak akan mendapatkan kesempatan untuk beroperasi di baris pertama yang dikembalikan, yang tampaknya merupakan kesalahan yang agak fatal dengan pendekatan ini. Ada banyak saran di atas yang lebih baik dari yang ini.
Jawaban:
Itu benar, awalnya
ResultSet
kursor menunjuk ke sebelum baris pertama, jika panggilan pertamanext()
kembalifalse
maka tidak ada data diResultSet
.Jika Anda menggunakan metode ini, Anda mungkin harus
beforeFirst()
segera menelepon untuk meresetnya, karena sudah diposisikan melewati baris pertama sekarang.Namun perlu dicatat, bahwa jawaban Seifer di bawah ini adalah solusi yang lebih elegan untuk pertanyaan ini.
sumber
isBeforeFirst()
untuk menguji apakah ada baris yang dikembalikan tanpa memajukan kursor, lalu lanjutkan secara normal.Dengan asumsi Anda bekerja dengan
ResultSet
kursor yang baru dikembalikan yang menunjuk sebelum baris pertama, cara yang lebih mudah untuk memeriksa ini adalah dengan menelepon sajaisBeforeFirst()
. Ini menghindari harus kembali melacak jika data akan dibaca.Seperti dijelaskan dalam dokumentasi , ini mengembalikan false jika kursor tidak sebelum rekaman pertama atau jika tidak ada baris di ResultSet .
sumber
Anda selalu bisa melakukan yang berikutnya di depan, dan hanya melakukan pemeriksaan post loop
sumber
Anda biasanya akan melakukan sesuatu seperti ini:
Jika Anda ingin melaporkan set kosong, tambahkan variabel yang menghitung item yang dibaca. Jika Anda hanya perlu membaca satu item, maka kode Anda memadai.
sumber
Agar benar-benar yakin bahwa resultset kosong atau tidak terlepas dari posisi kursor, saya akan melakukan sesuatu seperti ini:
Fungsi ini akan mengembalikan true jika ResultSet kosong, false jika tidak atau melempar SQLException jika ResultSet ditutup / tidak diinisialisasi.
sumber
Terbaik untuk menggunakan ResultSet.next () bersama dengan sintaks do {...} while () untuk ini.
Panggilan "periksa untuk hasil apa saja" ResultSet.next () memindahkan kursor ke baris pertama, jadi gunakan sintaks do {...} while () untuk memproses baris itu sambil terus memproses baris yang tersisa yang dikembalikan oleh loop.
Dengan cara ini Anda bisa memeriksa hasil apa pun, sementara pada saat yang sama juga memproses hasil apa pun yang dikembalikan.
sumber
Menurut jawaban yang paling layak, saran adalah menggunakan "isBeforeFirst ()". Itu bukan solusi terbaik jika Anda tidak memiliki "tipe forward only" .
Ada metode yang disebut " .first () ". Kurang banyak kerja keras untuk mendapatkan hasil yang sama persis. Anda memeriksa apakah ada sesuatu di "resultset" Anda dan tidak memajukan kursor Anda.
Dokumentasi menyatakan: "(...) false jika tidak ada baris di set hasil ".
Namun, ada perbedaan antara "isBeforeFirst ()" dan "first ()". Pertama menghasilkan pengecualian jika dilakukan pada resultset dari tipe "forward only".
Bandingkan dua bagian lemparan: http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#isBeforeFirst () http://docs.oracle.com/javase/7/docs /api/java/sql/ResultSet.html#first ()
Oke, pada dasarnya ini berarti Anda harus menggunakan "isBeforeFirst" selama Anda memiliki tipe "forward only". Kalau tidak, itu kurang berlebihan untuk menggunakan "first ()".
sumber
Itu akan berhasil jika Anda ingin melihat apakah ada baris di set hasil ya.
Perhatikan bahwa
next()
selalu pindah ke baris berikutnya, jadi jika Anda berencana melakukan pembacaan dari set hasil, Anda harus mempertimbangkannya.Penggunaan biasa dengan ResultSet (ketika hanya membaca) adalah:
Yang jelas tidak akan berfungsi dengan benar jika Anda dipanggil
next()
sekali untuk memeriksa apakah hasil yang disetel kosong, jadi waspadalah. Meskipun ada metode untuk "membuat cadangan", mereka tidak didukung untuk semua jenis set hasil.sumber
Saya yakin ini adalah bacaan yang praktis dan mudah dibaca.
sumber
isAfterLast()
juga mengembalikan false untuk hasil yang kosong, tetapi karena kursor ada sebelum baris pertama, metode ini tampaknya lebih jelas.sumber
Karena jika ResultSet tidak memiliki mentah maka
resultSet.first
mengembalikan false.sumber
Hal terbaik untuk dilakukan adalah memeriksa baris pertama sehingga ketika Anda berniat untuk mendapatkan data, Anda dapat menghindari kesalahan melewatkan satu baris. Sesuatu seperti: if (! ResultSet.first ()) {System.out.println ("no data"); }
sumber
Dengan menggunakan resultSet.next () Anda dapat dengan mudah mendapatkan hasilnya, apakah resultSet mengandung nilai apa pun atau tidak
sumber
sumber
Saya telah mencoba untuk mengatur baris saat ini ke indeks pertama (berurusan dengan kunci utama). saya akan menyarankan
Ketika ResultSet diisi, itu menunjuk ke sebelum baris pertama. Ketika mengaturnya ke baris pertama (ditunjukkan oleh
rs.absolute(1)
), ia akan mengembalikan true yang menunjukkan bahwa ia berhasil ditempatkan di baris 1, atau false jika baris itu tidak ada. Kami dapat memperkirakan ini untukyang mengatur baris saat ini ke posisi i dan akan gagal jika baris tidak ada. Ini hanyalah metode alternatif untuk
sumber
Saya membuat metode berikut untuk memeriksa apakah ResultSet kosong.
Sangat penting untuk memiliki pertimbangan berikut:
Objek CallableStatement harus ditetapkan untuk membiarkan objek ResultSet pergi di akhir dan kembali ke atas.
TYPE_SCROLL_SENSITIVE : Objek ResultSet dapat bergeser di akhir dan kembali ke atas. Selanjutnya dapat menangkap perubahan terakhir.
CONCUR_READ_ONLY : Kita dapat membaca data objek ResultSet, tetapi tidak dapat memperbarui.
sumber
Saya pikir cara termudah untuk memeriksa set hasil adalah melalui CollectionUtils di bawah paket org.apache.commons.collections.CollectionUtils
Ini akan memeriksa kondisi hasil nol dan kosong yang ditetapkan.
Untuk informasi lebih detail Anda dapat merujuk ke dokumen berikut. KoleksiUtils
sumber
Mengapa tidak menggunakan rs.getRow ()?
Bagi saya periksa "jika (rs.getRow ()! = 0)" tampaknya berfungsi dengan baik.
sumber
Anda dapat melakukan sesuatu seperti ini
sumber
Lebih baik mengeksekusi query karena ketika kita memanggil
if(rs.next()){....}
baris pertama ResultSet akan dieksekusi dan setelah itu di dalamwhile(rs.next()){....}
kita akan mendapatkan hasil dari baris berikutnya. Jadi saya pikir eksekusi ulang query di dalamif
adalah pilihan yang lebih baik.sumber
Awalnya, objek set hasil (rs) menunjuk ke BFR (sebelum catatan pertama). Setelah kita menggunakan rs.next (), kursor menunjuk ke catatan pertama dan rs memegang "true". Menggunakan loop sementara Anda bisa mencetak semua catatan tabel. Setelah semua catatan diambil, kursor bergerak ke ALR (Setelah catatan terakhir) dan akan diatur ke nol. Mari kita perhatikan bahwa ada 2 catatan dalam tabel.
Singkatnya, kita juga dapat menuliskan kondisi sebagai while (rs.next ()).
sumber