Conférence ASP 8 : ASP et base de données (3)
Auteur:Eve Cole
Date de mise à jour:2009-05-30 19:55:00
Dans les deux dernières conférences, nous avons expliqué l'utilisation de base des bases de données en ASP. Aujourd'hui, nous présenterons plusieurs technologies très pratiques.
1. Technologie de pagination Nous avons présenté comment récupérer des données et les envoyer au navigateur. Pour une petite quantité de données, un traitement de sortie aussi simple est tout à fait acceptable. Toutefois, si la quantité de données est importante, avec des centaines, voire des milliers d'éléments. , Il est irréaliste de transmettre autant de données au client à la fois. Premièrement, la page s'étend très longtemps de haut en bas. Deuxièmement, le client attend trop longtemps. Troisièmement, la charge sur le serveur est trop lourde. Il est donc très nécessaire de prendre une sortie paginée.
Condition : affichez les données de la table "Produit" de Northwind.mdb vers le navigateur et affichez 10 éléments sur chaque page.
Prenons wuf60.asp comme exemple. Ce code est encore un peu difficile. Vous devez en lire davantage et en faire l'expérience davantage. AdoAccess.asp a été mentionné dans la conférence.
Remarque : Cette routine incorpore de bonnes parties de certains livres et déclare par la présente.
<%@ LANGUAGE="VBSCRIPT" %>
<!--#include file="AdoAccess.asp"-->
<!--#include file="adovbs.inc"-->
<%
Dim RecordPerPage, absPageNum, TotalPages, absRecordNum, rsTest, StrSQL
'absPageNum - Quelle page est la page actuelle ?
'TotalPages - Nombre total de pages
'absRecordNum - le numéro de série d'un enregistrement dans la page actuelle, tel que 1-10
RecordPerPage = 10 'Nombre d'enregistrements affichés par page
'Obtenir le numéro de page actuel des données de sortie
Si Request.ServerVariables("CONTENT_LENGTH") = 0 Alors
'Si les données soumises par le formulaire ne sont pas reçues (par exemple lorsque la page est chargée pour la première fois), elles seront affichées à partir de la page 1.
absPageNum = 1
Autre
'Obtenir le numéro de page en appuyant sur le bouton
absPageNum = CInt(Request.Form("PressPageNum"))
'Si vous appuyez sur la page précédente, le numéro de page est -1, si vous appuyez sur la page suivante, le numéro de page est +1
Si Request.Form("Submit") = "Page précédente" Alors
absPageNum = absPageNum - 1
ElseIf Request.Form("Submit") = "Page suivante" Alors
numéroPageabs = numéroPageabs + 1
Fin si
Fin si
'Créer un objet jeu d'enregistrements
Définir rsTest = Server.CreateObject("ADODB.Recordset")
rsTest.CursorLocation = adUseClient 'Ce paramètre peut réduire la charge de la base de données
rsTest.CursorType = adOpenStatic 'Le curseur doit avancer et reculer et ne peut pas être configuré pour avancer uniquement
rsTest.CacheSize = RecordPerPage 'La définition de cette option améliorera les performances
StrSQL = "SELECT * FROM productOrder By productID"
rsTest.Open StrSQL, Cnn, , , adCmdText
rsTest.PageSize = RecordPerPage 'Définir le nombre d'enregistrements par page
Si non (rsTest.EOF) Alors
rsTest.AbsolutePage = absPageNum
Fin si
TotalPages = rsTest.PageCount
%>
<% 'La partie suivante affiche les données de la page actuelle vers le navigateur%>
<Html><Boby>
<table colspan=8 cellpadding=5 border=0>
<tr>
<td align=CENTER bgcolor="#800000" width="109"> <font style="ARIAL NARROW" color="#ffffff" size="2">Prix unitaire</font></td>
<td align=CENTER width=459 bgcolor="#800000"> <font style="ARIAL NARROW" color="#ffffff" size="2">Nom du produit</font></td>
</tr>
<% 'Utilisez une boucle pour générer 10 éléments de données sur la page actuelle
Pour absRecordNum = 1 à rsTest.PageSize
%>
<tr>
<td bgcolor="f7efde" align=CENTER> <font style="ARIAL NARROW" size="2"><%= rsTest("unit price")%></font></td>
<td bgcolor="f7efde" align=CENTER> <font style="ARIAL NARROW" size="2"><%= rsTest("Nom du produit")%></font></td>
</tr>
<%
rsTest.MoveNext
Si rsTest.EOF Alors
Quitter pour ' Si la fin de l'enregistrement a été atteinte, quittez - si la dernière page de données n'est pas pleine.
Fin si
Suivant
rsTest.Fermer : Cnn.Fermer
Définir rsTest = Rien : Définir Cnn = Rien
%>
</table>
<% 'La partie inférieure est constituée de deux boutons "Page précédente" "Page suivante" %>
<Form Action = "<%= Request.ServerVariables("SCRIPT_NAME") %>" Method="Post">
<Input Type="Hidden" Name="PressPageNum" Value="<%= absPageNum%>">
<%
Si absPageNum > 1 Alors 'Si la page courante n'est pas la première page, afficher le bouton de la page précédente%>
<Type d'entrée="Soumettre" Nom="Soumettre" Value="Page précédente">
<% Fin Si
If absPageNum <> TotalPages Then 'Si la page actuelle n'est pas la dernière page, afficher la page suivante bouton%>
<Type d'entrée="Soumettre" Nom="Soumettre" Value="Page suivante">
<% Fin Si %>
</Formulaire>
<P><Center> [Page<font color="#CC0033"><%= absPageNum %></font>,
Total<font color="#CC0033"><%= TotalPages %></font> pages] </Center></P>
</BODY></HTML>
analyser:
1. Quelques propriétés utiles de l'objet Recordset :
l rsTest.CursorLocation = adUseClient : vous pouvez également omettre cette phrase, mais cela peut réduire la charge de la base de données ;
l rsTest.CacheSize = RecordPerPage : l'attribut CacheSize est utilisé pour déterminer la quantité de données que le client obtient du serveur de base de données à chaque fois ;
l rsTest.PageSize : L'attribut PageSize est utilisé pour définir le nombre d'enregistrements sur chaque page ;
l rsTest.AbsolutePage : la propriété AbsolutePage définit le nombre absolu de pages des données actuelles dans l'objet Recordset ;
l rsTest.PageCount : la propriété PageCount est utilisée pour obtenir le nombre total de pages dans le jeu d'enregistrements.
2. Cet exemple de formulaire utilise un champ masqué PressPageNum pour transmettre la page lorsque vous cliquez sur le bouton.
2. Gestion des erreurs Lors de l'exécution du code, des erreurs peuvent survenir pour diverses raisons, telles que : des problèmes avec le code lui-même, une déconnexion du réseau, etc., il est donc très nécessaire de configurer la capture et le traitement des erreurs dans le programme. Dans ASP, nous pouvons obtenir les informations d'erreur ou d'avertissement qui se produisent lorsque le code est exécuté via la collection de données Erreurs de l'objet Connection. La méthode d'utilisation est la suivante :
1. Utilisez-le directement sur l'objet Connection :
Définir Errs = Cnn.Errors
ou
Cnn.Erreurs
2. Après avoir établi l'objet Recordset ou Command, utilisez l'objet Connection via sa propriété ActiveConnection :
Définir Errs = rsTest.ActiveConnection.Errors
ou
rsTest.ActiveConnection.Errors
Cela semble trop grossier à dire, alors donnons un exemple : wuf61.asp
<%@ LANGUAGE="VBSCRIPT" %>
<% Option explicite %>
<!--#include file="adovbs.inc"-->
<%
Réponse.Expire = 0
'La phrase suivante garantit : Même si le script rencontre une erreur, il continuera à exécuter la phrase suivante
En cas d'erreur, reprendre ensuite
Dim Cnn, rsTest, Errs, je
Définir Cnn = Server.CreateObject("ADODB.Connection")
'CommandTimeout - le temps d'attente maximum pour la connexion à la base de données, la valeur par défaut est de 15 secondes
Cnn.CommandTimeout = 5
'Vous pouvez détecter des erreurs dans les trois situations suivantes - en prenant SQL Server comme exemple
'1 - tout à fait correct ; 2 - la base de données initiale n'est pas définie ; 3 - le nom de la base de données est incorrect : pvbs
Cnn.Open "Provider=sqloledb ; ID utilisateur=sa; Mot de passe=; Catalogue initial=pubs; Source de données=ICBCZJP"
'Cnn.Open "Provider=sqloledb; ID utilisateur=sa; Mot de passe=; Catalogue initial=; Source de données=ICBCZJP"
'Cnn.Open "Provider=sqloledb ; ID utilisateur=sa; Mot de passe=; Catalogue initial=pvbs; Source de données=ICBCZJP"
Pour I = 0 À Cnn.Errors.Count - 1
'L'attribut Source indique la source de l'erreur
Réponse.Écrire "[ " & Cnn.Errors(I).Source & " ] "
'L'attribut Description indique la raison ou la description de l'erreur
Réponse.Écrire Cnn.Errors(I).Description & "<br>"
Suivant
Si Cnn.Errors.Count > 0 Alors
Response.Write "Survenu lors de la connexion" & Cnn.Errors.Count & " erreurs " & "<br>"
Fin si
Définir rsTest = Server.CreateObject("ADODB.Recordset")
rsTest.Open "jobs", Cnn, adOpenForwardOnly, adLockReadOnly, adCmdTable
Si rsTest.ActiveConnection.Errors.Count > 0 Alors
Définir la session("Errs") = rsTest.ActiveConnection.Errors
Réponse.Redirection "ErrorHandle.asp"
Fin si
Cnn.Fermer
Définir rsTest = Rien : Définir Cnn = Rien
%>
Code ErrorHandle.asp :
<%
Faible je
Pour I = 0 À Session("Errs").Count - 1
Réponse.Écrire "[ " & Session("Errs"))(I).Source & " ] "
Réponse.Session d'écriture("Errs")(I).Description & "<br>"
Suivant
%>
analyser:
Dans ce cas, l'erreur peut s'être produite lors de la connexion, ou la connexion a peut-être été correcte, mais une erreur s'est produite lors de l'utilisation de l'objet Recordset.
De plus, dans le morceau de code suivant, la collection d'erreurs est placée dans un objet de session afin qu'elle puisse être appelée entre les pages (lorsqu'une erreur est rencontrée, accédez à la page de gestion des erreurs ErrorHandle.asp).
En fait, vous pouvez également affecter l'objet Recordset à l'objet Session pour implémenter l'appel du jeu d'enregistrements entre les pages.
3. Le concept d'utilisation des transactions est très simple et important. Afin d'illustrer son utilisation, supposons d'abord la situation suivante : Par exemple, dans le commerce électronique, lors de transferts de devises en ligne, un certain montant doit être soustrait d'un montant. montant du compte et ajouter son montant équivalent à un autre compte. Peu importe laquelle des mises à jour échoue, cela entraînera un déséquilibre du solde du compte (soit il y a une déduction ici, mais il n'y a pas d'augmentation là ; soit il n'y a pas de déduction ici, mais il y a une augmentation là) . Si vous utilisez une transaction pour effectuer ces modifications, vous vous assurez que vous pouvez uniquement choisir d'effectuer toutes les modifications ou de n'effectuer aucune modification (soit complètement correcte, soit complètement annulée).
Les transactions appartiennent à l'objet Connection, qui dispose de trois méthodes liées aux transactions :
l BeginTrans démarre une nouvelle transaction.
l CommitTrans enregistre toutes les modifications et termine la transaction en cours.
l RollbackTrans annule toutes les modifications apportées à la transaction en cours et met fin à la transaction, souvent appelée « rollback ».
Autant regarder un exemple wuf62.asp.
<%@ LANGUAGE="VBSCRIPT" %>
<% Option explicite %>
<!--#include file="adovbs.inc"-->
<%
Réponse.Expire = 0
En cas d'erreur, reprendre ensuite
DimCnn, StrSQL, rsTest
Définir Cnn = Server.CreateObject("ADODB.Connection")
Cnn.Open "Provider=sqloledb ; ID utilisateur=sa; Mot de passe=; Catalogue initial=pubs; Source de données=ICBCZJP"
'Démarrer une transaction
Cnn.BeginTrans
StrSQL = "Insérer des valeurs de jobs(job_desc, min_lvl, max_lvl) ('Finance',16,86)"
Cnn.Exécuter StrSQL
'La première phrase ci-dessous est fausse, la deuxième phrase est correcte
StrSQL = "Mettre à jour jobs_err SET job_desc = 'Transaction' Où job_id = 14"
'StrSQL = "Mettre à jour les tâches SET job_desc = 'Transaction' Où job_id = 14"
Cnn.Exécuter StrSQL
Si Cnn.Errors.Count > 0 Alors
Response.Write "Une erreur s'est produite, le système rétablit l'état au début de la transaction, aucun nouvel ajout ni modification ne sera effectué" & "<br>"
Cnn.RollbackTrans
Autre
Response.Write "Aucune erreur, enregistrez les modifications apportées à la base de données, ajoutez une nouvelle donnée, modifiez une donnée" & "<br>"
Cnn.CommitTrans
Fin si
Définir rsTest = Cnn.Execute("Sélectionner * À partir des travaux où job_id>=14")
Bien que ce ne soit pas rsTest.EOF
Réponse.Écrire rstest(0) & rstest(1) & rstest(2) & rstest(3) & "<br>"
rsTest.MoveNext
Wende
'Cet exemple est uniquement destiné aux tests, restaurez donc les données d'origine de la base de données
Cnn.Execute "Mettre à jour les tâches SET job_desc = 'Designer' Où job_id = 14"
Cnn.Execute "SUPPRIMER les tâches où job_id > 14"
Cnn.Close : définir Cnn = Rien
%>
Dans cet exemple, Insert et Update se produisent en même temps ou aucun des deux ne se produit. Il n'y aura aucune situation dans laquelle une donnée est ajoutée mais la modification ne se produit pas en raison d'une erreur d'instruction. Utiliser des transactions est une très bonne habitude lors de la programmation de bases de données.
4. Traitement de plusieurs jeux d'enregistrements Parfois, nous devons obtenir des données de deux tables en même temps. Si elles sont renvoyées dans une seule instruction SQL, la transmission réseau peut être réduite et l'efficacité opérationnelle améliorée.
Prenons wuf64.asp comme exemple. Cet exemple explique également comment utiliser une boucle pour afficher les valeurs de champ (dans le passé, nous utilisions des méthodes stupides comme "rsTest(0) & rsTest(1) &..." pour afficher . S'il n'y a que deux ou trois champs , cette méthode est évidemment plus concise), si vous ne la comprenez pas pour le moment, veuillez télécharger le wuf63.asp plus simple, n'oubliez pas ! .
<%@ LANGUAGE="VBSCRIPT" %>
<%
Option explicite
Réponse.Expire = 0
Dim Cnn, StrSQL, rsTest, je
Définir Cnn = Server.CreateObject("ADODB.Connection")
Cnn.Open "Provider=sqloledb ; ID utilisateur=sa; Mot de passe=; Catalogue initial=pubs; Source de données=ICBCZJP"
Définir rsTest = Server.CreateObject("ADODB.Recordset")
'Récupérer plusieurs jeux d'enregistrements
StrSQL = "Sélectionnez COUNT(*) AS 'Nombre d'employés' De l'employé ; Sélectionnez * Depuis les emplois"
rsTest.Open StrSQL, Cnn ', , ,adCmdText
Bien que ce ne soit pas rsTest, ce n'est rien
Réponse.Écrivez "<Table Border = 2><tr>"
'rsTest.Fields.Count - Nombre de champs dans le jeu d'enregistrements
Pour I = 0 À rsTest.Fields.Count - 1
'rsTest(I).Name - le nom du champ I
Réponse.Écrivez "<td>" & rsTest(I).Name & "</td>"
Suivant
Réponse.Écrivez "</tr>"
Bien que ce ne soit pas rsTest.EOF
Réponse.Écrivez "<tr>"
'Utilisez une boucle pour afficher la valeur de chaque champ
Pour I = 0 À rsTest.Fields.Count - 1
Réponse.Écrivez "<td>" & rsTest(I) & "</td>"
Suivant
Réponse.Écrivez "</tr>"
rsTest.MoveNext
Wende
'Lire le prochain objet Recordset
Définir rsTest = rsTest.NextRecordset
Wende
Cnn.Fermer
Définir rsTest = Rien : Définir Cnn = Rien
%>
Remarque : La base de données SQL Server prend en charge plusieurs jeux d'enregistrements, mais pas la base de données Access.
5. Fermez la connexion le plus tôt possible pour libérer des ressources
Dans les exemples précédents, la connexion a été fermée en dernier. Cependant, l'objet Connection consomme des ressources. En fait, selon la méthode fournie par wuf65.asp ci-dessous, la connexion peut être fermée plus tôt.
<% @LANGUAGE = VBScript %>
<!--#include file="AdoAccess.asp"-->
<!--#include file="adovbs.inc"-->
<% ' wuf65.asp
Faible StrSQL, rsTest
StrSQL = "Sélectionner * De l'expéditeur"
Définir rsTest = server.CreateObject("ADODB.Recordset")
'Vous devez utiliser un curseur client, sinon cela ne fonctionnera pas
rsTest.CursorLocation = adUseClient
rsTest.Open StrSQL,Cnn,,,adCmdText
'Supprimer la dépendance du jeu d'enregistrements à l'égard de l'objet Connection
Définir rsTest.ActiveConnection = Rien
'Fermez la connexion le plus tôt possible
Cnn.close : définir Cnn = Rien
Faire sans rsTest.EOF
Réponse.Écrire rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
rsTest.MoveNext
Boucle
Définir rsTest = Rien
%>