اذهب إلى المحتوى

السؤال

نشر (معدل)

احاول ارسال قيم الى StoredProcedure

من خلال :

listbox يحتوي اسماء الدول احصل عليهم من قاعدة البيانات 

المشكله لو قمت باختيار واحد حتى اقوم بارساله الكود يعمل بشكل سليم 100%100

ولكن لو قمت بوضع اختيارين او 3 اختيارات على سبيل المثال  احصل على الخطاء التالي:

 

Parameter '@stIdCity' was supplied multiple times.

وموقع الخطاء يشير الى :

Line 298:                    da.Fill(ds);

الكود كامل كالتالي:

  protected void lstBoxTestCity_SelectedIndexChanged(object sender, EventArgs e)
        {

            string str = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            using (SqlConnection con = new SqlConnection(str))
            {
                using (SqlCommand cmd = new SqlCommand("Tprocedure", con))
                {
                    cmd.CommandType = CommandType.StoredProcedure;


                    foreach (ListItem item in lstBoxTestCity.Items)
                    {
      
                        if (item.Selected)
                        {
                          
                        
                            cmd.Parameters.AddWithValue("@stIdCity", item.Value);
                      
                        }
                    }
                    
                    SqlDataAdapter da = new SqlDataAdapter(cmd);
                    DataSet ds = new DataSet();
                    da.Fill(ds);
                    gvProducts.DataSource = ds;
                    gvProducts.DataBind();
                    
                }
            }
           
        }

 

والقائمة كالتالي التي يختار منها المستخدم:

61b65d3b18d45_Screenshot2021-12-13003532.png.7af41ed2c5481cf7a85b5fabcbabb05f.png

 

كيف يمكن تجنب هذا المشكله وحل هذا الامر ياليت لو كان احد مر بنفس التجربه يفيدنا لو تكرمتو

تم التعديل في بواسطة Wael Aljamal
توضيح السؤال

Recommended Posts

  • 1
نشر

هذه الدالة تقبل معامل واحد مع قيمته، ولكي تستطع حل المشكلة، عليك تمرير غرض برمجي

var p = cmd.CreateParameter();
p.Name = "wael";
p.age  = 24;
cmd.Parameters.Add(p);

لحل المشكلة بشكل أفضل، نمرر مصفوفة بأسماء المدن.

var parameters = new string[100]; // أقصى عدد ممكن
var index = 0;

foreach (ListItem item in lstBoxTestCity.Items)
{

  if (item.Selected)
  {
	parameters[index] = string.Format("@stIdCity{0}", index);
    cmd.Parameters.AddWithValue(parameters[i], item.Value);
    index++;
  }
}


الآن في الاستعلام لديك، إن كنت تعمل شرط، استخدم المعامل IN في عبارة SQL

توثيق موسوعة حسوب: معاملات المجال في SQL

لأنه تم تمرير أكثر من دولة

  • 0
نشر
بتاريخ 9 دقائق مضت قال Wael Aljamal:

هذه الدالة تقبل معامل واحد مع قيمته، ولكي تستطع حل المشكلة، عليك تمرير غرض برمجي


var p = cmd.CreateParameter();
p.Name = "wael";
p.age  = 24;
cmd.Parameters.Add(p);

لحل المشكلة بشكل أفضل، نمرر مصفوفة بأسماء المدن.


var parameters = new string[100]; // أقصى عدد ممكن
var index = 0;

foreach (ListItem item in lstBoxTestCity.Items)
{

  if (item.Selected)
  {
	parameters[index] = string.Format("@stIdCity{0}", index);
    cmd.Parameters.AddWithValue(parameters[i], item.Value);
    index++;
  }
}


الآن في الاستعلام لديك، إن كنت تعمل شرط، استخدم المعامل IN في عبارة SQL

توثيق موسوعة حسوب: معاملات المجال في SQL

لأنه تم تمرير أكثر من دولة

اهلا بك اخي الكريم

شكرا على ردك

استفسار  من اين احصل على [i] في السطر التالي بسبب ظهور عدم التعرف عليها:

  cmd.Parameters.AddWithValue(parameters[i], item.Value);

 

61b66aac25969_Screenshot2021-12-13013252.png.4db82e1d1ac64ef9e4fd7175d3fa2a37.png

 

 

الكود اصبح كالتالي:

 private void GetDtae()
        {
            string str = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            using (SqlConnection con = new SqlConnection(str))
            {
                using (SqlCommand cmd = new SqlCommand("Tprocedure", con))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    var parameters = new string[100];
                    var index = 0;
                        foreach (ListItem item in lstBoxTestCity.Items)
                    {

                        if (item.Selected)
                        {

                            parameters[index] = string.Format("@stIdCity{0}", index);
                            cmd.Parameters.AddWithValue(parameters[i], item.Value);
                            index++;
                            
                        }
                    }

                    SqlDataAdapter da = new SqlDataAdapter(cmd);
                    DataSet ds = new DataSet();
                    da.Fill(ds);
                    gvProducts.DataSource = ds;
                    gvProducts.DataBind();

                }
            }

        }

 

  • 0
نشر (معدل)

قمت بوضع السطر كالتالي :

cmd.Parameters.AddWithValue(parameters[index], item.Value);
                            index++;

ولكن تظهر الرسالة التاليه:

@stIdCity0 is not a parameter for procedure Tprocedure.

على حسب ما فهمت ان الصفر {0}هنا هو المشكلة أي انه لا يوجد حقل لدي يحمل هذا الاسم 

قمت بمحاولة إزالة الصفر ولكن في وضع الاختيار الواحد نجح الامر ولكن في وضع اكثر من اختيار لم ينجح ظهور المشكلة السابقة

تم التعديل في بواسطة مروان مروان3
  • 0
نشر

تحيه طيبه للجميع

تم حل المشكلة والشكر موصول الى الاخ @Wael Aljamal

وللفائدة طريقة الحل كالتالي:

    					string checkedItems = "";
						foreach (ListItem item in lstBoxTestCity.Items)
                   {
                        if (item.Selected)
                        {
                           

  							 checkedItems += item.Value + ",";

                        }
                    }
   						 cmd.Parameters.AddWithValue("@stIdCity", checkedItems);

 

  • 1
نشر
بتاريخ On 12/14/2021 at 19:18 قال مروان مروان3:

وللفائدة طريقة الحل كالتالي:

شكرا لك،

الحل هو تشكيل سلسلة نصية بأسماء المدن ونضع بين القيم فاصلة. أي ستكون قيمة checkedItems مثلا

checkedItems = "Syria, Egept, USA .."

 

وتمريرهم ل SQL كمتغير وحيد

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...