Como executar um procedimento armazenado no programa C #

Eu quero executar este procedimento armazenado de um programa c #.

Eu escrevi o seguinte procedimento armazenado em uma janela de consulta SqlServer e salvei como stored1:

use master 
go
create procedure dbo.test as

DECLARE @command as varchar(1000), @i int
SET @i = 0
WHILE @i < 5
BEGIN
Print 'I VALUE ' +CONVERT(varchar(20),@i)
EXEC(@command)
SET @i = @i + 1
END

EDITADO:

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace AutomationApp
{
    class Program
    {
        public void RunStoredProc()
        {
            SqlConnection conn = null;
            SqlDataReader rdr  = null;

            Console.WriteLine("\nTop 10 Most Expensive Products:\n");

            try
            {
                conn = new SqlConnection("Server=(local);DataBase=master;Integrated Security=SSPI");
                conn.Open();
                SqlCommand cmd = new SqlCommand("dbo.test", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                rdr = cmd.ExecuteReader();
                /*while (rdr.Read())
                {
                    Console.WriteLine(
                        "Product: {0,-25} Price: ${1,6:####.00}",
                        rdr["TenMostExpensiveProducts"],
                        rdr["UnitPrice"]);
                }*/
            }
            finally
            {
                if (conn != null)
                {
                    conn.Close();
                }
                if (rdr != null)
                {
                    rdr.Close();
                }
            }
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World");
            Program p= new Program();
            p.RunStoredProc();      
            Console.Read();
        }
    }
}

Isso exibe a exceçãoCannot find the stored procedure dbo.test. Eu preciso fornecer o caminho? Se sim, em que local os procedimentos armazenados devem ser armazenados?

 DigCamara26 de jul de 2013 00:54
Respostas não obstante: você verificou se o seu sp foi realmente criado com o nome que você deu (dbo.test)? Não sei o que aconteceria se um usuário não-dbo tentasse criar o dbo.test ... ele seria criado como não-dbo.test?
 RyanfaeScotland07 de mai de 2015 12:37
@obayhan Esta pergunta foi feita 2 anos antes do que você afirma ser uma possível duplicação de. Por favor, no futuro, marque a questão mais recente como duplicata.
 Joe Johnston20 de dez de 2012 04:53
É melhor usar um banco de dados diferente do mestre, mesmo para testes. Este é um banco de dados do sistema e você acabará causando problemas. No SQL 2012 ele não me deixa criar uma tabela lá. Por outro lado, permitirá que eu crie um sproc. : /

questionAnswers(11)

metros via reflexão. Observe que os nomes de propriedade de objetos precisam corresponder aos parâmetros do procedimento armazenado.

private static string ConnString = ConfigurationManager.ConnectionStrings["SqlConnection"].ConnectionString;
    private SqlConnection Conn = new SqlConnection(ConnString);

    public void ExecuteStoredProcedure(string procedureName)
    {
        SqlConnection sqlConnObj = new SqlConnection(ConnString);

        SqlCommand sqlCmd = new SqlCommand(procedureName, sqlConnObj);
        sqlCmd.CommandType = CommandType.StoredProcedure;

        sqlConnObj.Open();
        sqlCmd.ExecuteNonQuery();
        sqlConnObj.Close();
    }

    public void ExecuteStoredProcedure(string procedureName, object model)
    {
        var parameters = GenerateSQLParameters(model);
        SqlConnection sqlConnObj = new SqlConnection(ConnString);

        SqlCommand sqlCmd = new SqlCommand(procedureName, sqlConnObj);
        sqlCmd.CommandType = CommandType.StoredProcedure;

        foreach (var param in parameters)
        {
            sqlCmd.Parameters.Add(param);
        }

        sqlConnObj.Open();
        sqlCmd.ExecuteNonQuery();
        sqlConnObj.Close();
    }

    private List<SqlParameter> GenerateSQLParameters(object model)
    {
        var paramList = new List<SqlParameter>();
        Type modelType = model.GetType();
        var properties = modelType.GetProperties();
        foreach (var property in properties)
        {
            if (property.GetValue(model) == null)
            {
                paramList.Add(new SqlParameter(property.Name, DBNull.Value));
            }
            else
            {
                paramList.Add(new SqlParameter(property.Name, property.GetValue(model)));
            }
        }
        return paramList;

    }
using (SqlConnection sqlConnection1 = new SqlConnection("Your Connection String")) {
using (SqlCommand cmd = new SqlCommand()) {
  Int32 rowsAffected;

  cmd.CommandText = "StoredProcedureName";
  cmd.CommandType = CommandType.StoredProcedure;
  cmd.Connection = sqlConnection1;

  sqlConnection1.Open();

  rowsAffected = cmd.ExecuteNonQuery();

}}
 marc_s12 de ago de 2009 14:04
Seu procedimento armazenado não está retornando nada - use .ExecuteNonQuery () (como a resposta aqui diz) em vez de .ExecuteReader ()
 marc_s11 de ago de 2009 17:53
O "CommandText" deve ser definido para o nome do procedimento armazenado, que é então executado a partir de C # como se você tivesse executado "exec StoredProcedureName" no SSMS - ou o que você está preocupado?
 BlackTigerX12 de ago de 2009 18:53
e você pode querer salvar a sua auto digitação e erros potenciais, useusando em vez de tentar ... finalmente
 BlackTigerX11 de ago de 2009 20:43
assim, primeiro, você teria que criar o procedimento armazenado, no caso do código que você tem, você precisaria adicionar: "create procedure dbo.NameOfYourStoredProcedureHere as" no início
 Cute11 de ago de 2009 18:09
Como posso dar o nome do procedimento armazenado para o procedimento armazenado acima pode u plz me dizer?
 marc_s12 de ago de 2009 06:45
@Cute: se você tiver isso como um procedimento armazenado,DEVO tenha um nome! O nome usado na chamada "CREATE PROCEDURE (procedurename)". Se você não tem isso, então você não tem um procedimento armazenado (mas apenas um lote de instruções T-SQL) e, em seguida, você não pode usar o "CommandType = StoredProcedure", obviusly
 Cute11 de ago de 2009 17:23
Estou preocupado sobre como o cmd.CommandText = "Stored1" interpreta o meu procedimento armazenado. Eu não sei.
using (var conn = new SqlConnection(connectionString))
using (var command = new SqlCommand("ProcedureName", conn) { 
                           CommandType = CommandType.StoredProcedure }) {
   conn.Open();
   command.ExecuteNonQuery();
}
 stackoverfloweth22 de set de 2017 21:20
Deve ser marcado como resposta
 Muflix10 de jul de 2018 13:58
Por que énew SqlCommand usando constructo?
 SearchForKnowledge13 de mai de 2014 15:38
Poderei enviar a opção de valor DROPDOWN no ​​SP?
 Mehrdad Afshari20 de out de 2011 04:34
@Dani Sim. Basta adicionar os parâmetros aoParameters coleção doSqlCommand objeto.
 jackncoke24 de nov de 2014 16:15
Como você lida com um Single Quote sendo passado para o seu método?
 Remus Rusanu14 de set de 2011 18:53
Você pode até se livrar doconn.Close, está implícito peloDispose
 B N04 de jan de 2018 06:54
@ MehrdadAfshari: Eu preciso criar um aplicativo de console para enviar e-mails em alguma base. qualquer exemplo ou links úteis.
 Szybki22 de jun de 2017 12:49
@MikedeKlerk eu não acredito, porque enquantoDispose() pode ligarClose()chamandoClose() não significa que o objeto é descartado. Além disso, como é dito emSqlConnection.Close() resumo: "Este é o método preferido para fechar qualquer conexão aberta".
 Dani19 de out de 2011 15:22
Como você faria isso se o procedimento armazenado precisasse de parâmetros? basta adicionar os parâmetros ao objeto de comando com os mesmos nomes e tipos?
 Mike de Klerk02 de mai de 2016 11:51
@ MehrdadAfshari Aposto que o redundanteconn.Close(); chamada resultará em umCA2202: Do not dispose objects multiple times violação de código.
 Mehrdad Afshari14 de set de 2011 20:25
Isso é verdade para este caso. Eu gosto de ter correspondênciaOpen eClose chamadas. Se você disser, refatorar o objeto de conexão como um campo no futuro e remover a instrução using, você pode acidentalmente esquecer de adicionarClose e acabar com uma conexão aberta.

Chamando o procedimento de armazenamento em c #

cmd.CommandType=CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@value",txtValue.Text);
int rowAffected=cmd.ExecuteNonQuery();
using (SqlConnection conn = new SqlConnection("Server=(local);DataBase=Northwind;Integrated Security=SSPI")) {
    conn.Open();

    // 1.  create a command object identifying the stored procedure
    SqlCommand cmd  = new SqlCommand("CustOrderHist", conn);

    // 2. set the command object so it knows to execute a stored procedure
    cmd.CommandType = CommandType.StoredProcedure;

    // 3. add parameter to command, which will be passed to the stored procedure
    cmd.Parameters.Add(new SqlParameter("@CustomerID", custId));

    // execute the command
    using (SqlDataReader rdr = cmd.ExecuteReader()) {
        // iterate through results, printing each to console
        while (rdr.Read())
        {
            Console.WriteLine("Product: {0,-35} Total: {1,2}",rdr["ProductName"],rdr["Total"]);
        }
    }
}

http://www.csharp-station.com/Tutorials/AdoDotNet/Lesson07.aspxhttp://www.c-sharpcorner.com/UploadFile/dclark/InsOutsinCS11302005072332AM/InsOutsinCS.aspxhttp://www.codeproject.com/KB/cs/simplecodeasp.aspxhttp://msdn.microsoft.com/en-us/library/ms171921(VS.80).aspx
 TruMan114 de mar de 2012 04:46
Você deve realmente usar a palavra-chave "using". Empurre essa responsabilidade de abertura / fechamento para a estrutura.
 themefield12 de abr de 2019 18:58
Definição de SqlCommand:public sealed class SqlCommand : System.Data.Common.DbCommand, ICloneable, IDisposable. Coloque dentrousing declaração ajudará a limpeza.
SqlConnection conn = null;
SqlDataReader rdr  = null;
conn = new SqlConnection("Server=(local);DataBase=Northwind;Integrated Security=SSPI");
conn.Open();

// 1.  create a command object identifying
//     the stored procedure
SqlCommand cmd  = new SqlCommand("CustOrderHist", conn);

// 2. set the command object so it knows
//    to execute a stored procedure
cmd.CommandType = CommandType.StoredProcedure;

// 3. add parameter to command, which
//    will be passed to the stored procedure
cmd.Parameters.Add(new SqlParameter("@CustomerID", custId));

// execute the command
rdr = cmd.ExecuteReader();

// iterate through results, printing each to console
while (rdr.Read())
{
    Console.WriteLine("Product: {0,-35} Total: {1,2}", rdr["ProductName"], rdr["Total"]);
}

NãoDapper responda aqui. Então eu adicionei um

using Dapper;
using System.Data.SqlClient;

using (var cn = new SqlConnection(@"Server=(local);DataBase=master;Integrated Security=SSPI"))
    cn.Execute("dbo.test", commandType: CommandType.StoredProcedure);

sua execução em c #

CREATE PROCEDURE [dbo].[InsertPerson]   
-- Add the parameters for the stored procedure here  
@FirstName nvarchar(50),@LastName nvarchar(50),  
@PersonID int output  
AS  
BEGIN  
    insert [dbo].[Person](LastName,FirstName) Values(@LastName,@FirstName)  

    set @PersonID=SCOPE_IDENTITY()  
END  
Go  


--------------
 // Using stored procedure in adapter to insert new rows and update the identity value.  
   static void InsertPersonInAdapter(String connectionString, String firstName, String lastName) {  
      String commandText = "dbo.InsertPerson";  
      using (SqlConnection conn = new SqlConnection(connectionString)) {  
         SqlDataAdapter mySchool = new SqlDataAdapter("Select PersonID,FirstName,LastName from [dbo].[Person]", conn);  

         mySchool.InsertCommand = new SqlCommand(commandText, conn);  
         mySchool.InsertCommand.CommandType = CommandType.StoredProcedure;  

         mySchool.InsertCommand.Parameters.Add(  
             new SqlParameter("@FirstName", SqlDbType.NVarChar, 50, "FirstName"));  
         mySchool.InsertCommand.Parameters.Add(  
             new SqlParameter("@LastName", SqlDbType.NVarChar, 50, "LastName"));  

         SqlParameter personId = mySchool.InsertCommand.Parameters.Add(new SqlParameter("@PersonID", SqlDbType.Int, 0, "PersonID"));  
         personId.Direction = ParameterDirection.Output;  

         DataTable persons = new DataTable();  
         mySchool.Fill(persons);  

         DataRow newPerson = persons.NewRow();  
         newPerson["FirstName"] = firstName;  
         newPerson["LastName"] = lastName;  
         persons.Rows.Add(newPerson);  

         mySchool.Update(persons);  
         Console.WriteLine("Show all persons:");  
         ShowDataTable(persons, 14); 

o MSSQL não tem diferença. Os exemplos acima mostram bem como invocar isso. Apenas garantir

CommandType = CommandType.Text

Usando o Ado.net

using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace PBDataAccess
{
    public class AddContact
    {   
        // for preparing connection to sql server database   

        private SqlConnection conn; 

        // for preparing sql statement or stored procedure that 
        // we want to execute on database server

        private SqlCommand cmd; 

        // used for storing the result in datatable, basically 
        // dataset is collection of datatable

        private DataSet ds; 

        // datatable just for storing single table

        private DataTable dt; 

        // data adapter we use it to manage the flow of data
        // from sql server to dataset and after fill the data 
        // inside dataset using fill() method   

        private SqlDataAdapter da; 


        // created a method, which will return the dataset

        public DataSet GetAllContactType() 
        {



    // retrieving the connection string from web.config, which will 
    // tell where our database is located and on which database we want
    // to perform opearation, in this case we are working on stored 
    // procedure so you might have created it somewhere in your database. 
    // connection string will include the name of the datasource, your 
    // database name, user name and password.

        using (conn = new SqlConnection(ConfigurationManager.ConnectionString["conn"]
        .ConnectionString)) 

                {
                    // Addcontact is the name of the stored procedure
                    using (cmd = new SqlCommand("Addcontact", conn)) 

                    {
                        cmd.CommandType = CommandType.StoredProcedure;

                    // here we are passing the parameters that 
                    // Addcontact stored procedure expect.
                     cmd.Parameters.Add("@CommandType",
                     SqlDbType.VarChar, 50).Value = "GetAllContactType"; 

                        // here created the instance of SqlDataAdapter
                        // class and passed cmd object in it
                        da = new SqlDataAdapter(cmd); 

                        // created the dataset object
                        ds = new DataSet(); 

                        // fill the dataset and your result will be
                        stored in dataset
                        da.Fill(ds); 
                    }                    
            }  
            return ds;
        }
}

****** Stored Procedure ******

CREATE PROCEDURE Addcontact
@CommandType VARCHAR(MAX) = NULL
AS
BEGIN
  IF (@CommandType = 'GetAllContactType')
  BEGIN
    SELECT * FROM Contacts
  END
END
 Johnny03 de mai de 2017 21:12
ter adicionado o procedimento armazenado no código, confira.
 PeerNet03 de out de 2016 02:07
Suas linhas de comentário estão quebradas, também se você puder dar um procedimento armazenado em seu comentário que seria bom para nós.

https://www.nuget.org/packages/Crane/

SqlServerAccess sqlAccess = new SqlServerAccess("your connection string");
var result = sqlAccess.Command().ExecuteNonQuery("StoreProcedureName");

Também tem vários outros recursos que você pode gostar.

 Greg R Taylor27 de mar de 2018 04:28
Eu atualizei o exemplo, obrigado por me avisar.
 Maddy26 de mar de 2018 20:52
isso não funciona. Isso está desatualizado? Não consegui encontrar o método Procedimento.
 Hoang Minh01 de jun de 2019 01:39
Como você retorna vários conjuntos de dados com o Crane? Meu procedimento armazenado retorna 3 conjuntos de dados e estou interessado apenas no segundo conjunto de dados. Mas Crane só me devolve o primeiro.

yourAnswerToTheQuestion