Endereço original: http://www.51la.org/webjx/htmldata/2005-12-24/1135405777.html
Resumo Chamadas de procedimento armazenado são comumente usadas em sistemas b/s. O método de chamada tradicional não é apenas lento, mas o código continuará a se expandir à medida que o número de procedimentos armazenados aumenta, dificultando sua manutenção. O novo método resolve esses problemas até certo ponto.
Palavras-chave asp.net; procedimentos armazenados No processo de utilização do .net, o acesso ao banco de dados é uma parte muito importante, principalmente no processo de construção do sistema b/s, a operação do banco de dados tornou-se quase uma operação essencial. Chamar procedimentos armazenados para implementar operações de banco de dados é um método usado por muitos programadores, e a maioria dos programadores usa procedimentos armazenados, se puderem, e raramente usa instruções SQL diretamente, portanto, os procedimentos armazenados são muito úteis e importantes.
Introdução aos procedimentos armazenados
Simplificando, um procedimento armazenado é um procedimento encapsulado composto por algumas instruções SQL e instruções de controle. Ele reside no banco de dados e pode ser chamado por um aplicativo cliente ou por outro procedimento ou gatilho. Seus parâmetros podem ser passados e retornados. Semelhante aos procedimentos de função em um aplicativo, os procedimentos armazenados podem ser chamados pelo nome e também possuem parâmetros de entrada e saída.
De acordo com os diferentes tipos de valores de retorno, podemos dividir os procedimentos armazenados em três categorias: procedimentos armazenados que retornam conjuntos de registros, procedimentos armazenados que retornam valores numéricos (também chamados de procedimentos armazenados escalares) e procedimentos armazenados comportamentais. Como o nome indica, o resultado da execução de um procedimento armazenado que retorna um conjunto de registros é um conjunto de registros. Um exemplo típico é recuperar registros que atendem a uma ou várias condições do banco de dados. Um procedimento armazenado que retorna um valor numérico retorna um valor. após a execução, por exemplo, no banco de dados Execute uma função ou comando com valor de retorno; por fim, o procedimento armazenado comportamental é usado apenas para implementar uma determinada função do banco de dados sem valor de retorno, como operações de atualização e exclusão no banco de dados; .
Benefícios do uso de procedimentos armazenados
Em comparação com o uso direto de instruções SQL, a chamada direta de procedimentos armazenados em um aplicativo traz os seguintes benefícios:
(1) Redução do tráfego de rede. Pode não haver uma grande diferença no tráfego de rede entre chamar um procedimento armazenado com um pequeno número de linhas e chamar diretamente instruções SQL. No entanto, se o procedimento armazenado contiver centenas de instruções SQL, seu desempenho será definitivamente melhor do que chamar instruções SQL uma por vez. um muito mais alto.
(2) A velocidade de execução é mais rápida. Há dois motivos: primeiro, quando o procedimento armazenado é criado, o banco de dados já o analisou e otimizou uma vez. Em segundo lugar, uma vez executado o procedimento armazenado, uma cópia do procedimento armazenado será retida na memória, de modo que na próxima vez que o mesmo procedimento armazenado for executado, ele poderá ser chamado diretamente da memória.
(3) Maior adaptabilidade: Como os procedimentos armazenados acessam o banco de dados por meio de procedimentos armazenados, os desenvolvedores de banco de dados podem fazer qualquer alteração no banco de dados sem alterar a interface do procedimento armazenado, e essas alterações não afetarão o banco de dados.
(4) Trabalho distribuído: O trabalho de codificação do aplicativo e do banco de dados pode ser realizado de forma independente, sem suprimir um ao outro.
Pela análise acima, podemos perceber que é necessário utilizar procedimentos armazenados nas aplicações.
Dois métodos diferentes de chamada de procedimentos armazenados
Para destacar as vantagens do novo método, vamos primeiro apresentar o método "oficial" de chamada de procedimentos armazenados em .net. Além disso, todos os programas de exemplo neste artigo funcionam no banco de dados sqlserver. Outras situações são semelhantes e não serão explicadas uma por uma no futuro. Todos os exemplos neste artigo estão na linguagem C#.
Para acessar o banco de dados em um aplicativo, as etapas gerais são: primeiro declarar uma conexão de banco de dados sqlconnection e, em seguida, declarar um comando de banco de dados sqlcommand para executar instruções SQL e procedimentos armazenados. Com esses dois objetos, você pode utilizar diferentes métodos de execução para atingir seus objetivos de acordo com suas necessidades. O que precisa ser adicionado é que não se esqueça de adicionar a seguinte instrução de referência à página: using system.data.sqlclient.
No que diz respeito à execução de procedimentos armazenados, se o primeiro tipo de procedimento armazenado for executado, um adaptador de dados deverá ser usado para preencher os resultados em um conjunto de dados e, em seguida, o controle da grade de dados poderá ser usado para apresentar os resultados na página; se o executado for o segundo e terceiro procedimentos armazenados, este procedimento não é necessário. Você só precisa determinar se a operação foi concluída com êxito com base no retorno específico.
(1) O código para executar um procedimento armazenado sem parâmetros é o seguinte:
sqlconnection conn=new sqlconnection("string de conexão");
sqldataadapter da = new sqldataadapter();
da.selectcommand = new sqlcommand();
da.selectcommand.connection = conn;
da.selectcommand.commandtext = "nome do procedimento";
da.selectcommand.commandtype = commandtype.storedprocedure;
Depois é só escolher a forma adequada de realizar o processo aqui para diferentes finalidades.
(2) O código para executar um procedimento armazenado com parâmetros é o seguinte (podemos declarar a função que chama o procedimento armazenado como exeprocedure(string inputdate)):
sqlconnection conn=new sqlconnection("string de conexão");
sqldataadapter da = new sqldataadapter();
da.selectcommand = new sqlcommand();
da.selectcommand.connection = conn;
da.selectcommand.commandtext = "nome do procedimento";
da.selectcommand.commandtype = commandtype.storedprocedure;
(O código acima é o mesmo, o seguinte é o código a ser adicionado)
parâmetro = novo sqlparameter("@nomedoparâmetro", sqldbtype.datetime);
param.direção = parâmetrodireção.input;
param.valor = convert.todatetime(datadeentrada);
da.selectcommand.parameters.add(param);
Isso adiciona um parâmetro de entrada. Se você precisar adicionar parâmetros de saída:
parâmetro = novo sqlparameter("@nomedoparâmetro", sqldbtype.datetime);
param.direção = parâmetrodireção.output;
param.valor = convert.todatetime(datadeentrada);
da.selectcommand.parameters.add(param);
Para obter o valor de retorno de um procedimento armazenado de parâmetro:
parâmetro = novo sqlparameter("@nomedoparâmetro", sqldbtype.datetime);
param.direção = parâmetrodireção.returnvalue;
param.valor = convert.todatetime(datadeentrada);
da.selectcommand.parameters.add(param);
A partir do código acima, podemos ver que quando há muitos procedimentos armazenados ou muitos parâmetros nos procedimentos armazenados, este método afetará muito a velocidade de desenvolvimento, por outro lado, se o projeto for relativamente grande, então essas funções para; a lógica do banco de dados também será um grande fardo na manutenção futura. Então, existe uma maneira melhor de resolver esse problema? Pensei que ao executar um procedimento armazenado sem parâmetros, só precisávamos passar o nome de um procedimento armazenado para chamar o procedimento armazenado correspondente e, no banco de dados sqlserver, podemos digitar diretamente o "nome do procedimento armazenado (lista de parâmetros) " no analisador de consultas. Procedimentos armazenados podem ser executados com essas strings. Então, essa ideia pode ser aplicada a aplicativos?
Portanto digite o código correspondente no compilador. Esses códigos são modificados com base no código que chama o procedimento armazenado sem parâmetros. O código específico é o seguinte:
sqlconnection conn=new sqlconnection("string de conexão");
sqldataadapter da = new sqldataadapter();
da.selectcommand = new sqlcommand();
da.selectcommand.connection = conn;
da.selectcommand.commandtext = "nomedoprocedimento('para1','para2',para3)";
da.selectcommand.commandtype = commandtype.storedprocedure;
Para tornar o código mais representativo, o primeiro e o segundo parâmetros do procedimento armazenado a ser chamado são do tipo string e o terceiro parâmetro é do tipo inteiro. Após a execução, constatei que os resultados esperados podem ser alcançados!
Comparação dos dois métodos de chamada Através da comparação, podemos perceber que o segundo método tem uma vantagem óbvia, ou seja, pode aumentar a velocidade de desenvolvimento, economizar tempo de desenvolvimento, e o código é fácil de manter, além de reduzir o tamanho do sistema até certo ponto. No entanto, como o processamento de parâmetros de procedimento armazenado é relativamente geral, se você deseja obter parâmetros de saída ou obter o valor de retorno de um procedimento armazenado, esse método não poderá atender às necessidades. Mesmo assim, esse método pode permitir que os desenvolvedores salvem grande parte do código. Se você não precisa obter os parâmetros de saída e os valores de retorno, quase poderá fazê-lo "de uma vez por todas". Portanto, no desenvolvimento real do programa, este método ainda tem certo valor prático.