Вызов хранимой процедуры с параметром в C # - PullRequest
128 голосов
/ 25 сентября 2011

Я могу выполнить удаление, вставку и обновление в моей программе, и я пытаюсь выполнить вставку, вызвав созданную хранимую процедуру из моей базы данных.

Эту кнопку вставляю я хорошо работаю.

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

Это начало кнопки для вызова процедуры с именем sp_Add_contact для добавления контакта. Два параметра для sp_Add_contact(@FirstName,@LastName). Я искал в Google хороший пример, но ничего интересного не нашел.

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

Ответы [ 7 ]

243 голосов
/ 25 сентября 2011

Это почти то же самое, что и выполнение запроса.В исходном коде вы создаете объект команды, помещаете его в переменную cmd и никогда не используете его.Здесь, однако, вы будете использовать это вместо da.InsertCommand.

Кроме того, используйте using для всех одноразовых предметов, чтобы вы были уверены, что они расположены правильно:

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();
    }
  }
}
31 голосов
/ 25 сентября 2011

Вы должны добавить параметры, так как это необходимо для выполнения SP

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();
    }            
}
10 голосов
/ 10 апреля 2015

cmd.Parameters.Add(String parameterName, Object value) устарела. Вместо этого используйте cmd.Parameters.AddWithValue(String parameterName, Object value)

Добавить (String имя_параметра, значение объекта) устарело. Использовать AddWithValue (String имя_параметра, значение объекта)

Нет никакой разницы в функциональности. Причина, по которой они устарел cmd.Parameters.Add(String parameterName, Object value) в пользу AddWithValue(String parameterName, Object value), чтобы дать больше ясность. Вот ссылка на MSDN для того же

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();
    }
  }
}
3 голосов
/ 20 февраля 2017

В качестве альтернативы у меня есть библиотека, которая облегчает работу с процессами: 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");
0 голосов
/ 21 февраля 2017

Поставщики данных .NET состоят из ряда классов, используемых для подключения к источнику данных, выполнения команд и возврата наборов записей.Объект Command в ADO.NET предоставляет ряд методов Execute, которые можно использовать для выполнения запросов SQL в различных модах.

Хранимая процедура - это предварительно скомпилированный исполняемый объект, который содержит один или несколько SQLзаявления.Во многих случаях хранимые процедуры принимают входные параметры и возвращают несколько значений.Значения параметров могут быть предоставлены, если для их принятия написана хранимая процедура.Пример хранимой процедуры с принятием входного параметра приведен ниже:

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

Вышеуказанная хранимая процедура принимает название страны (@COUNTRY VARCHAR (20)) в качестве параметра и возвращает всех издателей из страны ввода.Как только для CommandType установлено StoredProcedure, вы можете использовать коллекцию Parameters для определения параметров.

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

Приведенный выше код передает параметр страны в хранимую процедуру из приложения 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();
        }
    }
}
0 голосов
/ 03 октября 2016
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 голосов
/ 16 июня 2015

Добавление параметров по отдельности вызвало у меня проблемы, поэтому я сделал это, и он отлично работал:

 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();
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...