ASP Aula 9: ASP e banco de dados (4)
Autor:Eve Cole
Data da Última Atualização:2009-05-30 19:54:56
Nesta palestra, apresentaremos principalmente como usar parâmetros e procedimentos armazenados.
1. Use o objeto Command e o objeto Parameter para transferir parâmetros. Esta palestra usará principalmente o banco de dados Microsoft SQL Server7.0. Primeiro, crie um arquivo de conexão AdoSQL7.asp para backup. futuro.
<% 'AdoSQL7.asp
Opção Explícita
Resposta.Expira = 0
'Parte 1: Estabelecendo uma conexão
Dim Cnn, StrCnn
Definir Cnn = Server.CreateObject("ADODB.Connection")
StrCnn = "Provedor=sqloledb; ID do usuário=sa; Senha=; Catálogo inicial=pubs; Fonte de dados=ICBCZJP"
Cnn.Open StrCnn
%>
Nota: Ao usá-lo você mesmo, defina a fonte de dados com o nome da máquina do seu servidor de banco de dados.
Além disso, ao usar o banco de dados Access no passado, era muito conveniente usar o Microsoft Access97 para visualizar campos e dados. No entanto, ao usar o banco de dados SQL Server, especialmente ao depurar scripts ASP não no servidor de banco de dados, mas em outra máquina. necessário para visualizar campos e dados. Os dados precisam ser instalados separadamente. Aqui está uma ferramenta para você: Msqry32.exe (Microsoft Query). Este arquivo é instalado com o Office97 e geralmente está localizado no diretório "Microsoft OfficeOffice".
Exemplo wuf70.asp:
<%@ LANGUAGE="VBSCRIPT" %>
<!--#include file="AdoSQL7.asp"-->
<!--#include file="adovbs.inc"-->
<% 'wuf70.asp
Dim cmdTest, prmTest, rsTest
'Criar objeto Comando
Definir cmdTest = Server.CreateObject("ADODB.Command")
'Objetos Recordset e Command podem se conectar a objetos Connection por meio da propriedade ActiveConnection.
cmdTest.ActiveConnection = Cnn
'Comando SQL - contém dois parâmetros, use? expressar
cmdTest.CommandText = "Atualizar tarefas definidas job_desc = ? Onde job_id = ?"
'Define o tipo de comando como instrução SQL
cmdTest.CommandType = adCmdText
O atributo 'Prepared determina se o comando SQL deve ser compilado primeiro. Defini-lo como True pode acelerar a execução.
cmdTest.Prepared = Verdadeiro
'Criar objeto Parâmetro
Definir prmTest=cmdTest.CreateParameter("job_desc",adVarChar,adParamInput,50,"rede")
'Anexar dados à coleção de dados de parâmetros
cmdTest.Parameters.Append prmTest
Definir prmTest = cmdTest.CreateParameter("job_id",adSmallInt,adParamInput,,"12")
cmdTest.Parameters.Append prmTest
'Execute modificações - não há necessidade de retornar resultados, basta usar cmdTest.Execute
cmdTest.Execute
'Redefinir parâmetros e executar – você pode modificar outro dado
cmdTest.Parameters("job_id") = "1"
cmdTest.Parameters("job_desc") = "Teste"
cmdTest.Execute
'Redefinir parâmetros para executar
cmdTest("id_trabalho") = "14"
cmdTest("job_desc") = "Finanças"
cmdTest.Execute
Definir rsTest = Cnn.Execute("Selecione job_id,job_desc dos trabalhos")
Embora não seja rsTest.EOF
Response.Write rsTest(0) & rsTest(1) & "<br>"
rsTest.MoveNext
Wend
Cnn.close: Definir prmTest = Nada
Definir cmdTest = Nada: Definir Cnn = Nada
%>
analisar:
1. O método CreateParameter do objeto Command é usado para criar objetos de parâmetro para comandos SQL ou procedimentos armazenados. Existem cinco parâmetros no total (todos os cinco parâmetros são opcionais):
O primeiro parâmetro: o nome do objeto parâmetro;
O segundo parâmetro: o tipo de dados do objeto de parâmetro, existem muitos tipos, consulte a ajuda do ADO, aqui adVarChar (valor da string), adSmallInt (inteiro assinado de 2 bytes);
O terceiro parâmetro: tipo de parâmetro. Pode ser: adParamInput (indica um parâmetro de entrada), adParamOutput (indica um parâmetro de saída), adParamReturnValue (indica um valor de retorno), adParamUnknown (indica que o tipo de parâmetro não pode ser determinado), adParamInputOutput (indica um parâmetro de entrada/saída);
O quarto parâmetro: o comprimento dos dados do parâmetro É melhor especificá-lo como igual ao comprimento do campo correspondente no banco de dados para evitar erros ao usá-lo, especialmente quando o tipo de dados for VarChar. tipo de data, não é necessário fornecer esse valor;
O quinto parâmetro: o valor inicial da configuração do parâmetro.
2. O método cmdTest.Parameters.Append adiciona um objeto Parameter à coleção de dados Parameters. Neste exemplo, você também pode ver como usar vários parâmetros.
3. Como você pode ver neste exemplo, você só precisa redefinir os parâmetros de entrada para modificar outros dados, o que é muito conveniente. Essa ideia também é um dos métodos mais comumente usados em programação.
4. Para redefinir os parâmetros, você pode usar cmdTest.Parameters ou omiti-lo como cmdTest("job_id").
2. Usando procedimentos armazenados em ASP O que é um procedimento armazenado (um procedimento armazenado está localizado no servidor de banco de dados e é uma coleção de instruções SQL que pode conter uma ou mais instruções SQL). o conteúdo desta palestra. Esta palestra fornece principalmente exemplos para ilustrar como chamar procedimentos armazenados em ASP.
Os benefícios de usar procedimentos armazenados são grandes. Os procedimentos armazenados são mais eficientes do que executar comandos SQL em scripts ASP; eles podem melhorar o desempenho geral e reduzir a carga da rede (reduzindo a interação entre o servidor de rede e o servidor de dados); e aumentar a flexibilidade do código, etc.
(1) Usando parâmetros de entrada no procedimento armazenado O procedimento armazenado usado neste exemplo é "byroyalty" que vem com o SQL Server 7.0. A instrução SQL nele nada mais é do que um CREATE PROCEDURE byroyalty adicional e uma entrada. . O parâmetro é @porcentagem:
CRIAR PROCEDIMENTO porroyalty @percentage int
COMO
selecione au_id do autor do título
onde titleauthor.royaltyper = @percentage
Exemplo wuf71.asp
<% @LANGUAGE = VBScript%>
<!--#include file="AdoSQL7.asp"-->
<!--#include file="adovbs.inc"-->
<% 'wuf71.asp
Dim cmdTest, prmTest, rsTest
Definir cmdTest = Server.CreateObject("ADODB.Command")
cmdTest.CommandText = "byroyalty" 'Nome do procedimento armazenado
'Define o tipo de comando como procedimento armazenado
cmdTest.CommandType = adCmdStoredProc
'Criar objeto Parâmetro
Definir prmTest = Server.CreateObject("ADODB.Parameter")
'O atributo Type corresponde ao segundo parâmetro em wuf70.asp
prmTest.Type = adInteger 'Inteiro assinado de 4 bytes' O atributo de direção corresponde ao terceiro parâmetro em wuf70.asp
prmTest.Direction = adParamInput
'O atributo Value corresponde ao quinto parâmetro em wuf70.asp
prmTeste.Valor = 30
cmdTest.Parameters.Append prmTest
Definir cmdTest.ActiveConnection = Cnn
'Você precisa retornar um conjunto de registros, então use Set rsTest = cmdTest.Execute
Definir rsTest = cmdTest.Execute
Embora não seja rsTest.EOF
Response.Write rsTest(0) & "<br>"
rsTest.MoveNext
Wend
Cnn.fechar
Definir rsTest = Nada: Definir prmTest = Nada
Definir cmdTest = Nada: Definir Cnn = Nada
%>
A propriedade CommandText pode especificar um comando SQL, um procedimento armazenado ou um nome de tabela.
Neste exemplo, criar um objeto Parameter é um pouco diferente de wuf70.asp. Na verdade, se você observar com atenção, o significado é semelhante. Existem dois atributos não utilizados neste exemplo: prmTest.Name, prmTest.Size, mais Type, Direction. e Valor, correspondente aos cinco parâmetros em wuf70.asp.
(2) Ao usar parâmetros de saída para obter um registro ou calcular um valor de uma tabela de banco de dados, você precisa usar um procedimento armazenado que retorne parâmetros de saída. Por exemplo, primeiro crie um novo procedimento armazenado OUTemploy na biblioteca pubs do SQL Server. Esse procedimento armazenado precisa inserir duas datas e, em seguida, gerar um valor máximo.
CRIAR PROCEDIMENTO OUTemploy
(
@job_lvl tinyint SAÍDA,
@hire_date1 datahora,
@hire_date2 datahora
)
COMO
selecione @job_lvl = MAX(job_lvl) do funcionário
onde Hire_date >= @hire_date1 e Hire_date <= @hire_date2
Existem várias maneiras de criar procedimentos armazenados:
1. Use o Enterprise Manager do Microsoft SQL Server Após abri-lo, abra-o no diretório em árvore à esquerda: Console Root – Microsoft SQL Servers – SQL Server Group – ICBCZJP (Windows NT) – bancos de dados – pubs – procedimento armazenado – Novo procedimento armazenado. . Insira o procedimento armazenado. Finalmente, a detecção gramatical também pode ser realizada nele;
2. Usando o Query Analyzer do Microsoft SQL Server, primeiro conecte-se ao servidor de banco de dados e selecione o banco de dados pubs. Insira o procedimento armazenado acima e clique em Executar Consulta (ou pressione F5);
3. Utilizando VB6.0, após abrir o menu "Visualizar"/"Janela de Visualização de Dados", clique com o botão direito em "Link de Dados"/"Novo Link de Dados";
4. Use o script ASP para criar um procedimento armazenado, por exemplo wuf75.asp:
<% @LANGUAGE = VBScript%>
<!--#include file="AdoSQL7.asp"-->
<!--#include file="adovbs.inc"-->
<% 'wuf75.asp
DimStrSQL
'Nota: & Chr(10) & Chr(13) são completamente desnecessários, principalmente para a boa aparência.
StrSQL="CREATE PROCEDURE OUTemploy ( @job_lvl tinyint OUTPUT, " & Chr(10) & Chr(13) &_
"@hire_date1 datahora, @hire_date2 datahora) AS" & Chr(10) & Chr(13) &_
"selecione @job_lvl = MAX(job_lvl) do funcionário" &_
"onde contratar_data >= @hire_date1 e contratar_date <= @hire_date2"
Cnn.Execute StrSQL
Response.Write "Criar procedimento armazenado com sucesso"
Cnn.close: Definir Cnn = Nada
%>
Após a criação do procedimento armazenado, além de utilizar o menu, você também pode utilizar a instrução SQL "Drop Procedure OUTemploy" para excluí-lo.
Exemplo wuf72.asp – Envie os parâmetros de entrada necessários para o procedimento armazenado e obtenha os resultados de saída.
<% @LANGUAGE = VBScript%>
<!--#include file="AdoSQL7.asp"-->
<!--#include file="adovbs.inc"-->
<% 'wuf72.asp
Dim cmdTest, prmTest
Definir cmdTest = Server.CreateObject("ADODB.Command")
cmdTest.ActiveConnection = Cnn
cmdTest.CommandText = "OUTemploy" 'Nome do procedimento armazenado
cmdTest.CommandType = adCmdStoredProc
'Criar objeto Parâmetro
Definir prmTest = cmdTest.CreateParameter("job_lvl",adTinyInt,adParamOutput)
cmdTest.Parameters.Append prmTest
'adTinyInt - inteiro assinado de 1 byte
'adDbDate - valor da data (aaaammdd)
Definir prmTest = cmdTest.CreateParameter("hiredate1",adDBDate,adParamInput,,"1993-05-09")
cmdTest.Parameters.Append prmTest
Definir prmTest = cmdTest.CreateParameter("hiredate2",adDBDate,adParamInput,,"1994-02-01")
cmdTest.Parameters.Append prmTest
cmdTest.Execute
'As três expressões seguintes têm o mesmo significado
Response.Write cmdtest("job_lvl") & "<br>"
Response.Write cmdTest.Parameters("job_lvl") & "<br>"
Response.Write cmdTest.Parameters("job_lvl").Valor
Cnn.fechar
Definir prmTest = Nada
Definir cmdTest = Nada: Definir Cnn = Nada
%>
(3) Use o parâmetro de código de retorno para usar a instrução Return para retornar diferentes códigos de retorno do procedimento armazenado. Por exemplo, o procedimento armazenado a seguir primeiro obtém um conjunto de registros e, em seguida, retorna 1 se houver uma funcionária chamada Margaret, caso contrário, ele retornará. retorna 0.
Criar procedimento Returnemploy
COMO
selecione emp_id, fname do funcionário
If Exists(Selecione fname do funcionário Onde fname='Margaret')
Retorno(1)
Outro
Retorno(0)
Exemplo wuf73.asp
<% @LANGUAGE = VBScript%>
<!--#include file="AdoSQL7.asp"-->
<!--#include file="adovbs.inc"-->
<% 'wuf73.asp
Dim cmdTest, prmTest, rsTest
Definir cmdTest = Server.CreateObject("ADODB.Command")
cmdTest.ActiveConnection = Cnn
cmdTest.CommandText = "Returnemploy" 'Nome do procedimento armazenado
cmdTest.CommandType = adCmdStoredProc
Definir prmTest = cmdTest.CreateParameter("ReturnValue",adInteger,adParamReturnValue)
cmdTest.Parameters.Append prmTest
Definir rsTest = cmdTest.Execute()
Embora não seja rsTest.EOF
Response.Write rsTest(0) & " ][ " & rsTest(1) & "<br>"
rsTest.MoveNext
Wend
rsTest.Close: Definir rsTest = Nada
'Antes de retornar cmdtest("ReturnValue"), rsTest deve ser fechado primeiro, caso contrário o resultado estará errado
Se cmdtest("ReturnValue") = 1 Então
Response.Write "Existe este funcionário"
Outro
Resposta.Escreva "Esse funcionário não existe"
Terminar se
Cnn.fechar
Definir prmTest = Nada
Definir cmdTest = Nada: Definir Cnn = Nada
%>
3. Como processar big data O "big data" aqui refere-se principalmente aos campos Texto (texto grande) e Imagem (imagem), cujos dados não podem ser obtidos corretamente pelo método descrito acima. Você deve primeiro usar Size = rsTest(0).ActualSize para obter o comprimento real do valor do campo e, em seguida, usar rsTest(0).GetChunk(Size) para obter os dados. No uso real, como esses campos são relativamente grandes, para economizar e utilizar racionalmente os recursos do servidor, geralmente é adotada a leitura segmentada. Exemplo wuf74.asp:
<% @LANGUAGE = VBScript%>
<!--#include file="AdoSQL7.asp"-->
<!--#include file="adovbs.inc"-->
<% 'wuf74.asp
Dim StrSQL, rsTest
'pr_info é um campo de texto
StrSQL = "Selecione pr_info,pub_id de pub_info"
Definir rsTest = Cnn.Execute(StrSQL)
Dim BasicSize, BeginSize, LText
Faça enquanto não rsTest.EOF
Response.Write rsTest(1) & "<br>"
'Lê 1024 bytes de cada vez
Tamanho Básico = 1024
TamanhoInício = 0
Enquanto BeginSize < rsTest(0).ActualSize
LText = rsTest(0).GetChunk(BasicSize)
BeginSize = BeginSize + BasicSize
'Saída para o cliente segmento por segmento
Resposta.Write LText
Wend
Resposta.Escreva "<br><br>"
rsTest.MoveNext
Laço
Cnn.fechar
Definir rsTest = Nada: Definir Cnn = Nada
%>
Neste exemplo, um máximo de 1.024 bytes são lidos de cada vez e os dados são lidos várias vezes. Pelo contrário, se você gravar big data no banco de dados, o método será semelhante ao anterior, mas em vez de usar o método GetChunk, você usará o método AppendChunk:
rsTest(0).AppendChunkLtext
Nota: Por fim, apresentarei um pequeno truque sobre o banco de dados SQL Server. Se você se deparou com esta situação: os dados chineses no banco de dados são exibidos como caracteres ilegíveis, não entre em pânico. Você só precisa ir ao meu site para baixar sqlsrv32.dll e sobrescrever o arquivo com o mesmo nome em "C:WindowsSystem". A origem do problema é o driver do SQL Server, que normalmente ocorre no Windows 98 Second Edition (o número da versão do driver do SQL Server é 3.70.06.23) ou no Windows 2000 ou quando o MDAC2.5 (o número da versão é 3.70.08.20) está instalado .