Saklı yordam c # parametresiyle çağırın


138

Programımda silme, ekleme ve güncelleme yapabilirim ve veritabanımda oluşturulan saklı yordamı arayarak bir ekleme yapmaya çalışıyorum.

Bu bir düğme eklemek iyi çalışır.

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

Bu, sp_Add_contactkişi eklemek için adlandırılmış prosedürü çağırmak için düğmenin başlangıcıdır . İçin iki parametre sp_Add_contact(@FirstName,@LastName). Google'da iyi bir örnek aradım ama ilginç bir şey bulamadım.

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

8
Ek bilgi biraz - uygulama saklı yordamlar, sp_Add_contact ile yukarıdaki gibi bir sp_ önekiyle adlandırmamalısınız. sp_ öneki, SQL bunu gördüğünde, herhangi bir uygulamadan veya kullanıcı alanından saklanan işlemlerden önce tüm sistem saklı yordamlarını arayacak bir sistemde saklanan proc adlandırma kuralıdır. Performans olarak, uygulamanızda bunu önemsiyorsanız, sp_ öneki yanıt sürelerinizi azaltacaktır.
Robert Achmann

Yanıtlar:


265

Bir sorguyu çalıştırmakla hemen hemen aynı. Orijinal kodunuzda, bir cmddeğişken içine koyarak bir komut nesnesi oluşturursunuz ve bunu asla kullanmazsınız. Ancak burada bunun yerine bunu kullanacaksınız da.InsertCommand.

Ayrıca, usingtüm tek kullanımlık nesneler için a kullanın , böylece bunların doğru şekilde atıldığından emin olun:

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

7
ancak bu yordam veri döndürürse, nasıl C # yakalayabilirim?
MA9H

8
@ M009: Sonra aramak için ExecuteReaderveya tuşunu kullanın ExecuteScalar.
Guffa

2
@ M009: Evet, aynı şeyi yapmanın başka bir yolu. Veri bağdaştırıcısı kullanır ExecuteReader.
Guffa

1
@DylanChen: Bu veritabanı ayarlarına bağlıdır. Varsayılan ayar, tanımlayıcıların büyük / küçük harfe duyarlı olmamasıdır.
Guffa

1
@DylanChen: Tanımlayıcıların büyük / küçük harf duyarlı olup olmadığını belirleyen veritabanının harmanlama ayarıdır.
Guffa

36

SP'nin yürütülmesi gerektiğinden parametre eklemeniz gerekir

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

7
AddWithValue kötü bir fikirdir; SQL Server, nvarchar veya varchar için her zaman doğru uzunluğu kullanmaz ve dolaylı bir dönüştürme gerçekleşmesine neden olur. Parametrenin uzunluğunu açıkça belirtmek ve ardından değeri ayrı ayrı eklemek daha iyidir parameter.Value = txtfirstname.
George Stocker

14

cmd.Parameters.Add(String parameterName, Object value)şu anda kullanımdan kaldırıldı. Bunun yerine kullanıncmd.Parameters.AddWithValue(String parameterName, Object value)

Ekle (String parametreAdı, Nesne değeri) kullanımdan kaldırıldı. AddWithValue (String parametreAdı, Nesne değeri) kullanın

İşlevsellik açısından fark yoktur. Onların cmd.Parameters.Add(String parameterName, Object value)lehine itiraz etmelerinin nedeni AddWithValue(String parameterName, Object value)daha fazla açıklık vermektir. İşte aynı için MSDN referansı

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

2
cmd.Parameters.AddOnaylanmayan hak talebiyle ilgili bir bağlantınız veya kaynağınız var mı?
David

7
@TonyG: bu doğru değil, kabul edilen cevap tercih edilen aşırı yükü Addde kullanılmıyor. AddWithValueparametrenin tipini parametre parametresinden aldığı için de en iyi yol değildir. Bu genellikle kötü yürütme planlarına veya yanlış dönüşümlere yol açar. Ayrıca parametreyi ilk etapta doğrulamaz (fe tipi, Datetimeancak a geçerseniz String). Görebilirsiniz burada sadece Addbir aldığı Objectikinci argüman olarak kullanımdan kaldırıldı.
Tim Schmelter

2
AddWithValuedaha sadece aynı işlevselliğe sahiptir Addile Object, ancak tercih edilen yöntem değildir. Her ikisinin de türünü çıkarması gerekir.
Tim Schmelter

2
Kesinlikle haklısın, @TimSchmelter. Metni okumam kusurluydu. Düzeltme için teşekkürler. Add () kullanacağım bazı yeni kodlar yazıyorum. Rahul Nikate benim kadar yanıldığından, bu cevaptaki benim oyumu bir aşağı oyla değiştireceğim.
TonyG

2
@TimSchmelter Tavsiyeniz için teşekkür ederiz. Cevabımı düzenledim.
Rahul Nikate

3

Alternatif olarak, procs ile çalışmayı kolaylaştıran bir kütüphanem var: 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("StoredProcedureName");

0
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

.NET Veri Sağlayıcıları, bir veri kaynağına bağlanmak, komutları yürütmek ve kayıt kümelerini döndürmek için kullanılan bir dizi sınıftan oluşur. ADO.NET'teki Komut Nesnesi, çeşitli sorgularda SQL sorgularını gerçekleştirmek için kullanılabilecek bir dizi Yürütme yöntemi sağlar.

Saklı yordam, bir veya daha fazla SQL ifadesi içeren önceden derlenmiş yürütülebilir bir nesnedir. Birçok durumda saklı yordamlar giriş parametrelerini kabul eder ve birden çok değer döndürür. Parametre değerleri, bunları kabul etmek için saklı bir yordam yazılırsa sağlanabilir. Giriş parametresini kabul eden örnek saklı bir prosedür aşağıda verilmiştir:

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

Yukarıdaki saklı yordam parametre olarak bir ülke adını (@COUNTRY VARCHAR (20)) kabul ediyor ve girdi ülkesinden tüm yayıncıları iade ediyor. CommandType StoredProcedure olarak ayarlandıktan sonra, parametreleri tanımlamak için Parametreler koleksiyonunu kullanabilirsiniz.

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

Yukarıdaki kod ülke parametresini C # uygulamasından saklı yordama geçiriyor.

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

Cevabınız en iyi uygulama olan blokları kullanmıyor . Ayrıca, herhangi bir istisna ile başa çıkmak için bir try catch bloğu olmalıdır.
Trisped
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.