c# - الحصول على قيمة معلمة الإخراج في ADO.NET



(6)

تظهر الاستجابة الأخرى هذا ، ولكن تحتاج فقط إلى إنشاء SqlParameter ، وتعيين Direction إلى Output ، وإضافته إلى مجموعة Parameters SqlCommand . ثم تنفيذ الإجراء المخزن والحصول على قيمة المعلمة.

باستخدام نموذج التعليمات البرمجية الخاص بك:

// 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 ، Parameters[].Value ، نظرًا لأن النوع يحتاج إلى أن يتم إرساله من object إلى ما تصرح به. و SqlDbType المستخدمة عند إنشاء SqlParameter يحتاج إلى تطابق النوع في قاعدة البيانات. إذا كنت ستقوم Parameters["@Param"].Value.ToString() فقط إلى وحدة التحكم ، فقد تستخدم فقط Parameters["@Param"].Value.ToString() (إما explictly أو ضمنيًا عبر استدعاء Console.Write() أو String.Format() ).

EDIT: أكثر من 3.5 سنوات و 20 ألف مشاهدة تقريبًا ، ولم يكلف أحدًا عناء الإشارة إلى أنه لم يتطابق حتى للسبب المحدد في تعليقي "كن حذراً" في المنشور الأصلي. لطيف. تم إصلاحه استنادًا إلى تعليقات جيدة منWalter Stabosz و @ Stephen Kennedy ولمطابقة تعديل رمز التحديث في السؤال منabatishchev.

https://src-bin.com

يحتوي الإجراء المخزن على معلمة إخراج:

@ID INT OUT

كيف استرد هذا باستخدام ado.net؟

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

Answer #1

لأي شخص يتطلع إلى القيام بشيء مماثل باستخدام قارئ مع الإجراء المخزن ، لاحظ أنه يجب إغلاق القارئ لاسترداد قيمة الإخراج.

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

Answer #2

يبدو ذلك أكثر وضوحًا بالنسبة لي:

كثافة العمليات؟ معرف = outputIdParam.Value هو DbNull؟ الافتراضي (int؟): outputIdParam.Value ،


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

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

Answer #5
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





ado.net