ASP Aula 8: ASP e banco de dados (3)
Autor:Eve Cole
Data da Última Atualização:2009-05-30 19:55:00
Nas duas últimas palestras explicamos o uso básico de bancos de dados em ASP. Hoje apresentaremos diversas tecnologias muito práticas.
1. Tecnologia de paginação Introduzimos como recuperar dados e enviá-los para o navegador. Para uma pequena quantidade de dados, esse processamento de saída simples é completamente aceitável, se a quantidade de dados for grande, com centenas ou até milhares de itens. , Não é realista enviar tantos dados para o cliente de uma vez. Em primeiro lugar, a página se estende muito de cima para baixo. Em segundo lugar, o cliente espera muito tempo. Portanto, é muito necessário obter saída paginada.
Requisito: Envie os dados da tabela "Produto" do Northwind.mdb para o navegador e exiba 10 itens em cada página.
Tome wuf60.asp como exemplo. Este código ainda é um pouco difícil. Você precisa ler mais e experimentar mais.
Nota: Esta rotina incorpora boas partes de alguns livros e, por meio deste, declara.
<%@ LANGUAGE="VBSCRIPT" %>
<!--#include file="AdoAccess.asp"-->
<!--#include file="adovbs.inc"-->
<%
Dim RecordPerPage, absPageNum, TotalPages, absRecordNum, rsTest, StrSQL
'absPageNum - Qual página é a página atual?
'TotalPages - Número total de páginas
'absRecordNum - o número de série de um registro na página atual, como 1-10
RecordPerPage = 10 'Número de registros exibidos por página
'Obtém o número da página atual dos dados de saída
Se Request.ServerVariables("CONTENT_LENGTH") = 0 Então
'Se os dados enviados pelo formulário não forem recebidos (como quando a página é carregada pela primeira vez), eles serão exibidos na página 1
absPageNum = 1
Outro
'Obtém o número da página ao pressionar o botão
absPageNum = CInt(Request.Form("PressPageNum"))
'Se você pressionar a página anterior, o número da página será -1, se você pressionar a próxima página, o número da página será +1
Se Request.Form("Enviar") = "Página anterior" Então
absPageNum = absPageNum - 1
ElseIf Request.Form("Enviar") = "Próxima página" Então
absPageNum = absPageNum + 1
Terminar se
Terminar se
'Criar objeto recordset
Definir rsTest = Server.CreateObject("ADODB.Recordset")
rsTest.CursorLocation = adUseClient 'Esta configuração pode reduzir a carga do banco de dados
rsTest.CursorType = adOpenStatic 'O cursor precisa se mover para frente e para trás e não pode ser definido apenas para avançar
rsTest.CacheSize = RecordPerPage 'Definir esta opção melhorará o desempenho
StrSQL = "SELECIONE * FROM pedidoOrdem por IDproduto"
rsTest.Open StrSQL, Cnn, , , adCmdText
rsTest.PageSize = RecordPerPage 'Define o número de registros por página
Se não (rsTest.EOF) então
rsTest.AbsolutePage = absPageNum
Terminar se
TotalPages = rsTest.PageCount
%>
<% 'A parte a seguir envia os dados da página atual para o navegador%>
<Html><Boby>
<tabela colspan=8 cellpadding=5 borda=0>
<tr>
<td align=CENTER bgcolor="#800000" width="109"> <font style="ARIAL NARROW" color="#ffffff" size="2">Preço unitário</font></td>
<td align=CENTER width=459 bgcolor="#800000"> <font style="ARIAL NARROW" color="#ffffff" size="2">Nome do produto</font></td>
</tr>
<% 'Use um loop para gerar 10 dados na página atual
Para absRecordNum = 1 para rsTest.PageSize
%>
<tr>
<td bgcolor="f7efde" align=CENTER> <font style="ARIAL NARROW" size="2"><%= rsTest("preço unitário")%></font></td>
<td bgcolor="f7efde" align=CENTER> <font style="ARIAL NARROW" size="2"><%= rsTest("Nome do produto")%></font></td>
</tr>
<%
rsTest.MoveNext
Se rsTest.EOF então
Exit For ' Se o final do registro foi atingido, sai - se a última página de dados não estiver cheia.
Terminar se
Próximo
rsTest.Close: Cnn.Close
Definir rsTest = Nada: Definir Cnn = Nada
%>
</tabela>
<% 'A parte inferior são dois botões "Página Anterior" "Próxima Página" %>
<Form Action = "<%= Request.ServerVariables("SCRIPT_NAME") %>" Método="Post">
<Input Type="Oculto" Name="PressPageNum" Value="<%= absPageNum%>">
<%
If absPageNum > 1 Then 'Se a página atual não for a primeira página, exibe o botão da página anterior%>
<Input Type="Enviar" Name="Enviar" Value="Página Anterior">
<% Fim se
If absPageNum <> TotalPages Then 'Se a página atual não for a última página, exibe o botão da próxima página%>
<Input Type="Enviar" Name="Enviar" Value="Próxima página">
<% Fim se %>
</Formulário>
<P><Center> [Página<font color="#CC0033"><%= absPageNum %></font>,
Total<font color="#CC0033"><%= TotalPages %></font> páginas] </Center></P>
</BODY></HTML>
analisar:
1. Algumas propriedades úteis do objeto Recordset:
l rsTest.CursorLocation = adUseClient: Você também pode omitir esta frase, mas isso pode reduzir a carga do banco de dados;
l rsTest.CacheSize = RecordPerPage: O atributo CacheSize é usado para determinar quantos dados o cliente obtém do servidor de banco de dados a cada vez;
l rsTest.PageSize: O atributo PageSize é usado para definir o número de registros em cada página;
l rsTest.AbsolutePage: A propriedade AbsolutePage define o número absoluto de páginas dos dados atuais no objeto Recordset;
l rsTest.PageCount: A propriedade PageCount é usada para obter o número total de páginas no conjunto de registros.
2. Este formulário de exemplo usa um campo oculto PressPageNum para passar a página quando o botão é clicado.
2. Tratamento de erros Durante a execução do código, podem ocorrer erros por diversos motivos, como: problemas no próprio código, desconexão da rede, etc., por isso é muito necessário configurar a captura e processamento de erros no programa. No ASP, podemos obter as informações de erro ou aviso que ocorrem quando o código está sendo executado por meio da coleta de dados Erros do objeto Conexão. O método de uso é o seguinte:
1. Use-o diretamente no objeto Connection:
Definir erros = Cnn.Errors
ou
Cnn.Erros
2. Após estabelecer o objeto Recordset ou objeto Command, utilize o objeto Connection através de sua propriedade ActiveConnection:
Definir erros = rsTest.ActiveConnection.Errors
ou
rsTest.ActiveConnection.Errors
Parece muito grosseiro dizer, então vamos dar um exemplo: wuf61.asp
<%@ LANGUAGE="VBSCRIPT" %>
<% Opção Explícita %>
<!--#include file="adovbs.inc"-->
<%
Resposta.Expira = 0
'A seguinte frase garante: Mesmo que o script encontre um erro, ele continuará a executar a próxima frase
Em caso de erro, retomar o próximo
Dim Cnn, rsTest, Errs, eu
Definir Cnn = Server.CreateObject("ADODB.Connection")
'CommandTimeout - o tempo máximo de espera para conexão com o banco de dados, o padrão é 15 segundos
Cnn.CommandTimeout = 5
'Você pode detectar erros nas três situações a seguir - tomando o SQL Server como exemplo
'1 - completamente correto; 2 - banco de dados inicial não está definido; 3 - nome do banco de dados está errado pvbs;
Cnn.Open "Provedor = sqloledb; ID do usuário = sa; Senha =; Catálogo inicial = pubs; Fonte de dados = ICBCZJP"
'Cnn.Open "Provider=sqloledb; ID do usuário=sa; Senha=; Catálogo inicial=; Fonte de dados=ICBCZJP"
'Cnn.Open "Provider=sqloledb; ID do usuário=sa; Senha=; Catálogo inicial=pvbs; Fonte de dados=ICBCZJP"
Para I = 0 Para Cnn.Errors.Count - 1
'O atributo Source indica a origem do erro
Response.Write "[ " & Cnn.Errors(I).Fonte & " ] "
'Atributo de descrição indica o motivo ou descrição do erro
Response.Write Cnn.Errors(I).Descrição & "<br>"
Próximo
Se Cnn.Errors.Count > 0 Então
Response.Write "Ocorreu durante a conexão" & Cnn.Errors.Count & "erros" & "<br>"
Terminar se
Definir rsTest = Server.CreateObject("ADODB.Recordset")
rsTest.Open "empregos",Cnn,adOpenForwardOnly,adLockReadOnly,adCmdTable
Se rsTest.ActiveConnection.Errors.Count > 0 Então
Definir Sessão("Erros") = rsTest.ActiveConnection.Errors
Response.Redirect "ErrorHandle.asp"
Terminar se
Cnn.Fechar
Definir rsTest = Nada: Definir Cnn = Nada
%>
Código ErrorHandle.asp:
<%
Escureça eu
Para I = 0 Para Sessão("Erros").Contagem - 1
Response.Write "[ " & Session("Erros")(I).Fonte & " ] "
Response.Write Session("Erros")(I).Descrição & "<br>"
Próximo
%>
analisar:
Nesse caso, o erro pode ter ocorrido durante a conexão ou a conexão pode ter sido correta, mas ocorreu um erro ao usar o objeto Recordset.
Além disso, no trecho de código a seguir, a coleção de erros é colocada em um objeto de sessão para que possa ser chamada entre páginas (quando um erro for encontrado, vá para a página de tratamento de erros ErrorHandle.asp).
Na verdade, você também pode atribuir o objeto Recordset ao objeto Session para implementar a chamada do conjunto de registros entre páginas.
3. O conceito de utilização de transações é muito simples e importante Para ilustrar a sua utilização, vamos primeiro assumir a seguinte situação: Por exemplo, no comércio eletrónico, ao realizar transferências de moeda online, um determinado montante deve ser subtraído de um valor. valor da conta e adicionar seu valor equivalente a outra conta. Não importa qual das atualizações falhe, isso levará a um desequilíbrio no saldo da conta (ou há uma dedução aqui, mas não há aumento ali; ou não há dedução aqui, mas há um aumento ali) . Se você usar uma transação para fazer essas alterações, você garantirá que só poderá optar por fazer todas as alterações ou não fazer nenhuma alteração (completamente correta ou completamente cancelada).
As transações pertencem ao objeto Connection, que possui três métodos relacionados à transação:
l BeginTrans inicia uma nova transação.
l CommitTrans salva todas as alterações e encerra a transação atual.
l RollbackTrans cancela quaisquer alterações feitas na transação atual e encerra a transação, geralmente chamada de "reversão".
Poderíamos também ver um exemplo wuf62.asp.
<%@ LANGUAGE="VBSCRIPT" %>
<% Opção Explícita %>
<!--#include file="adovbs.inc"-->
<%
Resposta.Expira = 0
Em caso de erro, retomar o próximo
DimCnn, StrSQL, rsTest
Definir Cnn = Server.CreateObject("ADODB.Connection")
Cnn.Open "Provedor = sqloledb; ID do usuário = sa; Senha =; Catálogo inicial = pubs; Fonte de dados = ICBCZJP"
'Iniciar uma transação
Cnn.BeginTrans
StrSQL = "Inserir jobs(job_desc, min_lvl, max_lvl) Valores('Finanças',16,86)"
Cnn.Execute StrSQL
'A primeira frase abaixo está errada, a segunda frase está correta
StrSQL = "Atualizar jobs_err SET job_desc = 'Transação' Onde job_id = 14"
'StrSQL = "Atualizar trabalhos SET job_desc = 'Transaction' Onde job_id = 14"
Cnn.Execute StrSQL
Se Cnn.Errors.Count > 0 Então
Response.Write "Ocorreu um erro, o sistema restaura o estado no início da transação, não serão feitas novas adições nem modificações" & "<br>"
Cnn.RollbackTrans
Outro
Response.Write "Sem erros, salve as alterações no banco de dados, adicione um novo dado, modifique um dado" & "<br>"
Cnn.CommitTrans
Terminar se
Defina rsTest = Cnn.Execute("Selecione * Dos trabalhos onde job_id>=14")
Embora não seja rsTest.EOF
Response.Write rstest(0) & rstest(1) & rstest(2) & rstest(3) & "<br>"
rsTest.MoveNext
Wend
'Este exemplo é apenas para teste, então restaure os dados originais do banco de dados
Cnn.Execute "Atualizar trabalhos SET job_desc = 'Designer' Onde job_id = 14"
Cnn.Execute "DELETE jobs Onde job_id> 14"
Cnn.Close: Definir Cnn = Nada
%>
Neste exemplo, Insert e Update ocorrem ao mesmo tempo ou nenhum deles ocorre. Não haverá situação em que um dado seja adicionado, mas a modificação não ocorra devido a um erro de instrução. Usar transações é um hábito muito bom ao programar bancos de dados.
4. Processamento de vários conjuntos de registros Às vezes, precisamos obter dados de duas tabelas ao mesmo tempo. Se retornados em uma instrução SQL, a transmissão da rede pode ser reduzida e a eficiência operacional melhorada.
Tome wuf64.asp como exemplo. Este exemplo também explica como usar um loop para gerar valores de campo (no passado, usávamos métodos estúpidos como "rsTest(0) & rsTest(1) &..." para gerar . Se houver apenas dois ou três campos, este método é obviamente mais conciso), se você não consegue entendê-lo no momento, baixe o wuf63.asp mais simples, lembre-se! .
<%@ LANGUAGE="VBSCRIPT" %>
<%
Opção Explícita
Resposta.Expira = 0
Dim Cnn, StrSQL, rsTest, I
Definir Cnn = Server.CreateObject("ADODB.Connection")
Cnn.Open "Provedor = sqloledb; ID do usuário = sa; Senha =; Catálogo inicial = pubs; Fonte de dados = ICBCZJP"
Definir rsTest = Server.CreateObject("ADODB.Recordset")
'Recupera vários conjuntos de registros
StrSQL = "Selecione COUNT(*) AS 'Número de funcionários' Do funcionário; Selecione * Dos empregos"
rsTest.Open StrSQL, Cnn ', , ,adCmdText
Embora não rsTest não seja nada
Response.Write "<Borda da tabela = 2><tr>"
'rsTest.Fields.Count - Número de campos no conjunto de registros
Para I = 0 Para rsTest.Fields.Count - 1
'rsTest(I).Name - o nome do campo I
Response.Write "<td>" & rsTest(I).Nome & "</td>"
Próximo
Resposta.Escreva "</tr>"
Embora não seja rsTest.EOF
Resposta.Escreva "<tr>"
'Use um loop para gerar o valor de cada campo
Para I = 0 Para rsTest.Fields.Count - 1
Response.Write "<td>" & rsTest(I) & "</td>"
Próximo
Resposta.Escreva "</tr>"
rsTest.MoveNext
Wend
'Lê o próximo objeto Recordset
Definir rsTest = rsTest.NextRecordset
Wend
Cnn.Fechar
Definir rsTest = Nada: Definir Cnn = Nada
%>
Observação: o banco de dados SQL Server oferece suporte a vários conjuntos de registros, mas o banco de dados Access não.
5. Feche a conexão o mais cedo possível para liberar recursos
Nos exemplos anteriores, a conexão foi fechada por último. No entanto, o objeto Connection consome recursos. Na verdade, de acordo com o método fornecido por wuf65.asp abaixo, a conexão pode ser fechada mais cedo.
<% @LANGUAGE = VBScript%>
<!--#include file="AdoAccess.asp"-->
<!--#include file="adovbs.inc"-->
<% 'wuf65.asp
Dim StrSQL, rsTest
StrSQL = "Selecionar * Do remetente"
Definir rsTest = server.CreateObject("ADODB.Recordset")
'Você deve usar um cursor de cliente, caso contrário não funcionará
rsTest.CursorLocation = adUseClient
rsTest.Open StrSQL,Cnn,,,adCmdText
'Remove a dependência do recordset do objeto Connection
Definir rsTest.ActiveConnection = Nada
'Feche a conexão o mais cedo possível
Cnn.close: Definir Cnn = Nada
Faça enquanto não rsTest.EOF
Response.Write rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
rsTest.MoveNext
Laço
Definir rsTest = Nada
%>