COMO: Chamar um procedimento armazenado parametrizado usando o ADO.NET e Visual C#.NET

Traduções de Artigos Traduções de Artigos
Artigo: 310070 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Há várias maneiras de usar o ADO.NET para chamar um procedimento armazenado e para obter valores de retorno e retornar os parâmetros, incluindo:
  • Use um objeto DataSet para reunir as linhas retornadas e trabalhar com essas linhas além para os valores de retorno e os parâmetros de retorno.
  • Use um objeto DataReader para coletar as linhas retornadas, mover essas linhas e para reunir valores de retorno e parâmetros de retorno.
  • Use o método ExecuteScalar para retornar o valor da primeira coluna da primeira linha os resultados com os valores de retorno e os parâmetros de retorno. Isso é mais útil com funções agregadas.
  • Use o método ExecuteNonQuery para retornar somente os parâmetros de retorno e os valores de retorno. As linhas retornadas são descartadas. Isso é útil para executar consultas de ação.
Este artigo demonstra três métodos e usa o SqlCommand e os objetos OleDbCommand . Certifique-se de que você copiar apenas o código para o provedor gerenciado que você está usando. Se você não tiver certeza qual provedor gerenciado, você deve usar, visite o seguinte site da Microsoft Developer Network:
.NET Data Providers
Em cada um dos exemplos neste artigo, os parâmetros são adicionados à coleção de parâmetros do objeto Command . Quando você usa o objeto SqlCommand , você não tem adicionar os parâmetros em uma ordem específica, mas os parâmetros devem ter o nome correto. Quando você usa o objeto OleDbCommand , você deve adicionar os parâmetros na ordem correta e você não pode usar os parâmetros por nome.

Use o DataReader para retornar linhas e parâmetros

Você pode usar o objeto DataReader para retornar um fluxo somente leitura, somente encaminhamento de dados. As informações contidas DataReader podem vir de um procedimento armazenado. Este exemplo usa o objeto DataReader para executar um procedimento armazenado que tem uma entrada e um parâmetro de saída e percorre os registros retornados para exibir os parâmetros de retorno.
  1. Crie o procedimento armazenado seguinte no servidor que está executando o Microsoft SQL Server:
    Create Procedure TestProcedure
    (
      @au_idIN varchar (11),
      @numTitlesOUT Integer OUTPUT
    )
    AS 
    
    select A.au_fname, A.au_lname, T.title 
    from authors as A join titleauthor as TA on
    A.au_id=TA.au_id
    join titles as T
    on T.title_id=TA.title_id
    where A.au_id=@au_idIN
    set @numTitlesOUT = @@Rowcount
    return (5) 
    					
  2. Crie um Visual novo de C#.NET Windows Application projeto.
  3. Use a instrução usando o sistema e os namespaces System. Data para que você não tenha que qualificar declarações esses namespaces posteriormente no seu código. Adicione esse código na parte superior do módulo de código do formulário. Certifique-se copiar apenas o código para o provedor que você escolheu.SQL cliente
    using System.Data.SqlClient;
    					
    Provedor de dados de BD OLE
    using System.Data.OleDb;
    					
  4. Substitua o código no evento Form_Load privado com o seguinte código:SQL cliente
    SqlConnection PubsConn = new SqlConnection 
    ("Data Source=server;integrated " + 
    "Security=sspi;initial catalog=pubs;");
    SqlCommand testCMD = new SqlCommand 
    ("TestProcedure", PubsConn);
    
    testCMD.CommandType = CommandType.StoredProcedure;
    
    SqlParameter RetVal = testCMD.Parameters.Add 
       ("RetVal", SqlDbType.Int);
    RetVal.Direction = ParameterDirection.ReturnValue;
    SqlParameter IdIn = testCMD.Parameters.Add 
      ("@au_idIN", SqlDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    SqlParameter NumTitles = testCMD.Parameters.Add 
       ("@numtitlesout", SqlDbType.VarChar, 11);
    NumTitles.Direction = ParameterDirection.Output ;
            
    IdIn.Value = "213-46-8915";
    PubsConn.Open();
    
    SqlDataReader myReader = testCMD.ExecuteReader();
    Console.WriteLine ("Book Titles for this Author:");
    while (myReader.Read()) 
       {
         Console.WriteLine ("{0}", myReader.GetString (2));
       };
    myReader.Close() ;
    Console.WriteLine("Number of Rows: " + NumTitles.Value );
    Console.WriteLine("Return Value: " + RetVal.Value);
    					
    Provedor de dados de BD OLE
    OleDbConnection PubsConn = new OleDbConnection 
       ("Provider=SQLOLEDB;Data Source=server;" + 
       "integrated Security=sspi;initial catalog=pubs;");
    OleDbCommand testCMD = new OleDbCommand 
       ("TestProcedure", PubsConn);
    
    testCMD.CommandType = CommandType.StoredProcedure;
    
    OleDbParameter RetVal = testCMD.Parameters.Add 
       ("RetVal", OleDbType.Integer);RetVal.Direction = ParameterDirection.ReturnValue;
    OleDbParameter IdIn = testCMD.Parameters.Add 
       ("@au_idIN", OleDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    OleDbParameter NumTitles = testCMD.Parameters.Add 
       ("@numtitlesout", OleDbType.VarChar, 11);
    NumTitles.Direction = ParameterDirection.Output;
            
    IdIn.Value = "213-46-8915";
    
    PubsConn.Open();
    
    OleDbDataReader myReader = testCMD.ExecuteReader();
    Console.WriteLine ("Book Titles for this Author:");
    while (myReader.Read()) 
       {
         Console.WriteLine ("{0}", myReader.GetString (2));
       };
    myReader.Close() ;
    Console.WriteLine("Number of Rows: " + NumTitles.Value );
    Console.WriteLine("Return Value: " + RetVal.Value);
    					
  5. Modificar a seqüência de conexão para o objeto de conexão apontar para o computador que está executando o SQL Server.
  6. Execute o código. Observe que o DataReader recupera os registros e, em seguida, retorna os valores de parâmetro. Você pode usar o método de leitura do objeto DataReader para percorrer os registros retornados.

    A janela Saída exibe os títulos dos dois livros, o valor de retorno de 5 e o parâmetro de saída que contém o número de registros (2). Observe que você deve fechar o DataReader no código para ver os valores de parâmetro. Além disso, observe que não precisa percorrer todos os registros para ver os parâmetros de retorno se DataReader está fechado.

Use o método ExecuteScalar do objeto Command

Você pode usar o método ExecuteScalar do objeto de comando para recuperar valores de parâmetro. Além disso, ExecuteScalar retorna a primeira coluna da primeira linha do procedimento armazenado. Isso é mais útil para funções agregadas como no exemplo a seguir.
  1. Crie o procedimento armazenado seguinte no servidor que está executando o SQL Server:
    Create Procedure TestProcedure2
    (
      @au_idIN varchar (11)
    )
    As
    /* set nocount on */ 
    select count (T.title) 
    from authors as A join titleauthor as TA on
    A.au_id=TA.au_id
    join titles as T
    on T.title_id=TA.title_id
    where A.au_id=@au_idIN
    Return(5)
    					
  2. Crie um Visual novo de C#.NET Windows Application projeto.
  3. Use a instrução usando o sistema e os namespaces System. Data para que você não tenha que qualificar declarações esses namespaces posteriormente no seu código. Adicione esse código na parte superior do módulo de código do formulário. Certifique-se de que você copiar apenas o código para o provedor que você escolheu.SQL cliente
    using System.Data.SqlClient;
    					
    Provedor de dados de BD OLE
    using System.Data.OleDb;
    					
  4. Adicione o seguinte código ao evento Form_Load :Cliente SQL
    string strCount;
    SqlConnection PubsConn = new SqlConnection 
       ("Data Source=server;integrated " + 
       "Security=sspi;initial catalog=pubs;");
    SqlCommand testCMD = new SqlCommand 
       ("TestProcedure2", PubsConn);
    
    testCMD.CommandType = CommandType.StoredProcedure;
    
    SqlParameter RetVal = testCMD.Parameters.Add 
       ("RetVal", SqlDbType.Int);
    RetVal.Direction = ParameterDirection.ReturnValue;
    SqlParameter IdIn = testCMD.Parameters.Add 
       ("@au_idIN", SqlDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
            
    IdIn.Value = "213-46-8915";
    
    PubsConn.Open();
    
    strCount =testCMD.ExecuteScalar ().ToString() ;
    
    Console.WriteLine("Number of Rows: " + strCount );
    Console.WriteLine("Return Value: " + RetVal.Value);
    					
    Provedor de dados de BD OLE
    string strCount;
    OleDbConnection PubsConn = new OleDbConnection 
       ("Provider=SQLOLEDB;Data Source=server;" + 
       "integrated Security=sspi;initial catalog=pubs;");
    OleDbCommand testCMD = new OleDbCommand 
       ("TestProcedure2", PubsConn);
    
    testCMD.CommandType = CommandType.StoredProcedure;
    
    OleDbParameter RetVal = testCMD.Parameters.Add 
       ("RetVal", OleDbType.Integer);
    RetVal.Direction = ParameterDirection.ReturnValue;
    OleDbParameter IdIn = testCMD.Parameters.Add 
       ("@au_idIN", OleDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    
    IdIn.Value = "213-46-8915";
    
    PubsConn.Open();
    
    strCount = testCMD.ExecuteScalar().ToString() ;
    
    Console.WriteLine("Number of Rows: " + strCount);
    Console.WriteLine("Return Value: " + RetVal.Value);
    					
  5. Modificar a seqüência de conexão para o objeto de conexão apontar para o computador que está executando o SQL Server.
  6. Execute o código. Observe que o método ExecuteScalar do objeto Command retorna os parâmetros. ExecuteScalar também retorna o valor da coluna 1, linha 1 do conjunto de linhas retornado. Portanto, o valor de intCount é o resultado da função contagem do procedimento armazenado.

Use o método ExecuteNonQuery do objeto Command

Este exemplo utiliza o método ExecuteNonQuery para executar a consulta e retornar os valores de parâmetro. ExecuteNonQuery também retorna o número de registros afetados após a consulta é executada. No entanto, ExecuteNonQuery não retorna quaisquer linhas ou colunas do procedimento armazenado.

O método ExecuteNonQuery é mais útil quando você usar instruções INSERT, UPDATE ou DELETE se você tiver apenas saber quantas linhas são alteradas. Um procedimento armazenado no qual você está usando apenas uma instrução SELECT, você recebe -1 porque não há linhas são afetadas pela consulta.
  1. Crie o seguinte procedimento armazenado no computador que está executando o SQL Server:
    Create Procedure TestProcedure3
    (
      @au_idIN varchar (11),
      @au_fnam varchar (30)
    )
    
    As
    /* set nocount on */ 
    Update authors set au_fname = @au_fnam
    where au_id = @au_idin	
    return (5)
    					
  2. Crie um Visual novo de C#.NET Windows Application projeto.
  3. Use a instrução usando o sistema e os namespaces System. Data para que você não tenha que qualificar declarações esses namespaces posteriormente no seu código. Adicione esse código na parte superior do módulo de código do formulário. Certifique-se de que você copiar apenas o código para o provedor que você escolheu.SQL cliente
    using System.Data.SqlClient;
    					
    Provedor de dados de BD OLE
    using System.Data.OleDb;
    					
  4. Substitua o código abaixo o evento Form1_Load privado no módulo de código de Form1 com o seguinte código:SQL cliente
    string strRowAffect;
    SqlConnection PubsConn = new SqlConnection 
       ("Data Source=server;integrated Security=sspi;" + 
       "initial catalog=pubs;");
    SqlCommand testCMD = new SqlCommand 
       ("TestProcedure3", PubsConn);
    
    testCMD.CommandType = CommandType.StoredProcedure;
    
    SqlParameter RetVal = testCMD.Parameters.Add 
       ("RetVal", SqlDbType.Int);
    RetVal.Direction = ParameterDirection.ReturnValue;
    SqlParameter IdIn = testCMD.Parameters.Add 
       ("@au_idIN", SqlDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    SqlParameter FnameIn = testCMD.Parameters.Add 
       ("@au_fnam", SqlDbType.VarChar, 30);
    FnameIn.Direction = ParameterDirection.Input;
    
    IdIn.Value = "213-46-8915";
    FnameIn.Value = "Marjorie";
    
    PubsConn.Open();
    
    strRowAffect =testCMD.ExecuteNonQuery ().ToString() ;
    
    Console.WriteLine("Number of Rows: " + strRowAffect );
    Console.WriteLine("Return Value: " + RetVal.Value);
    					
    Provedor de dados de BD OLE
    int intRowAffected;
    OleDbConnection PubsConn = new OleDbConnection 
       ("Provider=SQLOLEDB;Data Source=server;" + 
       "integrated Security=sspi;initial catalog=pubs;");
    OleDbCommand testCMD = new OleDbCommand 
       ("TestProcedure3", PubsConn);
    
    testCMD.CommandType = CommandType.StoredProcedure;
    
    OleDbParameter RetVal = testCMD.Parameters.Add 
       ("RetVal", OleDbType.Integer);
    RetVal.Direction = ParameterDirection.ReturnValue;
    OleDbParameter IdIn = testCMD.Parameters.Add 
       ("@au_idIN", OleDbType.VarChar, 11);
    IdIn.Direction = ParameterDirection.Input;
    OleDbParameter FnameIn = testCMD.Parameters.Add
       ("@au_fname", OleDbType.VarChar, 30);
    FnameIn.Direction = ParameterDirection.Input;
    
    IdIn.Value = "213-46-8915";
    FnameIn.Value = "Marjorie";
    
    PubsConn.Open();
    intRowAffected = testCMD.ExecuteNonQuery();
    
    Console.WriteLine("Number of Rows affected: " + intRowAffected);
    Console.WriteLine(RetVal.Value);
    					
  5. Modificar a seqüência de conexão para o objeto de conexão apontar para o computador que está executando o SQL Server.
  6. Execute o código. A janela Saída exibe o número de linhas afetadas (intRowAffect) e o valor do parâmetro de retorno.

Referências

Para obter informações adicionais, visite os seguintes sites da MSDN:
Introdução ao.NET Framework Class Library

Recuperando dados usando o DataReader

Propriedades

Artigo: 310070 - Última revisão: 12 de junho de 2012 - Revisão: 1.0
A informação contida neste artigo aplica-se a:
  • Microsoft ADO.NET 1.1
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 Standard Edition
Palavras-chave: 
kbhowtomaster kbsqlclient kbstoredproc kbsystemdata kbmt KB310070 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 310070

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com