Declaração: Este artigo foi publicado em "Aplicações de Computador" Volume 23 Edição 11
Resumo: No desenvolvimento de diversos sistemas, utilizar procedimentos armazenados é um bom hábito, que não só traz recursos como tabelas temporárias, funções e cursores, mas também Depuração, atualização e manutenção tornam-se convenientes. No entanto, quase todas as chamadas de procedimentos armazenados estão no mesmo modo, e a principal diferença é que os parâmetros de cada procedimento armazenado são diferentes. Então, é possível usar um método para unificar todas as chamadas de procedimentos armazenados e reduzir a programação desnecessária? Com base no estudo do banco de dados SQL Server e ASP.NET, implementamos um método de chamada unificado. Este método só precisa fornecer o nome do procedimento armazenado a ser chamado e fornecer valores de parâmetros específicos ao chamar, para que qualquer armazenado. procedimento pode ser chamado.
Palavras-chave: procedimento armazenado, tabela do sistema, visualização da estrutura de informação, ADO.NET Código de identificação do documento: ② Relatório prático de realização técnica (tecnologia), resumo da aprendizagem teórica e prática social (ciências sociais)
Chame procedimentos armazenados da mesma maneira no .NET
Resumo: Usar procedimentos armazenados é um bom hábito no desenvolvimento de projetos. Ele fornece tabelas, funções e cursores temporários, e depuração, atualização e manutenção também podem se beneficiar disso. A diferença entre eles são os parâmetros de cada procedimento armazenado. Então, podemos chamar o procedimento armazenado da mesma maneira, apesar de suas diferenças, e reduzir o código de programação. Fizemos isso depois de estudar SQL Server e .NET. nome do procedimento armazenado e os valores de seus parâmetros, você não precisa criar os parâmetros sozinho. Palavra-chave: Procedimento Stord, Tabela do sistema, Esquema de informações, ADO.NET
Resumo: No desenvolvimento de um projeto, você costuma chamar o nome do
procedimento armazenado.procedimentos armazenados. No entanto, quase todas as chamadas de procedimentos armazenados seguem o mesmo padrão. A principal diferença está no tipo e no valor de cada parâmetro criado. Então, é possível chamar todos os procedimentos armazenados através de uma função (ou classe)? Este artigo implementa um método de chamada unificado baseado no princípio de usar as tabelas do sistema fornecidas pelo banco de dados. Este método só precisa fornecer o nome do procedimento armazenado a ser chamado e fornecer valores de parâmetros específicos ao chamar, para que qualquer. procedimento armazenado pode ser chamado.
Resumo: Temos que chamar procedimentos armazenados de sistemas de banco de dados durante o desenvolvimento de um projeto. Porém, chamar procedimentos armazenados é quase a mesma coisa, a principal diferença é a diferença entre o tipo ou valor dos parâmetros etc. uma função (ou uma classe)? Com base nas tabelas de sistema fornecidas pelos sistemas de banco de dados, escrevemos uma classe para chamar qualquer procedimento armazenado neste artigo. Para chamar um procedimento armazenado, os únicos parâmetros que você fornece são o nome do procedimento armazenado e o valor de todos os parâmetros do procedimento armazenado.
<DIV class=text4><B>1. Introdução</B></DIV>
No desenvolvimento de diversos sistemas, o uso de procedimentos armazenados é um bom hábito. Ele não apenas traz recursos como tabelas temporárias, funções e cursores, mas também facilita a depuração, atualizações e manutenção. Durante o processo de armazenamento, os dados podem ser processados e depois devolvidos, o que pode proporcionar mais análise e controle dos dados. Nas chamadas de procedimento armazenado, descobrimos que as chamadas de procedimento armazenado seguem quase o seguinte padrão:
1. Declarar SqlConnection
2. Declare SqlCommand e defina sua propriedade Connection para a instância SqlConnection recém-declarada, defina CommandName como o nome do procedimento armazenado e CommandType como o procedimento armazenado.
3. Adicione todos os parâmetros necessários para chamadas de procedimento armazenado à coleção Parameters da instância SqlCommand recém-declarada 4. Chame o método ExecuteReader() de SqlCommand para obter o conjunto de linhas retornado pelo procedimento armazenado.
4. Declare SqlDataAdapter e DataSet, defina a propriedade SelectCommand de SqlDataAdapter para a instância declarada em 3 e, em seguida, chame seu método Fill para preencher o conjunto de linhas retornado no DataSet.
5. Feche o objeto SqlConnection
6. Libere cada instância de objeto declarada (Nota: 4 refere-se aos dois métodos de extração de dados). Durante este processo de chamada, descobrimos que quase todas as chamadas de procedimento armazenado estão neste modo. A diferença está no armazenamento na etapa 2. Os diferentes nomes de processos. são diferentes dos parâmetros usados em cada chamada de procedimento armazenado na etapa 3. Eles têm diferenças em nomes de parâmetros, direções, tipos de dados, comprimentos, etc. Então, existe uma maneira de implementar todas as chamadas de procedimentos armazenados? Ou seja, você só precisa fornecer o nome do procedimento armazenado e, em seguida, passar os valores dos parâmetros para o método de chamada para realizar a chamada do procedimento armazenado e, em seguida, usar certas estruturas de dados para salvar o conjunto de linhas retornado, os valores dos parâmetros de saída e valores de retorno do processo. Depois de estudar as tabelas do sistema SQL Server, descobrimos que essa ideia é viável.
2. Tabelas de sistema e visualizações de estrutura de informações
Bancos de dados relacionais, como o SQL Server, armazenam metadados no banco de dados de alguma forma. No SQL Server, são o banco de dados do sistema e as tabelas do sistema. Após a instalação do SQL Server, quatro bancos de dados do sistema serão gerados automaticamente: master, model, msdb e tempdb. O banco de dados mestre é o armazém de todas as informações de nível de sistema no SQL Server. Contas de login, definições de configuração, procedimentos armazenados do sistema e a existência de outros bancos de dados são registrados no banco de dados mestre. O banco de dados msdb armazena informações do SQL Server Agent. Quando trabalhos, operadores e alertas são definidos, eles são armazenados no msdb. model é um modelo para todos os bancos de dados gerados pelo usuário. Ao gerar um novo banco de dados, copie o modelo e crie os objetos necessários. tempdb salva objetos temporários no SQL Server. Exibir tabelas temporárias geradas e procedimentos armazenados temporários, bem como objetos temporários gerados pelo sistema, todos utilizam tempdb. [1] E cada banco de dados possui suas próprias tabelas de sistema. Essas tabelas de sistema são usadas para armazenar informações de configuração e de objeto. A partir dessas tabelas do sistema podemos obter informações sobre todos os parâmetros de cada procedimento armazenado. Essas informações são armazenadas na tabela syscolumns. Existem nomes de parâmetros, tipos, comprimentos, direções, etc. que precisam ser usados em nosso método. No entanto, os campos nas tabelas do sistema serão alterados com a versão do SQL Server. Por exemplo, type e xtype em syscolumns são um exemplo de tais alterações. Ambos armazenam informações de tipo. Para adaptar nosso método às mudanças de versão do SQL Server, precisamos usar a visualização da estrutura de informação. ANSI-92 define visualizações de estrutura de informação como um conjunto de visualizações que fornecem dados do sistema. Ao aproveitar essa visualização, você pode ocultar as tabelas reais do sistema do seu aplicativo. As alterações nas tabelas do sistema não afetarão os aplicativos, portanto, os aplicativos podem ser independentes dos fornecedores e das versões do banco de dados. [1] ANSI-92 e SQL Server suportam o uso de uma estrutura de nomenclatura de três segmentos para referenciar objetos no servidor local. A terminologia ANSI-92 é chamada catalog.schema.object, enquanto o SQL Server a chama de database.owner.object. [1] Por exemplo, se quisermos encontrar todas as informações de parâmetros de todos os procedimentos armazenados, podemos usar: select * from INFORMATION_SCHEMA.PARAMETERS Se quisermos encontrar todas as informações de parâmetros de um determinado procedimento armazenado, é: select. * from INFORMATION_SCHEMA.PARAMETERS where SPECIFIC_NAME ='Proc1 ' Com a visualização da estrutura de informação, mais da metade dos nossos problemas foram resolvidos. A seguir, veremos como implementar nosso método em .NET.
3. O foco do método de implementação é como obter todas as informações de parâmetro do procedimento armazenado com base em seu nome e, em seguida, criar automaticamente cada parâmetro com base nessas informações de parâmetro. Para automatizar essas ações, o processo de declaração de SqlConnection, SqlCommand e SqlParameter, e o processo de criação de cada SqlParameter devem ser invisíveis para o usuário. A única coisa que o usuário precisa fornecer é o nome do procedimento armazenado e, em seguida, fornecer vários parâmetros ao chamar, e mesmo seus tipos não precisam ser fornecidos.
3.1 Obtendo e criando os parâmetros do procedimento armazenado Como obter e criar os parâmetros do procedimento armazenado a ser chamado é um ponto chave. Podemos implementar automaticamente esta etapa através da visualização da estrutura de informação.
// Obtenha e crie parâmetros do procedimento armazenado
private void GetProcedureParameter(params object[] parâmetros)
{ SqlCommand myCommand2 = new SqlCommand(
)
;
= '" + this.ProcedureName + "' ordenar por ORDINAL_POSITION";
SqlDataReader reader = null; reader = myCommand2.ExecuteReader(); // Cria parâmetro de retorno
myParameter = new SqlParameter();
myParameter.ParameterName = "@Value";
myParameter .SqlDbType = SqlDbType.Int;
myParameter.Direction = ParameterDirection.ReturnValue;
myCommand.Parameters.Add(myParameter);
// Crie cada parâmetro.
while(reader.Read())
{
myParameter = new SqlParameter();
myParameter.ParameterName = leitor["PARAMETER_NAME"].ToString()
; ?ParameterDirection.Input:ParameterDirection.Output;
switch(leitor["DATA_TYPE"].ToString()) {
case "int":
if(myParameter.Direction == ParameterDirection.Input)
myParameter.Value = (int)parâmetros[i] ;
myParameter.SqlDbType=
SqlDbType.Int
; //...muitoprocessamento
de
tipo específico é omitido
default : break
;
3.2 Conjunto de dados de resultado de retorno, valor de retorno e conjunto de parâmetros de saída Depois de criar os parâmetros do procedimento armazenado, podemos chamar o procedimento armazenado. Porque no .NET, as classes comumente usadas que retornam conjuntos de resultados são SqlDataReader e DataSet, e SqlDataReader só pode ser usado enquanto mantém uma conexão, mas DataSet não. Em nossa implementação, a conexão deve ser desconectada após a chamada, então um DataSet é usado para salvar o conjunto de resultados retornado.
public SqlResult Call(params object[] parameters){ // SqlResult é uma classe autodefinida usada para salvar conjuntos de dados de resultados, valores de retorno e conjuntos de parâmetros de saída. SqlResult result = new SqlResult(); necessário String
myConnection
=new
SqlConnection(ConnectionString
)
; Armazene os parâmetros do procedimento e defina os valores
GetProcedureParameter(parameters);
myAdapter.Fill(result.dataSet, "Table"); // Obtenha o valor do parâmetro de saída e o par de nomes do procedimento armazenado e salve-o em uma Hashtable;
GetOutputValue(
result) ; // Libera vários recursos aqui e desconecta
myAdapter.Dispose
(
)
;
4. Trabalho adicional Embora nossa implementação aqui seja para o banco de dados SQL Server, esse método pode ser usado para qualquer banco de dados que forneça visualizações de estrutura de informações, esteja em conformidade com o padrão ANSI-92 ou forneça metadados. Nós o encapsulamos em uma classe SqlProcedure, e o procedimento armazenado pode ser facilmente chamado quando necessário, reduzindo muito trabalho de código basicamente repetitivo. Para que a classe SqlProcedure suporte mais tipos de dados, no método GetProcedureParameter() você precisa analisar o tipo, direção, comprimento, valor padrão e outras informações de cada parâmetro de acordo com suas necessidades e, em seguida, criar esse parâmetro. Basicamente qualquer tipo pode ser implementado, até mesmo tipos de imagem podem ser criados desta forma. Desta forma a aula pode ser muito geral e útil em qualquer projeto.
Referências
[1] Ray Rankins, Paul Jensen, Paul Bertucci, Livro Prático do SQL Server 2000, Pequim: Electronic Industry Press, 2002
[2] Biblioteca MSDN, janeiro de 2003, Microsoft Corporation.
Sobre o autor: Liu Zhibo (1979-), homem, de Xinhua, Hunan, mestrado, principais direções de pesquisa: rede neural e reconhecimento de padrões, sistema de informação de automação de escritório.
e-mail: [email protected]