Appelez une procédure stockée avec le paramètre en c#

Je peux faire un delete, insert et update dans mon programme et j'essaie de faire un insert en appelant une procédure stockée créée à partir de ma base de données.

Ce bouton Insérer je fais bien fonctionner.

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);
    } 

C'est le début du bouton pour appeler la procédure nommée sp_Add_contact pour ajouter un contact. Les deux paramètres pour sp_Add_contact(@FirstName,@LastName). J'ai cherché sur google un bon exemple, mais je n'ai rien trouvé d'intéressant.

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);
    }
113
demandé sur marc_s 2011-09-25 03:07:09

7 réponses

C'est à peu près la même chose que d'exécuter une requête. Dans votre code d'origine, vous créez un objet command, le mettez dans la variable cmd et ne l'utilisez jamais. Ici, cependant, vous utiliserez cela au lieu de da.InsertCommand.

Aussi, utilisez un using pour tous les objets jetables, afin que vous soyez sûr qu'ils sont disposés correctement:

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();
    }
  }
}
213
répondu Guffa 2011-09-24 23:16:45

Vous devez ajouter des paramètres car il est nécessaire pour que le SP exécute

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();
    }            
}
30
répondu Ravi Gadag 2016-01-19 20:04:29

cmd.Parameters.Add(String parameterName, Object value) est obsolète maintenant. Utilisez plutôtcmd.Parameters.AddWithValue(String parameterName, Object value)

Add (chaîne parameterName, valeur de L'objet) a été obsolète. Utilisez AddWithValue(chaîne parameterName, valeur de L'objet)

Il n'y a pas de différence en termes de fonctionnalité. La raison pour laquelle ils désapprouvé les cmd.Parameters.Add(String parameterName, Object value) en faveur de AddWithValue(String parameterName, Object value) est de donner plus de clarté. Voici la référence MSDN pour le même

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();
    }
  }
}
7
répondu Rahul Nikate 2015-05-21 15:20:53

Comme alternative, j'ai une bibliothèque qui facilite le travail avec 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");
2
répondu Greg R Taylor 2017-04-27 12:59:58
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();
        }
}
0
répondu user6916720 2016-10-03 17:01:49

L'ajout des paramètres séparément m'a donné des problèmes, donc je l'ai fait et cela a très bien fonctionné:

 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();
 }
}
-1
répondu Rainhider 2015-06-16 17:18:11

Les fournisseurs de données. net se composent d'un certain nombre de classes utilisées pour se connecter à une source de données, exécuter des commandes et renvoyer des ensembles d'enregistrements. L'objet de commande dans ADO.NET fournit un certain nombre de méthodes D'exécution qui peuvent être utilisées pour effectuer les requêtes SQL dans une variété de modes.

Une procédure stockée est un objet exécutable pré-compilé qui contient une ou plusieurs instructions SQL. Dans de nombreux cas, les procédures stockées acceptent les paramètres d'entrée et renvoient plusieurs valeurs . Les valeurs de paramètre peuvent être fourni si une procédure stockée est écrite pour les accepter. Un exemple de procédure stockée avec un paramètre d'entrée accepté est donné ci-dessous:

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

La procédure stockée ci-dessus accepte un nom de pays (@COUNTRY VARCHAR(20)) comme paramètre et renvoie tous les éditeurs du pays d'entrée. Une fois que CommandType est défini sur StoredProcedure, vous pouvez utiliser la collection Parameters pour définir des paramètres.

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

Le code ci-dessus passant le paramètre country à la procédure stockée à partir de C# application.

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();
        }
    }
}
-1
répondu Sudhakar Rao 2017-02-21 00:56:27