সি # তে প্যারামিটার সহ একটি সঞ্চিত পদ্ধতিতে কল করুন


138

আমি আমার প্রোগ্রামটিতে মুছতে, সন্নিবেশ করতে এবং আপডেট করতে পারি এবং আমি আমার ডাটাবেস থেকে একটি সঞ্চিত প্রক্রিয়া কল করে একটি সন্নিবেশ করার চেষ্টা করি।

এটি একটি বোতাম sertোকানো আমি কাজটি ভাল করি।

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)। আমি কিছু ভাল উদাহরণের জন্য গুগলে অনুসন্ধান করেছি কিন্তু আকর্ষণীয় কিছুই পাই নি।

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_ উপসর্গ হ'ল একটি সিস্টেম সংরক্ষিত প্রক নামকরণের কনভেনশন, যা এসকিউএল এটি দেখলে, কোনও অ্যাপ্লিকেশন বা ব্যবহারকারীর স্থান সংরক্ষিত প্রকোজের আগে প্রথমে সমস্ত সিস্টেমের সঞ্চিত পদ্ধতি অনুসন্ধান করবে। পারফরম্যান্সের বিষয় হিসাবে, আপনি যদি আপনার অ্যাপ্লিকেশনটিতে এটি সম্পর্কে যত্নশীল হন তবে 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
তবে যদি এই পদ্ধতিটি ডেটা ফেরায়, আমি কীভাবে এটি সি # তে ধরতে পারি?
এমএ

8
@ এম009: তারপরে আপনি এটি ব্যবহার করতে ExecuteReaderবা ExecuteScalarকল করতে পারেন ।
গুফা

2
@ এম009: হ্যাঁ, একই জিনিসটি করার আরেকটি উপায়। ডেটা অ্যাডাপ্টার ব্যবহার করে ExecuteReader
গুফা 21

1
@ ডিলানচেন: এটি ডাটাবেস সেটিংসের উপর নির্ভর করে। ডিফল্ট সেটিংটি হ'ল সনাক্তকারীরা কেস সেনসেটিভ হয় না।
গুফা

1
@ ডিলানচেন: এটি ডাটাবেসের কোলেশন সেটিংস যা নির্ধারণ করে যে সনাক্তকারীরা কেস সেনসেটিভ কিনা।
গুফা

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
অ্যাডউইথওয়ালিউ একটি খারাপ ধারণা; এসকিউএল সার্ভার সর্বদা এনভারচার বা ভারচারের জন্য সঠিক দৈর্ঘ্যটি ব্যবহার করে না, ফলে অন্তর্নিহিত রূপান্তর ঘটে। প্যারামিটারের দৈর্ঘ্য স্পষ্টভাবে নির্দিষ্ট করা আরও ভাল, এবং তারপরে পৃথক করে মানটি যুক্ত করে যুক্ত করুন parameter.Value = txtfirstname
জর্জ স্টকার

14

cmd.Parameters.Add(String parameterName, Object value)এখন অবচয় করা হয়েছে। পরিবর্তে ব্যবহারcmd.Parameters.AddWithValue(String parameterName, Object value)

অ্যাড (স্ট্রিং প্যারামিটারনাম, অবজেক্টের মান) হ্রাস করা হয়েছে। অ্যাডউইথওয়ালিউ (স্ট্রিং প্যারামিটারনাম, অবজেক্ট ভ্যালু) ব্যবহার করুন

কার্যকারিতার দিক দিয়ে কোনও পার্থক্য নেই। তারা যে কারণে cmd.Parameters.Add(String parameterName, Object value)পক্ষে অবমূল্যায়ন করেছে তা AddWithValue(String parameterName, Object value)হল আরও স্পষ্টতা দেওয়া। এখানে তার জন্য এমএসডিএন রেফারেন্স

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
@ টনিজি: এটি সত্য নয়, গৃহীত উত্তরটি পছন্দসই ওভারলোড ব্যবহার করে Addযার মধ্যে অবমূল্যায়নও হয় না। AddWithValueএটি প্যারামিটারের মান থেকে প্যারামিটারের ধরণকে হ্রাস করার পরেও সর্বোত্তম উপায় নয়। এটি প্রায়শই খারাপ সম্পাদন পরিকল্পনা বা ভুল রূপান্তর বাড়ে। এটি প্রথম স্থানে প্যারামিটারটি বৈধতা দেয় না (ফে টাইপ করে Datetimeতবে আপনি পাস করলে String)। আপনি এখানে দেখতে পাচ্ছেন যে কেবল দ্বিতীয় আর্গুমেন্ট হিসাবে এটি Addগ্রহণ করা Objectহয় তা হ্রাস করা হয়।
টিম শেমলেটার

2
AddWithValueচেয়ে ঠিক একই কার্যকারিতা থাকে Addসঙ্গে Object, কিন্তু এটা পছন্দের পথ নয়। উভয় টাইপ অনুমান করা প্রয়োজন।
টিম শেমলেটার

2
আপনি একেবারে ঠিক, @ টিমস্মেলটার। আমার পাঠ্যটি ত্রুটিযুক্ত ছিল। সংশোধনীর জন্য ধন্যবাদ. আমি কিছু নতুন কোড লিখছি যেখানে আমি অ্যাড () ব্যবহার করব। এবং আমি এই উত্তরটিতে আমার উপন্যাসকে একটি ডাউনটাতে পরিবর্তন করব, যেমন রাহুল নিকতে আমার মতো ভুল হয়েছিল।
টনিজি

2
@ টিমশ্মেলটার আপনার পরামর্শের জন্য আপনাকে ধন্যবাদ। আমি আমার উত্তর সম্পাদনা করেছি।
রাহুল নিকতে

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 এর কমান্ড অবজেক্টটি বেশ কয়েকটি এক্সিকিউট পদ্ধতি প্রদান করে যা বিভিন্ন ফ্যাশনে এসকিউএল কোয়েরিগুলি সম্পাদন করতে ব্যবহার করা যেতে পারে।

সঞ্চিত পদ্ধতি হ'ল একটি প্রাক-সংকলিত এক্সিকিউটেবল অবজেক্ট যা এক বা একাধিক এসকিউএল স্টেটমেন্ট ধারণ করে। অনেক ক্ষেত্রে সঞ্চিত পদ্ধতিগুলি ইনপুট পরামিতিগুলি গ্রহণ করে এবং একাধিক মান প্রদান করে। প্যারামিটারের মানগুলি সরবরাহ করতে পারে যদি সেগুলি গ্রহণ করার জন্য কোনও সঞ্চিত পদ্ধতি লেখা থাকে। ইনপুট প্যারামিটার গ্রহণের সাথে একটি নমুনা সঞ্চিত পদ্ধতি নীচে দেওয়া হয়েছে:

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

উপরের সঞ্চিত পদ্ধতিটি কোনও দেশের নাম (@COUNTRY VARCHAR (20%) কে প্যারামিটার হিসাবে স্বীকার করছে এবং ইনপুট দেশ থেকে সমস্ত প্রকাশককে ফিরিয়ে দেবে। কমান্ডটাইপটি স্টোরডপ্রসেসর সেট হয়ে গেলে আপনি পরামিতিগুলি সংজ্ঞায়িত করতে প্যারামিটার সংগ্রহটি ব্যবহার করতে পারেন।

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

উপরের কোডটি সি # অ্যাপ্লিকেশন থেকে সঞ্চিত পদ্ধতিতে দেশ প্যারামিটারটি পাস করছে।

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

আপনার উত্তর ব্লক ব্যবহার করে না যা সেরা অভ্যাস। এছাড়াও, যে কোনও ব্যতিক্রমগুলি মোকাবেলা করার জন্য ট্রাই ক্যাচ ব্লক থাকা উচিত।
16:42
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.