Saat ini, kueri perlu mengembalikan hasil yang ditetapkan melalui ExcuteReader, dan pada saat yang sama ingin mengeluarkan parameter. Pada awalnya, saya tidak bisa mendapatkan nilai parameter keluaran, karena mengira prosedur tersimpan mengalami kesalahan. pengujian di penganalisis kueri sudah benar, dan parameter keluaran memang berubah.
Yang lebih membingungkan lagi adalah setelah mengeluarkan pengecualian selama konversi tipe paksa dari keluaran, itu memang dapat diperoleh lagi. Apakah ini bug dari ado.net? Tidak mungkin untuk membayangkan halaman seperti itu API yang umum digunakan muncul. Apakah ini salah? Kode saya mirip dengan skenario berikut:
coba {
menggunakan (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) {
int val = (int)cmd.Parameters[1].Value; // Masih kosong sekarang
// lagi
}
}
tangkapan(Pengecualian exp) {
throw new ApplicationException("Nilai parameter keluaran: " + cmd.Parameters[1].Value, exp // Sekarang nilai keluaran dapat diperoleh
}
Benar-benar membuat frustrasi. Setelah melakukan debug dan pelacakan selama satu jam,
akhirnya saya menemukan jawabannya di MSDN:
Saat Anda menggunakan objek Command dengan prosedur tersimpan, Anda dapat mengatur properti CommandType dari objek Command ke StoredProcedure. Jika CommandType adalah StoredProcedure, Anda dapat menggunakan properti Parameter Perintah untuk mengakses parameter input dan output serta mengembalikan nilai. Terlepas dari metode Execute mana yang dipanggil, properti Parameters dapat diakses. Namun, ketika ExecuteReader dipanggil, nilai kembalian dan parameter output tidak akan dapat diakses sampai DataReader ditutup.
referensi: http://msdn2.microsoft.com/zh-CN/library/tyy0sz6b.aspx
Itu saja. Saya merasa seperti ditipu oleh MS lagi. Kalau dipikir-pikir, mengapa saya kurang berpengalaman dalam belajar? sudah mengubah dokumen dan
kembali ke sana. Lingkungan kode Anda sendiri masih dapat dijelaskan.
Karena ketika Exception ditangkap, cakupan penggunaan telah dilompati, DataReader telah ditutup secara otomatis, dan nilai parameter keluaran dapat diperoleh secara alami.
Tentu saja jika try catch dimasukkan ke dalam use, tetap tidak bisa, karena masih dalam lingkup penggunaan dan DataReader belum ditutup.
Selain itu, MSDN mengatakan bahwa itu hanya dapat diakses jika DataReader ditutup, namun tidak demikian.
Setelah dilakukan pengujian dapat diringkas sebagai berikut:
1. Untuk ExecuteReader, Output parm dan returnvalue dikembalikan ke DataReader sebagai kumpulan hasil, dan kumpulan hasil selalu yang terakhir.
2. Menurut 1, ketika ada kumpulan hasil, untuk mengakses parameter keluaran dan nilai kembalian, Anda perlu memanggil NextResult ke lokasi kumpulan hasil yang sesuai dengan parameter keluaran dan nilai kembalian.
3. Menurut 1, ketika Execute tidak mengembalikan kumpulan hasil, maka dapat diakses secara langsung (perhatikan bahwa tidak perlu memanggil Read())
4. Berikan perhatian khusus pada kebutuhan untuk memanggil NextResult beberapa kali jika beberapa kumpulan hasil dikembalikan; jika jumlah kumpulan hasil dinamis, maka nilai kembalian nextResult() adalah salah.
5. Bahkan jika opsi CommandBehavior.SingleResult ditentukan untuk ExecuteReader (mengembalikan satu kumpulan hasil, pada kenyataannya, mengembalikan kumpulan hasil pertama dari kumpulan), parameter keluaran dikembalikan sebagai kumpulan hasil.
6. Saat menutup DataReader (Close()), parameter output diisi dan karenanya dapat diakses.
7. Karena DataReader hanya bersifat baca-maju, bahkan jika parameter output diperoleh melalui metode NextResult sebelum menutup DataReader, kumpulan hasil sebelumnya tidak dapat diakses lagi (dalam beberapa kasus, Anda mungkin ingin mengontrol kumpulan hasil secara dinamis melalui output parameter.kunjungi).
8. Untuk mengatasi masalah di 6, Anda tidak dapat menggunakan parameter output dan langsung mengembalikan parameter output sebagai hasil pertama (PILIH @parmname).
Di atas hanyalah ringkasan saya sendiri membantu untuk pemula.
referensi:
http://www.bigcircleboy.net/583a194f-2c2c-4662-9036-4e2f0eb262396084313157728108.html