सी # में पैरामीटर के साथ एक संग्रहीत प्रक्रिया को कॉल करें


138

मैं अपने प्रोग्राम में एक डिलीट, इंसर्ट और अपडेट कर सकता हूं और मैं अपने डेटाबेस से बनाई गई संग्रहित प्रक्रिया को कॉल करके इंसर्ट करने की कोशिश करता हूं।

यह एक बटन सम्मिलित करता है, मैं अच्छी तरह से काम करता हूं।

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

8
बस जानकारी का एक अतिरिक्त सा - आपको अपने आवेदन संग्रहीत प्रक्रियाओं को एक sp_ उपसर्ग के साथ नाम नहीं देना चाहिए, जैसे कि sp_Add_contact के साथ। sp_ उपसर्ग एक सिस्टम संग्रहित खरीद नामकरण सम्मेलन है, जब SQL इसे देखता है, किसी भी एप्लिकेशन या उपयोगकर्ता स्थान संग्रहीत प्रॉक्स से पहले सभी सिस्टम संग्रहीत प्रक्रियाओं के माध्यम से खोज करेगा। प्रदर्शन के परिणामस्वरूप, यदि आप अपने आवेदन में इस बारे में ध्यान रखते हैं, तो sp_ उपसर्ग आपके प्रतिक्रिया समय को कम कर देगा।
रॉबर्ट अचमन

जवाबों:


265

यह क्वेरी चलाने के समान है। अपने मूल कोड में आप एक कमांड ऑब्जेक्ट बना रहे हैं, इसे 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();
    }
  }
}

7
लेकिन अगर यह प्रक्रिया डेटा लौटाती है, तो मैं इसे C # में कैसे पकड़ सकता हूं?
MA9H

8
@ M009: तब आप इसका उपयोग करते हैं ExecuteReaderया ExecuteScalarइसे कॉल करते हैं।
गुफ़ा

2
@ M009: हाँ, वही काम करने का एक और तरीका है। डेटा एडेप्टर का उपयोग करता है ExecuteReader
गुफ़ा

1
@DylanChen: यह डेटाबेस सेटिंग्स पर निर्भर करता है। डिफ़ॉल्ट सेटिंग यह है कि पहचानकर्ता संवेदी नहीं होते हैं।
गुफ़ा

1
@DylanChen: यह डेटाबेस की कोलाज सेटिंग है जो यह निर्धारित करती है कि क्या पहचानकर्ता संवेदी हैं।
गुफ़ा

36

आपको मापदंडों को जोड़ना होगा क्योंकि एसपी को निष्पादित करने के लिए इसकी आवश्यकता है

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 एक बुरा विचार है; SQL सर्वर हमेशा nvarchar या varchar के लिए सही लंबाई का उपयोग नहीं करता है, जिससे एक अंतर्निहित रूपांतरण होता है। यह स्पष्ट रूप से पैरामीटर्स की लंबाई निर्दिष्ट करने के लिए बेहतर है, और फिर अलग से मूल्य का उपयोग करके जोड़ें parameter.Value = txtfirstname
जॉर्ज स्टॉकर

14

cmd.Parameters.Add(String parameterName, Object value)अब पदावनत कर दिया गया है। इसके बजाय उपयोग करेंcmd.Parameters.AddWithValue(String parameterName, Object value)

जोड़ें (स्ट्रिंग पैरामीटर नाम, ऑब्जेक्ट मान) को हटा दिया गया है। AddWithValue (स्ट्रिंग पैरामीटर नाम, ऑब्जेक्ट मान) का उपयोग करें

कार्यक्षमता के मामले में कोई अंतर नहीं है। जिस कारण के 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();
    }
  }
}

2
क्या आपके पास दावे के लिए एक लिंक या स्रोत है जो cmd.Parameters.Addपदावनत है?
डेविड

7
@TonyG: यह सच नहीं है, स्वीकार किए गए उत्तर पसंदीदा अधिभार का उपयोग करता है, Addजिसे भी पदावनत नहीं किया जाता है। AddWithValueयह सबसे अच्छा तरीका नहीं है क्योंकि यह पैरामिटर मान से पैरामीटर के प्रकार को संक्रमित करता है। यह अक्सर खराब निष्पादन योजनाओं या गलत रूपांतरणों की ओर जाता है। यह पहली बार में पैरामीटर को मान्य नहीं करता है (यदि Datetimeआप पास करते हैं, तो टाइप करें String) आप यहां देख सकते हैं कि केवल दूसरे तर्क के रूप में Addजो लिया जाता Objectहै, उसे हटा दिया जाता है।
टिम श्मेल्टर

2
AddWithValueके Addसाथ की तुलना में सिर्फ एक ही कार्यक्षमता है Object, लेकिन यह पसंदीदा तरीका नहीं है। दोनों को टाइप करने की जरूरत है।
टिम श्मेल्टर

2
आप बिलकुल सही कह रहे हैं, @TimSchmelter। मेरे पाठ को पढ़ना त्रुटिपूर्ण था। सुधारों के लिए धन्यवाद। मैं कुछ नया कोड लिख रहा हूँ जहाँ मैं Add () का उपयोग करूँगा। और मैं अपने उत्तर को इस उत्तर पर बदल दूंगा, जैसा कि मैं था, राहुल निकेत को गलत समझा गया।
टोनीजी

2
@TimSchmelter आपकी सलाह के लिए धन्यवाद। मैंने अपना उत्तर संपादित कर दिया है।
राहुल निकेत

3

एक विकल्प के रूप में, मेरे पास एक पुस्तकालय है जो प्रॉक्स के साथ काम करना आसान बनाता है: 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 डेटा प्रोवाइडर्स में डेटा स्रोत से जुड़ने, कमांड निष्पादित करने और रिकॉर्डसेट वापस करने के लिए उपयोग की जाने वाली कई कक्षाएं शामिल हैं। ADO.NET में कमांड ऑब्जेक्ट कई प्रकार के एक्स्यूट्यूट तरीके प्रदान करता है, जिनका उपयोग विभिन्न प्रकार के फैशन में 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();
        }
    }
}

आपका उत्तर उन ब्लॉकों का उपयोग नहीं करता है जो सबसे अच्छा अभ्यास है। इसके अलावा, किसी भी अपवाद से निपटने के लिए एक कोशिश पकड़ ब्लॉक होना चाहिए।
ट्रिस्टेड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.