ASP Kuliah 8: ASP dan Database (3)
Penulis:Eve Cole
Waktu Pembaruan:2009-05-30 19:55:00
Dalam dua kuliah terakhir, kami menjelaskan penggunaan dasar database di ASP. Hari ini kami akan memperkenalkan beberapa teknologi yang sangat praktis.
1. Teknologi paging Kami telah memperkenalkan cara mengambil data dan mengeluarkannya ke browser. Untuk sejumlah kecil data, pemrosesan keluaran sederhana seperti itu dapat diterima. Namun, jika jumlah datanya besar, dengan ratusan atau bahkan ribuan item , Tidak realistis untuk mengeluarkan begitu banyak data ke klien sekaligus. Pertama, halamannya membentang sangat panjang dari atas ke bawah. Kedua, klien menunggu terlalu lama. Ketiga, beban di server terlalu berat. Jadi sangat penting untuk mengambil keluaran halaman.
Persyaratan: Keluarkan data dalam tabel "Produk" Northwind.mdb ke browser, dan tampilkan 10 item di setiap halaman.
Ambil wuf60.asp sebagai contoh. Kode ini masih agak sulit. Anda perlu membaca lebih banyak dan lebih banyak mengalaminya.
Catatan: Rutinitas ini menggabungkan bagian-bagian bagus dari beberapa buku, dan dengan ini dinyatakan.
<%@ LANGUAGE="VBSCRIPT" %>
<!--#include file="AdoAccess.asp"-->
<!--#termasuk file="adovbs.inc"-->
<%
Redupkan RecordPerPage, absPageNum, TotalPages, absRecordNum, rsTest, StrSQL
'absPageNum - Halaman manakah yang merupakan halaman saat ini?
'TotalPages - Jumlah total halaman
'absRecordNum - nomor seri catatan di halaman saat ini, misalnya 1-10
RecordPerPage = 10 'Jumlah record yang ditampilkan per halaman
' Dapatkan nomor halaman saat ini dari data keluaran
Jika Request.ServerVariables("CONTENT_LENGTH") = 0 Maka
'Jika data yang dikirimkan oleh formulir tidak diterima (seperti saat halaman pertama kali dimuat), maka akan ditampilkan dari halaman 1
absPageNum = 1
Kalau tidak
'Dapatkan nomor halaman saat menekan tombol
absPageNum = CInt(Permintaan.Form("PressPageNum"))
'Jika Anda menekan halaman sebelumnya, nomor halamannya -1, jika Anda menekan halaman berikutnya, nomor halamannya +1
Jika Request.Form("Kirim") = "Halaman sebelumnya" Lalu
absPageNum = absPageNum - 1
ElseIf Request.Form("Kirim") = "Halaman berikutnya" Lalu
absPageNum = absPageNum + 1
Akhiri Jika
Akhiri Jika
'Buat objek kumpulan rekaman
Setel rsTest = Server.CreateObject("ADODB.Recordset")
rsTest.CursorLocation = adUseClient 'Pengaturan ini dapat mengurangi beban database
rsTest.CursorType = adOpenStatic 'Kursor harus bergerak maju dan mundur dan tidak dapat diatur untuk maju saja
rsTest.CacheSize = RecordPerPage 'Mengatur opsi ini akan meningkatkan kinerja
StrSQL = "PILIH * DARI Pesanan Produk Berdasarkan ID Produk"
rsTest.Buka StrSQL, Cnn, , , adCmdText
rsTest.PageSize = RecordPerPage 'Tetapkan jumlah record per halaman
Jika Tidak(rsTest.EOF) Lalu
rsTest.AbsolutePage = absPageNum
Akhiri Jika
TotalPages = rsTest.PageCount
%>
<% 'Bagian berikut menampilkan data halaman saat ini ke browser%>
<Html><Boby>
<tabel colspan=8 cellpadding=5 batas=0>
<tr>
<td align=CENTER bgcolor="#800000" width="109"> <font style="ARIAL NARROW" color="#ffffff" size="2">Harga satuan</font></td>
<td align=CENTER width=459 bgcolor="#800000"> <font style="ARIAL NARROW" color="#ffffff" size="2">Nama produk</font></td>
</tr>
<% 'Gunakan loop untuk menampilkan 10 buah data pada halaman saat ini
Untuk absRecordNum = 1 hingga rsTest.PageSize
%>
<tr>
<td bgcolor="f7efde" align=CENTER> <font style="ARIAL NARROW" size="2"><%= rsTest("harga satuan")%></font></td>
<td bgcolor="f7efde" align=CENTER> <font style="ARIAL NARROW" size="2"><%= rsTest("Nama Produk")%></font></td>
</tr>
<%
rsTest.MoveNext
Jika rsTest.EOF Lalu
Keluar Untuk ' Jika akhir rekaman telah tercapai, keluar - jika halaman terakhir data belum penuh.
Akhiri Jika
Berikutnya
rsTest.Tutup : Cnn.Tutup
Setel rsTest = Tidak Ada : Setel Cnn = Tidak Ada
%>
</tabel>
<% 'Bagian bawah ada dua tombol "Halaman Sebelumnya" "Halaman Berikutnya" %>
<Formulir Tindakan = "<%= Permintaan.ServerVariables("SCRIPT_NAME") %>" Metode="Posting">
<Jenis Masukan="Tersembunyi" Nama="PressPageNum" Value="<%= absPageNum%>">
<%
Jika absPageNum > 1 Lalu 'Jika halaman saat ini bukan halaman pertama, tampilkan tombol halaman sebelumnya%>
<Input Type="Kirim" Nama="Kirim" Nilai="Halaman Sebelumnya">
<% Akhir Jika
Jika absPageNum <> TotalPages Lalu 'Jika halaman saat ini bukan halaman terakhir, tampilkan tombol halaman berikutnya%>
<Input Type="Kirim" Nama="Kirim" Nilai="Halaman berikutnya">
<% Selesai Jika %>
</Formulir>
<P><Pusat> [Halaman<font color="#CC0033"><%= absPageNum %></font>,
Total<font color="#CC0033"><%= TotalPages %></font> halaman] </Center></P>
</BODI></HTML>
menganalisa:
1. Beberapa properti yang berguna dari objek Recordset:
l rsTest.CursorLocation = adUseClient: Anda juga dapat menghilangkan kalimat ini, namun hal ini dapat mengurangi beban database;
l rsTest.CacheSize = RecordPerPage: Atribut CacheSize digunakan untuk menentukan berapa banyak data yang diperoleh klien dari server database setiap kali;
l rsTest.PageSize: Atribut PageSize digunakan untuk mengatur jumlah record pada setiap halaman;
l rsTest.AbsolutePage: Properti AbsolutePage menetapkan jumlah absolut halaman data saat ini dalam objek Recordset;
l rsTest.PageCount: Properti PageCount digunakan untuk mendapatkan jumlah total halaman dalam kumpulan catatan.
2. Contoh Formulir ini menggunakan bidang tersembunyi PressPageNum untuk meneruskan halaman ketika tombol diklik.
2. Penanganan kesalahan Selama eksekusi kode, kesalahan dapat terjadi karena berbagai alasan, seperti: masalah dengan kode itu sendiri, pemutusan jaringan, dll, sehingga sangat perlu untuk mengatur penangkapan dan pemrosesan kesalahan dalam program. Di ASP, kita bisa mendapatkan informasi kesalahan atau peringatan yang terjadi saat kode dijalankan melalui pengumpulan data Errors pada objek Connection.
1. Gunakan langsung pada objek Connection:
Setel Errs = Cnn.Errors
atau
Cnn.Kesalahan
2. Setelah membuat objek Recordset atau objek Command, gunakan objek Connection melalui properti ActiveConnection:
Setel Errs = rsTest.ActiveConnection.Errors
atau
rsTest.ActiveConnection.Errors
Kedengarannya terlalu kasar untuk dikatakan, jadi mari kita beri contoh: wuf61.asp
<%@ LANGUAGE="VBSCRIPT" %>
<% Opsi Eksplisit %>
<!--#termasuk file="adovbs.inc"-->
<%
Respon. Kedaluwarsa = 0
'Kalimat berikut menjamin: Sekalipun skrip mengalami kesalahan, skrip akan terus menjalankan kalimat berikutnya
Pada Kesalahan Lanjutkan Berikutnya
Redupkan Cnn, rsTest, Errs, I
Setel Cnn = Server.CreateObject("ADODB.Connection")
'CommandTimeout - waktu tunggu maksimum untuk menghubungkan ke database, defaultnya adalah 15 detik
Cnn.CommandTimeout = 5
'Anda dapat mendeteksi kesalahan dalam tiga situasi berikut - dengan menggunakan SQL Server sebagai contoh
'1 - sepenuhnya benar; 2 - database awal tidak disetel; 3 - nama database salah pvbs
Cnn.Buka "Penyedia=sqlledb; ID Pengguna=sa; Kata Sandi=; Katalog Awal=pub; Sumber Data=ICBCZJP"
'Cnn.Open "Penyedia=sqlledb; ID Pengguna=sa; Kata Sandi=; Katalog Awal=; Sumber Data=ICBCZJP"
'Cnn.Open "Penyedia=sqlledb; ID Pengguna=sa; Kata Sandi=; Katalog Awal=pvbs; Sumber Data=ICBCZJP"
Untuk I = 0 Ke Cnn.Errors.Count - 1
'Atribut sumber menunjukkan sumber kesalahan
Respon.Tulis "[ " & Cnn.Errors(I).Sumber & " ] "
'Atribut deskripsi menunjukkan alasan atau deskripsi kesalahan
Response.Write Cnn.Errors(I).Deskripsi & "<br>"
Berikutnya
Jika Cnn.Errors.Count > 0 Lalu
Response.Tulis "Terjadi saat menghubungkan" & Cnn.Errors.Count & " error" & "<br>"
Akhiri Jika
Setel rsTest = Server.CreateObject("ADODB.Recordset")
rsTest.Buka "pekerjaan",Cnn,adOpenForwardOnly,adLockReadOnly,adCmdTable
Jika rsTest.ActiveConnection.Errors.Count > 0 Lalu
Setel Sesi("Errs") = rsTest.ActiveConnection.Errors
Respons.Redirect "ErrorHandle.asp"
Akhiri Jika
Cnn.Tutup
Setel rsTest = Tidak Ada : Setel Cnn = Tidak Ada
%>
Kode ErrorHandle.asp:
<%
Redupkan aku
Untuk I = 0 Ke Sesi("Errs").Hitungan - 1
Respon.Tulis "[ " & Sesi("Errs")(I).Sumber & " ] "
Response.Sesi Tulis("Errs")(I).Deskripsi & "<br>"
Berikutnya
%>
menganalisa:
Dalam hal ini, kesalahan mungkin terjadi saat menghubungkan, atau koneksi mungkin benar, namun kesalahan terjadi saat menggunakan objek Recordset.
Selain itu, pada potongan kode berikut, kumpulan kesalahan dimasukkan ke dalam objek sesi sehingga dapat dipanggil antar halaman (bila terjadi kesalahan, buka halaman penanganan kesalahan ErrorHandle.asp).
Bahkan, Anda juga dapat menetapkan objek Recordset ke objek Session untuk mengimplementasikan pemanggilan recordset antar halaman.
3. Konsep penggunaan transaksi sangat sederhana dan penting. Untuk mengilustrasikan penggunaannya, mari kita asumsikan terlebih dahulu situasi berikut: Misalnya, dalam e-commerce, saat melakukan transfer mata uang secara online, sejumlah tertentu harus dikurangi dari suatu jumlah. akun.jumlah dan tambahkan jumlah yang setara ke akun lain. Tidak peduli pembaruan mana yang gagal, itu akan menyebabkan ketidakseimbangan saldo akun (ada pengurangan di sini, tetapi tidak ada peningkatan di sana; atau tidak ada pengurangan di sini, tetapi ada peningkatan di sana) . Jika Anda menggunakan transaksi untuk melakukan perubahan ini, Anda memastikan bahwa Anda hanya dapat memilih untuk melakukan semua perubahan atau tidak melakukan perubahan (baik sepenuhnya benar atau dibatalkan sepenuhnya).
Transaksi milik objek Connection, yang memiliki tiga metode terkait transaksi:
l BeginTrans memulai transaksi baru.
l CommitTrans menyimpan semua perubahan dan mengakhiri transaksi saat ini.
l RollbackTrans membatalkan segala perubahan yang dilakukan pada transaksi saat ini dan mengakhiri transaksi, sering disebut "rollback".
Kita mungkin juga melihat contoh wuf62.asp.
<%@ LANGUAGE="VBSCRIPT" %>
<% Opsi Eksplisit %>
<!--#termasuk file="adovbs.inc"-->
<%
Respon. Kedaluwarsa = 0
Pada Kesalahan Lanjutkan Berikutnya
DimCnn, StrSQL, rsTest
Setel Cnn = Server.CreateObject("ADODB.Connection")
Cnn.Buka "Penyedia=sqlledb; ID Pengguna=sa; Kata Sandi=; Katalog Awal=pub; Sumber Data=ICBCZJP"
'Mulailah transaksi
CNN.BeginTrans
StrSQL = "Masukkan nilai pekerjaan(job_desc, min_lvl, max_lvl)('Keuangan',16,86)"
Cnn.Jalankan StrSQL
'Kalimat pertama di bawah ini salah, kalimat kedua benar
StrSQL = "Perbarui jobs_err SET job_desc = 'Transaksi' Dimana job_id = 14"
'StrSQL = "Perbarui pekerjaan SET job_desc = 'Transaksi' Dimana job_id = 14"
Cnn.Jalankan StrSQL
Jika Cnn.Errors.Count > 0 Lalu
Response.Write "Terjadi kesalahan, sistem mengembalikan keadaan pada awal transaksi, tidak akan dilakukan penambahan atau modifikasi baru" & "<br>"
Cnn.RollbackTrans
Kalau tidak
Response.Tulis "Tidak ada kesalahan, simpan perubahan ke database, tambahkan data baru, ubah data" & "<br>"
CNN.CommitTrans
Akhiri Jika
Setel rsTest = Cnn.Execute("Pilih * Dari pekerjaan di mana job_id>=14")
Meskipun Bukan rsTest.EOF
Respon.Tulis tes pertama(0) & tes pertama(1) & tes pertama(2) & tes pertama(3) & "<br>"
rsTest.MoveNext
Pergi ke
'Contoh ini hanya untuk pengujian, jadi kembalikan data asli database
Cnn.Jalankan "Perbarui pekerjaan SET job_desc = 'Desainer' Di mana job_id = 14"
Cnn.Jalankan "HAPUS pekerjaan Dimana job_id > 14"
Cnn.Tutup: Setel Cnn = Tidak Ada
%>
Dalam contoh ini, Sisipkan dan Perbarui terjadi pada saat yang sama atau tidak terjadi keduanya. Tidak akan ada situasi di mana sebagian data ditambahkan tetapi modifikasi tidak terjadi karena kesalahan pernyataan. Menggunakan transaksi adalah kebiasaan yang sangat baik ketika memprogram database.
4. Pemrosesan beberapa kumpulan catatan Kadang-kadang kita perlu mendapatkan data dari dua tabel secara bersamaan. Jika dikembalikan dalam satu pernyataan SQL, transmisi jaringan dapat dikurangi dan efisiensi operasi ditingkatkan.
Ambil wuf64.asp sebagai contoh. Contoh ini juga menjelaskan cara menggunakan loop untuk menghasilkan nilai bidang (di masa lalu, kami menggunakan metode bodoh seperti "rsTest(0) & rsTest(1) &..." untuk menghasilkan Jika fieldnya hanya dua atau tiga, cara ini jelas lebih ringkas), jika saat ini Anda belum bisa memahaminya, silakan download wuf63.asp yang lebih sederhana, ingat! .
<%@ LANGUAGE="VBSCRIPT" %>
<%
Opsi Eksplisit
Respon. Kedaluwarsa = 0
Redupkan Cnn, StrSQL, rsTest, I
Setel Cnn = Server.CreateObject("ADODB.Connection")
Cnn.Buka "Penyedia=sqlledb; ID Pengguna=sa; Kata Sandi=; Katalog Awal=pub; Sumber Data=ICBCZJP"
Setel rsTest = Server.CreateObject("ADODB.Recordset")
'Ambil beberapa kumpulan data
StrSQL = "Pilih COUNT(*) SEBAGAI 'Jumlah karyawan' Dari karyawan; Pilih * Dari pekerjaan"
rsTest.Buka StrSQL, Cnn ', , ,adCmdText
Meskipun Bukan rsTest Bukan Apa-apa
Respon.Tulis "<Batas Tabel = 2><tr>"
'rsTest.Fields.Count - Jumlah bidang dalam kumpulan data
Untuk I = 0 Ke rsTest.Fields.Count - 1
'rsTest(I).Name - nama bidang dari bidang I
Respon.Tulis "<td>" & rsTest(I).Nama & "</td>"
Berikutnya
Respon.Tulis "</tr>"
Meskipun Bukan rsTest.EOF
Respon.Tulis "<tr>"
'Gunakan loop untuk menampilkan nilai setiap bidang
Untuk I = 0 Ke rsTest.Fields.Count - 1
Respon.Tulis "<td>" & rsTest(I) & "</td>"
Berikutnya
Respon.Tulis "</tr>"
rsTest.MoveNext
Pergi ke
'Baca objek Recordset berikutnya
Setel rsTest = rsTest.NextRecordset
Pergi ke
Cnn.Tutup
Setel rsTest = Tidak Ada: Setel Cnn = Tidak Ada
%>
Catatan: Database SQL Server mendukung beberapa kumpulan data, namun database Access tidak.
5. Tutup koneksi sedini mungkin untuk melepaskan sumber daya
Pada contoh sebelumnya, koneksi ditutup terakhir kali, namun objek Connection memakan sumber daya. Faktanya, menurut metode yang disediakan oleh wuf65.asp di bawah ini, koneksi dapat ditutup lebih awal.
<% @LANGUAGE = VBScript %>
<!--#include file="AdoAccess.asp"-->
<!--#termasuk file="adovbs.inc"-->
<% ' wuf65.asp
Redupkan StrSQL, rsTest
StrSQL = "Pilih * Dari pengirim"
Setel rsTest = server.CreateObject("ADODB.Recordset")
'Anda harus menggunakan kursor klien, jika tidak maka tidak akan berfungsi
rsTest.CursorLocation = adUseClient
rsTest.Buka StrSQL,Cnn,,,adCmdText
'Hapus ketergantungan recordset pada objek Connection
Setel rsTest.ActiveConnection = Tidak Ada
'Tutup koneksi sedini mungkin
Cnn.close: Setel Cnn = Tidak Ada
Lakukan Saat Bukan rsTest.EOF
Respon.Tulis rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
rsTest.MoveNext
Lingkaran
Setel rsTest = Tidak Ada
%>