ASP Conferencia 8: ASP y base de datos (3)
Autor:Eve Cole
Fecha de actualización:2009-05-30 19:55:00
En las dos últimas conferencias, explicamos el uso básico de las bases de datos en ASP. Hoy presentaremos varias tecnologías muy prácticas.
1. Tecnología de paginación Hemos introducido cómo recuperar datos y enviarlos al navegador. Para una pequeña cantidad de datos, este procesamiento de salida simple es completamente aceptable, si la cantidad de datos es grande, con cientos o incluso miles de elementos. No es realista enviar tantos datos al cliente a la vez. En primer lugar, la página se extiende mucho de arriba a abajo. En segundo lugar, el cliente espera demasiado. En tercer lugar, la carga en el servidor es demasiado. Por lo tanto, es muy necesario realizar salidas paginadas.
Requisito: envíe los datos de la tabla "Producto" de Northwind.mdb al navegador y muestre 10 elementos en cada página.
Tome wuf60.asp como ejemplo. Este código todavía es un poco complicado. Necesitas leer más y experimentarlo más. Se mencionó AdoAccess.asp en la conferencia.
Nota: Esta rutina incorpora buenas partes de algunos libros y por la presente declara.
<%@ IDIOMA="VBSCRIPT" %>
<!--#include file="AdoAccess.asp"-->
<!--#include file="adovbs.inc"-->
<%
Dim RecordPerPage, absPageNum, TotalPages, absRecordNum, rsTest, StrSQL
'absPageNum - ¿Qué página es la página actual?
'TotalPages - Número total de páginas
'absRecordNum: el número de serie de un registro en la página actual, como 1-10
RecordPerPage = 10 'Número de registros mostrados por página
'Obtiene el número de página actual de los datos de salida
Si Request.ServerVariables("CONTENT_LENGTH") = 0 Entonces
'Si los datos enviados por el formulario no se reciben (como cuando la página se carga por primera vez), se mostrarán desde la página 1.
número de página abs = 1
Demás
'Obtiene el número de página al presionar el botón
absPageNum = CInt(Solicitud.Form("PressPageNum"))
'Si presiona la página anterior, el número de página es -1, si presiona la página siguiente, el número de página +1
Si Request.Form("Enviar") = "Página anterior" Entonces
númPáginaabs = númPáginaabs - 1
ElseIf Request.Form("Enviar") = "Página siguiente" Entonces
númPáginaabs = númPáginaabs + 1
Terminar si
Terminar si
'Crear objeto de conjunto de registros
Establecer rsTest = Server.CreateObject("ADODB.Recordset")
rsTest.CursorLocation = adUseClient 'Esta configuración puede reducir la carga de la base de datos
rsTest.CursorType = adOpenStatic 'El cursor debe moverse hacia adelante y hacia atrás y no se puede configurar para avanzar solo
rsTest.CacheSize = RecordPerPage 'Configurar esta opción mejorará el rendimiento
StrSQL = "SELECCIONAR * DE pedido de producto por ID de producto"
rsTest.Open StrSQL, CNN, adCmdText
rsTest.PageSize = RecordPerPage 'Establece el número de registros por página
Si no (rsTest.EOF) entonces
rsTest.AbsolutePage = absPageNum
Terminar si
TotalPáginas = rsTest.PageCount
%>
<% 'La siguiente parte envía los datos de la página actual al navegador%>
<Html><Boby>
<tabla colspan=8 cellpadding=5 borde=0>
<tr>
<td align=CENTER bgcolor="#800000" width="109"> <font style="ARIAL NARROW" color="#ffffff" size="2">Precio unitario</font></td>
<td align=CENTER width=459 bgcolor="#800000"> <font style="ARIAL NARROW" color="#ffffff" size="2">Nombre del producto</font></td>
</tr>
<% 'Utiliza un bucle para generar 10 datos en la página actual
Para absRecordNum = 1 a rsTest.PageSize
%>
<tr>
<td bgcolor="f7efde" align=CENTER> <font style="ARIAL NARROW" size="2"><%= rsTest("precio unitario")%></font></td>
<td bgcolor="f7efde" align=CENTER> <font style="ARIAL NARROW" size="2"><%= rsTest("Nombre del producto")%></font></td>
</tr>
<%
rsTest.MoveNext
Si rsTest.EOF Entonces
Salir para ' Si se ha llegado al final del registro, salga, si la última página de datos no está llena.
Terminar si
Próximo
rsTest.Cerrar: Cnn.Cerrar
Establecer rsTest = Nada: Establecer Cnn = Nada
%>
</tabla>
<% 'La parte inferior son dos botones "Página anterior" "Página siguiente" %>
<Acción de formulario = "<%= Request.ServerVariables("SCRIPT_NAME") %>" Método="Publicar">
<Tipo de entrada="Oculto" Nombre="PressPageNum" Valor="<%= absPageNum%>">
<%
Si absPageNum > 1 Entonces 'Si la página actual no es la primera página, muestra el botón de la página anterior%>
<Tipo de entrada="Enviar" Nombre="Enviar" Valor="Página anterior">
<% Finalizar si
Si absPageNum <> TotalPages Entonces 'Si la página actual no es la última página, muestra el botón de página siguiente%>
<Tipo de entrada="Enviar" Nombre="Enviar" Valor="Página siguiente">
<% Finalizar si %>
</formulario>
<P><Centro> [Página<font color="#CC0033"><%= absPageNum %></font>,
Total<font color="#CC0033"><%= TotalPages %></font> páginas] </Center></P>
</BODY></HTML>
analizar:
1. Algunas propiedades útiles del objeto Recordset:
l rsTest.CursorLocation = adUseClient: también puede omitir esta oración, pero hacerlo puede reducir la carga de la base de datos;
l rsTest.CacheSize = RecordPerPage: el atributo CacheSize se utiliza para determinar cuántos datos obtiene el cliente del servidor de la base de datos cada vez;
l rsTest.PageSize: el atributo PageSize se utiliza para establecer el número de registros en cada página;
l rsTest.AbsolutePage: la propiedad AbsolutePage establece el número absoluto de páginas de los datos actuales en el objeto Recordset;
l rsTest.PageCount: la propiedad PageCount se utiliza para obtener el número total de páginas en el conjunto de registros.
2. Este formulario de ejemplo utiliza un campo oculto PressPageNum para pasar la página cuando se hace clic en el botón.
2. Manejo de errores Durante la ejecución del código, pueden ocurrir errores por varias razones, tales como: problemas con el código en sí, desconexión de la red, etc., por lo que es muy necesario configurar la captura y el procesamiento de errores en el programa. En ASP, podemos obtener la información de error o advertencia que ocurre cuando el código se ejecuta a través de la recopilación de datos de Errores del objeto Conexión. El método de uso es el siguiente:
1. Úselo directamente en el objeto Conexión:
Establecer errores = Errores de conexión
o
CNN.Errores
2. Después de establecer el objeto Recordset o el objeto Command, use el objeto Connection a través de su propiedad ActiveConnection:
Establecer errores = rsTest.ActiveConnection.Errors
o
rsTest.ActiveConnection.Errores
Suena demasiado crudo para decirlo, así que demos un ejemplo: wuf61.asp
<%@ IDIOMA="VBSCRIPT" %>
<% Opción Explícita %>
<!--#include file="adovbs.inc"-->
<%
Respuesta.Expira = 0
'La siguiente oración garantiza: Incluso si el script encuentra un error, continuará ejecutando la siguiente oración
En caso de error Continuar siguiente
Dim Cnn, rsTest, Errs, I
Establecer Cnn = Server.CreateObject ("ADODB.Connection")
'CommandTimeout: el tiempo máximo de espera para conectarse a la base de datos, el valor predeterminado es 15 segundos
Cnn.CommandTimeout = 5
'Puede detectar errores en las tres situaciones siguientes: tomando SQL Server como ejemplo
'1 - completamente correcto; 2 - la base de datos inicial no está configurada 3 - el nombre de la base de datos es pvbs incorrecto;
Cnn.Open "Proveedor=sqloledb; ID de usuario=sa; Contraseña=; Catálogo inicial=pubs; Fuente de datos=ICBCZJP"
'Cnn.Open "Proveedor=sqloledb; ID de usuario=sa; Contraseña=; Catálogo inicial=; Fuente de datos=ICBCZJP"
'Cnn.Open "Proveedor=sqloledb; ID de usuario=sa; Contraseña=; Catálogo inicial=pvbs; Fuente de datos=ICBCZJP"
Para I = 0 a Cnn.Errors.Count - 1
'El atributo de origen indica el origen del error
Respuesta.Escribir "[ " & Cnn.Errors(I).Fuente & " ] "
'El atributo de descripción indica el motivo o descripción del error
Respuesta.Escribir Cnn.Errors(I).Descripción & "<br>"
Próximo
Si Cnn.Errors.Count > 0 Entonces
Response.Write "Ocurrió mientras se conectaba" & Cnn.Errors.Count & "errors" & "<br>"
Terminar si
Establecer rsTest = Server.CreateObject("ADODB.Recordset")
rsTest.Open "trabajos", CNN, adOpenForwardOnly, adLockReadOnly, adCmdTable
Si rsTest.ActiveConnection.Errors.Count > 0 Entonces
Establecer sesión ("Errores") = rsTest.ActiveConnection.Errors
Respuesta.Redireccionamiento "ErrorHandle.asp"
Terminar si
CNN.Cerrar
Establecer rsTest = Nada: Establecer Cnn = Nada
%>
Código ErrorHandle.asp:
<%
Yo oscuro
Para I = 0 a la sesión ("Errs"). Count - 1
Respuesta.Escribir "[ " & Session("Errs")(I).Fuente & " ] "
Response.Write Session("Errs"))(I).Descripción & "<br>"
Próximo
%>
analizar:
En este caso, es posible que el error haya ocurrido al conectarse, o que la conexión haya sido correcta, pero ocurrió un error al usar el objeto Recordset.
Además, en el siguiente fragmento de código, la colección de errores se coloca en un objeto de sesión para que se pueda llamar entre páginas (cuando se encuentre un error, vaya a la página de manejo de errores ErrorHandle.asp).
De hecho, también puede asignar el objeto Recordset al objeto Session para implementar la llamada del conjunto de registros entre páginas.
3. El concepto de uso de transacciones es muy simple e importante Para ilustrar su uso, supongamos primero la siguiente situación: por ejemplo, en el comercio electrónico, al realizar transferencias de moneda en línea, se debe restar una cierta cantidad de una cantidad. importe de la cuenta y agregar su importe equivalente a otra cuenta. No importa cuál de las actualizaciones falle, provocará un desequilibrio en el saldo de la cuenta (o hay una deducción aquí, pero no hay aumento allí; o no hay deducción aquí, pero hay un aumento allí) . Si utiliza una transacción para realizar estos cambios, se asegura de que solo puede elegir realizar todos los cambios o no realizar ningún cambio (ya sea completamente correcto o completamente cancelado).
Las transacciones pertenecen al objeto Conexión, que tiene tres métodos relacionados con las transacciones:
l BeginTrans inicia una nueva transacción.
l CommitTrans guarda todos los cambios y finaliza la transacción actual.
l RollbackTrans cancela cualquier cambio realizado en la transacción actual y finaliza la transacción, lo que a menudo se denomina "reversión".
También podríamos mirar un ejemplo wuf62.asp.
<%@ IDIOMA="VBSCRIPT" %>
<% Opción Explícita %>
<!--#include file="adovbs.inc"-->
<%
Respuesta.Expira = 0
En caso de error Continuar siguiente
DimCnn, StrSQL, rsTest
Establecer Cnn = Server.CreateObject ("ADODB.Connection")
Cnn.Open "Proveedor=sqloledb; ID de usuario=sa; Contraseña=; Catálogo inicial=pubs; Fuente de datos=ICBCZJP"
'Iniciar una transacción
CNN.BeginTrans
StrSQL = "Insertar trabajos(job_desc, min_lvl, max_lvl) Valores('Finanzas',16,86)"
Cnn.Ejecutar StrSQL
'La primera oración a continuación es incorrecta, la segunda oración es correcta
StrSQL = "Actualizar jobs_err SET job_desc = 'Transacción' Donde job_id = 14"
'StrSQL = "Actualizar trabajos SET job_desc = 'Transacción' Donde job_id = 14"
Cnn.Ejecutar StrSQL
Si Cnn.Errors.Count > 0 Entonces
Response.Write "Ocurrió un error, el sistema restaura el estado al inicio de la transacción, no se realizarán nuevas adiciones ni modificaciones" & "<br>"
CNN.RollbackTrans
Demás
Response.Write "Sin errores, guarde los cambios en la base de datos, agregue un nuevo dato, modifique un dato" & "<br>"
CNN.CommitTrans
Terminar si
Establecer rsTest = Cnn.Execute("Seleccionar * De trabajos donde job_id>=14")
Mientras no sea rsTest.EOF
Respuesta.Escribir rstest(0) & rstest(1) & rstest(2) & rstest(3) & "<br>"
rsTest.MoveNext
Encaminarse a
'Este ejemplo es sólo para prueba, así que restaure los datos originales de la base de datos
Cnn.Execute "Actualizar trabajos SET job_desc = 'Diseñador' Donde job_id = 14"
Cnn.Execute "ELIMINAR trabajos donde job_id > 14"
Cnn.Close: Establecer Cnn = Nada
%>
En este ejemplo, Insertar y Actualizar ocurren al mismo tiempo o no ocurre ninguna de las dos. No habrá ninguna situación en la que se agregue un dato pero la modificación no se produzca debido a un error de declaración. El uso de transacciones es un muy buen hábito al programar bases de datos.
4. Procesamiento de múltiples conjuntos de registros A veces necesitamos obtener datos de dos tablas al mismo tiempo. Si se devuelven en una declaración SQL, se puede reducir la transmisión de la red y mejorar la eficiencia operativa.
Tome wuf64.asp como ejemplo. Este ejemplo también explica cómo usar un bucle para generar valores de campo (en el pasado, usamos métodos estúpidos como "rsTest (0) & rsTest (1) &..." para generar. Si solo hay dos o tres campos, este método es obviamente más conciso), si no puede entenderlo en este momento, descargue el wuf63.asp más simple, ¡recuerde! .
<%@ IDIOMA="VBSCRIPT" %>
<%
Opción explícita
Respuesta.Expira = 0
Dim Cnn, StrSQL, rsTest, yo
Establecer Cnn = Server.CreateObject ("ADODB.Connection")
Cnn.Open "Proveedor=sqloledb; ID de usuario=sa; Contraseña=; Catálogo inicial=pubs; Fuente de datos=ICBCZJP"
Establecer rsTest = Server.CreateObject("ADODB.Recordset")
'Recuperar múltiples conjuntos de registros
StrSQL = "Seleccione COUNT(*) AS 'Número de empleados' De empleado; Seleccione * De trabajos"
rsTest.Open StrSQL, CNN ', , adCmdText
Mientras no rsTest no es nada
Respuesta.Escribir "<Borde de tabla = 2><tr>"
'rsTest.Fields.Count: número de campos en el conjunto de registros
Para I = 0 Para rsTest.Fields.Count - 1
'rsTest(I).Name: el nombre del campo I
Respuesta.Escribir "<td>" & rsTest(I).Nombre & "</td>"
Próximo
Respuesta.Escribe "</tr>"
Mientras no sea rsTest.EOF
Respuesta.Escribir "<tr>"
'Utiliza un bucle para generar el valor de cada campo
Para I = 0 Para rsTest.Fields.Count - 1
Respuesta.Escribir "<td>" & rsTest(I) & "</td>"
Próximo
Respuesta.Escribe "</tr>"
rsTest.MoveNext
Encaminarse a
'Leer el siguiente objeto Recordset
Establecer rsTest = rsTest.NextRecordset
Encaminarse a
CNN.Cerrar
Establecer rsTest = Nada: Establecer Cnn = Nada
%>
Nota: La base de datos de SQL Server admite múltiples conjuntos de registros, pero la base de datos de Access no.
5. Cierre la conexión lo antes posible para liberar recursos.
En los ejemplos anteriores, la conexión se cerró en último lugar. Sin embargo, el objeto Conexión consume recursos. De hecho, según el método proporcionado por wuf65.asp a continuación, la conexión se puede cerrar antes.
<% @LANGUAGE = VBScript %>
<!--#include file="AdoAccess.asp"-->
<!--#include file="adovbs.inc"-->
<% ' wuf65.asp
Dim StrSQL, rsTest
StrSQL = "Seleccionar * Del remitente"
Establecer rsTest = server.CreateObject("ADODB.Recordset")
'Debes usar un cursor de cliente, de lo contrario no funcionará
rsTest.CursorLocation = adUseClient
rsTest.Open StrSQL, CNN,,,adCmdText
'Elimina la dependencia del conjunto de registros del objeto Conexión
Establecer rsTest.ActiveConnection = Nada
'Cerrar la conexión lo antes posible
Cnn.close: Establecer Cnn = Nada
Hacer mientras no rsTest.EOF
Respuesta.Escribir rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
rsTest.MoveNext
Bucle
Establecer rsTest = Nada
%>