Chame um procedimento armazenado com parâmetro em c #

Eu posso fazer uma exclusão, inserir e atualizar no meu programa e tento fazer uma inserção por chamar um procedimento armazenado criado do meu database.

Este botão insere-me bem.

private void btnAdd_Click(object sender, EventArgs e) { SqlConnection con = new SqlConnection(dc.Con); SqlCommand cmd = new SqlCommand("Command String", con); da.InsertCommand = new SqlCommand("INSERT INTO tblContacts VALUES (@FirstName, @LastName)", con); da.InsertCommand.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = txtFirstName.Text; da.InsertCommand.Parameters.Add("@LastName", SqlDbType.VarChar).Value = txtLastName.Text; con.Open(); da.InsertCommand.ExecuteNonQuery(); con.Close(); dt.Clear(); da.Fill(dt); } 

Este é o início do botão para chamar o procedimento chamado sp_Add_contact para adicionar um contato. Os dois parâmetros para sp_Add_contact(@FirstName,@LastName) . Eu procurei no google por algum bom exemplo, mas não achei nada interessante.

 private void button1_Click(object sender, EventArgs e) { SqlConnection con = new SqlConnection(dc.Con); SqlCommand cmd = new SqlCommand("Command String", con); cmd.CommandType = CommandType.StoredProcedure; ??? con.Open(); da. ???.ExecuteNonQuery(); con.Close(); dt.Clear(); da.Fill(dt); } 

É praticamente o mesmo que executar uma consulta. Em seu código original, você está criando um object de comando, colocando-o na variável cmd e nunca o usa. Aqui, no entanto, você usará isso em vez de da.InsertCommand .

Além disso, use um using para todos os objects descartáveis, para ter certeza de que eles estão descartados corretamente:

 private void button1_Click(object sender, EventArgs e) { using (SqlConnection con = new SqlConnection(dc.Con)) { using (SqlCommand cmd = new SqlCommand("sp_Add_contact", con)) { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add("@FirstName", SqlDbType.VarChar).Value = txtFirstName.Text; cmd.Parameters.Add("@LastName", SqlDbType.VarChar).Value = txtLastName.Text; con.Open(); cmd.ExecuteNonQuery(); } } } 

Você precisa adicionar parâmetros, pois é necessário que o SP seja executado

 using (SqlConnection con = new SqlConnection(dc.Con)) { using (SqlCommand cmd = new SqlCommand("SP_ADD", con)) { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@FirstName", txtfirstname); cmd.Parameters.AddWithValue("@LastName", txtlastname); con.Open(); cmd.ExecuteNonQuery(); } } 

cmd.Parameters.Add(String parameterName, Object value) está obsoleto agora. Em vez disso, use cmd.Parameters.AddWithValue(String parameterName, Object value)

Add (String parameterName, valor do object) foi reprovado. Use AddWithValue (String parameterName, valor do object)

Não há diferença em termos de funcionalidade. A razão pela qual eles descontinuaram o cmd.Parameters.Add(String parameterName, Object value) em favor de AddWithValue(String parameterName, Object value) é para dar mais clareza. Aqui está a referência do MSDN para o mesmo

 private void button1_Click(object sender, EventArgs e) { using (SqlConnection con = new SqlConnection(dc.Con)) { using (SqlCommand cmd = new SqlCommand("sp_Add_contact", con)) { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@FirstName", SqlDbType.VarChar).Value = txtFirstName.Text; cmd.Parameters.AddWithValue("@LastName", SqlDbType.VarChar).Value = txtLastName.Text; con.Open(); cmd.ExecuteNonQuery(); } } } 

Como alternativa, tenho uma biblioteca que facilita o trabalho com o procs: https://www.nuget.org/packages/SprocMapper/

 SqlServerAccess sqlAccess = new SqlServerAccess("your connection string"); sqlAccess.Procedure() .AddSqlParameter("@FirstName", SqlDbType.VarChar, txtFirstName.Text) .AddSqlParameter("@FirstName", SqlDbType.VarChar, txtLastName.Text) .ExecuteNonQuery("StoreProcedureName"); 

Adicionando os parâmetros separadamente me deu problemas, então eu fiz isso e funcionou muito bem:

  string SqlQ = string.Format("exec sp_Add_contact '{0}', '{1}'", txtFirstName.Text, txtLastName.Text); using (SqlConnection con = new SqlConnection(dc.Con)) { using (SqlCommand cmd = new SqlCommand("sp_Add_contact", con)) { con.Open(); cmd.ExecuteNonQuery(); } } 
 public void myfunction(){ try { sqlcon.Open(); SqlCommand cmd = new SqlCommand("sp_laba", sqlcon); cmd.CommandType = CommandType.StoredProcedure; cmd.ExecuteNonQuery(); } catch(Exception ex) { MessageBox.Show(ex.Message); } finally { sqlcon.Close(); } } 

O .NET Data Providers consiste em várias classs usadas para conectar-se a uma fonte de dados, executar comandos e retornar conjuntos de registros. O object de comando no ADO.NET fornece vários methods de execução que podem ser usados ​​para executar as consultas SQL em uma variedade de modas.

Um procedimento armazenado é um object executável pré-compilado que contém uma ou mais instruções SQL. Em muitos casos, os stored procedures aceitam parâmetros de input e retornam vários valores. Os valores de parâmetro podem ser fornecidos se um procedimento armazenado for gravado para aceitá-los. Um exemplo de procedimento armazenado com a aceitação do parâmetro de input é dado abaixo:

  CREATE PROCEDURE SPCOUNTRY @COUNTRY VARCHAR(20) AS SELECT PUB_NAME FROM publishers WHERE COUNTRY = @COUNTRY GO 

O procedimento armazenado acima está aceitando um nome de país (@COUNTRY VARCHAR (20)) como parâmetro e retorna todos os editores do país de input. Depois que o CommandType é definido como StoredProcedure, você pode usar a coleção Parameters para definir parâmetros.

  command.CommandType = CommandType.StoredProcedure; param = new SqlParameter("@COUNTRY", "Germany"); param.Direction = ParameterDirection.Input; param.DbType = DbType.String; command.Parameters.Add(param); 

O código acima passando parâmetro de país para o procedimento armazenado do aplicativo C #.

 using System; using System.Data; using System.Windows.Forms; using System.Data.SqlClient; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string connetionString = null; SqlConnection connection ; SqlDataAdapter adapter ; SqlCommand command = new SqlCommand(); SqlParameter param ; DataSet ds = new DataSet(); int i = 0; connetionString = "Data Source=servername;Initial Catalog=PUBS;User ID=sa;Password=yourpassword"; connection = new SqlConnection(connetionString); connection.Open(); command.Connection = connection; command.CommandType = CommandType.StoredProcedure; command.CommandText = "SPCOUNTRY"; param = new SqlParameter("@COUNTRY", "Germany"); param.Direction = ParameterDirection.Input; param.DbType = DbType.String; command.Parameters.Add(param); adapter = new SqlDataAdapter(command); adapter.Fill(ds); for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++) { MessageBox.Show (ds.Tables[0].Rows[i][0].ToString ()); } connection.Close(); } } }