ADO.NET এ আউটপুট প্যারামিটার মান পান


96

আমার সঞ্চিত পদ্ধতিতে একটি আউটপুট প্যারামিটার রয়েছে:

@ID INT OUT

আমি কীভাবে অ্যাডো নেট ব্যবহার করে এটি পুনরুদ্ধার করতে পারি?

using (SqlConnection conn = new SqlConnection(...))
{
    SqlCommand cmd = new SqlCommand("sproc", conn);
    cmd.CommandType = CommandType.StoredProcedure;

    // add parameters

    conn.Open();

    // *** read output parameter here, how?
    conn.Close();
}

উত্তর:


120

অন্যান্য প্রতিক্রিয়া শো এই, কিন্তু মূলত আপনি শুধুমাত্র একটি তৈরি করতে হবে SqlParameter, সেট Directionকরতে Output, এবং এটি যোগ SqlCommand'র Parametersসংগ্রহ। তারপরে সঞ্চিত পদ্ধতিটি কার্যকর করুন এবং প্যারামিটারটির মান পাবেন।

আপনার কোড নমুনা ব্যবহার:

// SqlConnection and SqlCommand are IDisposable, so stack a couple using()'s
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand("sproc", conn))
{
   // Create parameter with Direction as Output (and correct name and type)
   SqlParameter outputIdParam = new SqlParameter("@ID", SqlDbType.Int)
   { 
      Direction = ParameterDirection.Output 
   };

   cmd.CommandType = CommandType.StoredProcedure;
   cmd.Parameters.Add(outputIdParam);

   conn.Open();
   cmd.ExecuteNonQuery();

   // Some various ways to grab the output depending on how you would like to
   // handle a null value returned from the query (shown in comment for each).

   // Note: You can use either the SqlParameter variable declared
   // above or access it through the Parameters collection by name:
   //   outputIdParam.Value == cmd.Parameters["@ID"].Value

   // Throws FormatException
   int idFromString = int.Parse(outputIdParam.Value.ToString());

   // Throws InvalidCastException
   int idFromCast = (int)outputIdParam.Value; 

   // idAsNullableInt remains null
   int? idAsNullableInt = outputIdParam.Value as int?; 

   // idOrDefaultValue is 0 (or any other value specified to the ?? operator)
   int idOrDefaultValue = outputIdParam.Value as int? ?? default(int); 

   conn.Close();
}

পাওয়ার সময় সতর্কতা অবলম্বন করুন Parameters[].Value, যেহেতু টাইপটি objectআপনি যেটি হিসাবে ঘোষণা করছেন তা থেকে ফেলে দেওয়া দরকার। এবং SqlDbTypeযখন আপনি প্রয়োজনীয়তা তৈরি করবেন SqlParameterতখন ডাটাবেজে টাইপের সাথে মিল রাখতে হবে। আপনি যদি এটি কনসোলে কেবল আউটপুট করতে চলেছেন তবে আপনি কেবল ব্যবহার করছেন Parameters["@Param"].Value.ToString()(হয় স্পষ্ট করে বা স্পষ্টভাবে একটি Console.Write()বা String.Format()কলের মাধ্যমে )।

সম্পাদনা: 3.5 বছরেরও বেশি সময় এবং প্রায় 20k দর্শন এবং কেউই এটি উল্লেখ করতে বিরক্ত করেনি যে এটি মূল পোস্টে আমার "সাবধানতা অবলম্বন করুন" মন্তব্যে উল্লিখিত কারণে সংকলন করে নি। ভাল লাগল @ ওয়াল্টার স্টাবোস এবং @ স্টিফেন কেনেডি থেকে নেওয়া ভাল মন্তব্যের ভিত্তিতে এবং @abatishchev থেকে প্রশ্নের আপডেট কোড সম্পাদনের সাথে মিল রেখে এটি ঠিক করা হয়েছে।


8
আপনার conn.Close()কোনও usingব্লকের ভিতরে এটির দরকার নেই
মার্কাস

4
আমি মনে করি আকারের সম্পত্তি হিসাবে আপনার int.MaxValue এর ব্যবহার ভুল। int.MaxValue 2,147,483,647 মান সহ ধ্রুবক। এমএসডিএন.মাইক্রোসফট.এইন- ইউএস / লাইবারি / । এই উদাহরণটিতে ভুলটি নিখুঁত কারণ ডেটাটাইপটি ইনট এবং "নির্দিষ্ট দৈর্ঘ্যের ডেটা ধরণের জন্য, আকারের মান উপেক্ষা করা হয়" ", তবে একটি শূন্য যথেষ্ট হয়েছে।
ওয়াল্টার স্টাবোস

.ভ্যালু হ'ল টাইপ অবজেক্ট, সুতরাং castালাই ছাড়াই এটি সরাসরি কোনও ইনটকে অর্পণ করা কাজ করে না।
স্টিফেন কেনেডি

4
যাঁরা একটি ডেটা রিডার ব্যবহার করছেন, তাদের আউটপুট প্যারামিটারগুলি দেখার আগে আপনাকে অবশ্যই এটি বন্ধ বা ডেটার শেষে পড়তে হবে।
গ্যারি ইংলিশ

56

সঞ্চিত পদ্ধতিতে যে কোনও পাঠককে ব্যবহার করে অনুরূপ কিছু করতে চাইছেন তাদের জন্য নোট করুন যে আউটপুট মানটি পুনরুদ্ধার করতে পাঠককে অবশ্যই বন্ধ রাখতে হবে।

using (SqlConnection conn = new SqlConnection())
{
    SqlCommand cmd = new SqlCommand("sproc", conn);
    cmd.CommandType = CommandType.StoredProcedure;

    // add parameters
    SqlParameter outputParam = cmd.Parameters.Add("@ID", SqlDbType.Int);
    outputParam.Direction = ParameterDirection.Output;

    conn.Open();

    using(IDataReader reader = cmd.ExecuteReader())
    {
        while(reader.Read())
        {
            //read in data
        }
    }
    // reader is closed/disposed after exiting the using statement
    int id = outputParam.Value;
}

4
আউটপুট প্যারামিটারটি পড়ার আগে পাঠককে অবশ্যই বন্ধ করা উচিত তা আমি মিস করেছি। যে ইশারা জন্য ধন্যবাদ!
নিক্লাস মোলার জেপসেন

28

আমার কোড নয়, তবে আমি মনে করি একটি ভাল উদাহরণ

উত্স: http://www.eggheadcafe.com / মুদ্রণ অনুসন্ধানকন্টেন্ট.এএসপি?

using System; 
using System.Data; 
using System.Data.SqlClient; 


class OutputParams 
{ 
    [STAThread] 
    static void Main(string[] args) 
    { 

    using( SqlConnection cn = new SqlConnection("server=(local);Database=Northwind;user id=sa;password=;")) 
    { 
        SqlCommand cmd = new SqlCommand("CustOrderOne", cn); 
        cmd.CommandType=CommandType.StoredProcedure ; 

        SqlParameter parm= new SqlParameter("@CustomerID",SqlDbType.NChar) ; 
        parm.Value="ALFKI"; 
        parm.Direction =ParameterDirection.Input ; 
        cmd.Parameters.Add(parm); 

        SqlParameter parm2= new SqlParameter("@ProductName",SqlDbType.VarChar); 
        parm2.Size=50; 
        parm2.Direction=ParameterDirection.Output; 
        cmd.Parameters.Add(parm2); 

        SqlParameter parm3=new SqlParameter("@Quantity",SqlDbType.Int); 
        parm3.Direction=ParameterDirection.Output; 
        cmd.Parameters.Add(parm3);

        cn.Open(); 
        cmd.ExecuteNonQuery(); 
        cn.Close(); 

        Console.WriteLine(cmd.Parameters["@ProductName"].Value); 
        Console.WriteLine(cmd.Parameters["@Quantity"].Value.ToString());
        Console.ReadLine(); 
    } 
} 

4
হ্যাঁ, এটি সঠিক। মাত্র প্যারামিটারের প্যারামিটার দিকনির্দেশ বৈশিষ্ট্য সেট করুন। আপনার cn. ক্লোজ () লাইন লাগবে না - -} ব্লকটি ব্যবহার করে এটি যত্ন নেয়।
মুসিজেনেসিস

6
string ConnectionString = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
using (SqlConnection con = new SqlConnection(ConnectionString))
{
//Create the SqlCommand object
SqlCommand cmd = new SqlCommand(“spAddEmployee”, con);

//Specify that the SqlCommand is a stored procedure
cmd.CommandType = System.Data.CommandType.StoredProcedure;

//Add the input parameters to the command object
cmd.Parameters.AddWithValue(“@Name”, txtEmployeeName.Text);
cmd.Parameters.AddWithValue(“@Gender”, ddlGender.SelectedValue);
cmd.Parameters.AddWithValue(“@Salary”, txtSalary.Text);

//Add the output parameter to the command object
SqlParameter outPutParameter = new SqlParameter();
outPutParameter.ParameterName = “@EmployeeId”;
outPutParameter.SqlDbType = System.Data.SqlDbType.Int;
outPutParameter.Direction = System.Data.ParameterDirection.Output;
cmd.Parameters.Add(outPutParameter);

//Open the connection and execute the query
con.Open();
cmd.ExecuteNonQuery();

//Retrieve the value of the output parameter
string EmployeeId = outPutParameter.Value.ToString();
}

ফন্ট http://www.codeproject.com/Articles/748619/ADO-NET-How-to-call-a-stored-procedure-with-output


6
public static class SqlParameterExtensions
{
    public static T GetValueOrDefault<T>(this SqlParameter sqlParameter)
    {
        if (sqlParameter.Value == DBNull.Value 
            || sqlParameter.Value == null)
        {
            if (typeof(T).IsValueType)
                return (T)Activator.CreateInstance(typeof(T));

            return (default(T));
        }

        return (T)sqlParameter.Value;
    }
}


// Usage
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand("storedProcedure", conn))
{
   SqlParameter outputIdParam = new SqlParameter("@ID", SqlDbType.Int)
   { 
      Direction = ParameterDirection.Output 
   };

   cmd.CommandType = CommandType.StoredProcedure;
   cmd.Parameters.Add(outputIdParam);

   conn.Open();
   cmd.ExecuteNonQuery();

   int result = outputIdParam.GetValueOrDefault<int>();
}

3

আপনি নীচে কোড দ্বারা আপনার ফলাফল পেতে পারেন ::

using (SqlConnection conn = new SqlConnection(...))
{
    SqlCommand cmd = new SqlCommand("sproc", conn);
    cmd.CommandType = CommandType.StoredProcedure;

    // add other parameters parameters

    //Add the output parameter to the command object
    SqlParameter outPutParameter = new SqlParameter();
    outPutParameter.ParameterName = "@Id";
    outPutParameter.SqlDbType = System.Data.SqlDbType.Int;
    outPutParameter.Direction = System.Data.ParameterDirection.Output;
    cmd.Parameters.Add(outPutParameter);

    conn.Open();
    cmd.ExecuteNonQuery();

    //Retrieve the value of the output parameter
    string Id = outPutParameter.Value.ToString();

    // *** read output parameter here, how?
    conn.Close();
}

2

স্কেলপ্রামঅবজেক্ট তৈরি করুন যা আপনাকে প্যারামিটারগুলিতে অ্যাক্সেসের পদ্ধতিতে নিয়ন্ত্রণ দেয়

:

স্কেলপ্যারামিটার প্যারাম = নতুন স্কেলপ্যারামিটার ();

আপনার প্যারামিটারের জন্য নামটি সেট করুন (এটি আপনার ডাটাবেসে মান ধরে রাখতে ভেরিয়েবল হিসাবে ঘোষণা করার মতো হবে)

: param.ParameterName = "@yourParamterName";

আপনাকে আউটপুট ডেটা ধরে রাখতে মান ধারক সাফ করুন

: param.Value = 0;

আপনার পছন্দের দিক নির্ধারণ করুন (আপনার ক্ষেত্রে এটি আউটপুট হওয়া উচিত)

: param.Direction = System.Data.ParameterDirection.Output;


1

এটি আমার কাছে আরও সুস্পষ্ট দেখাচ্ছে:

ইন্ট? আইডি = আউটপুটআইডপ্যারাম। মূল্য DbNull হয়? ডিফল্ট (int?): আউটপুটইডপার্ম.ভ্যালু;

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.