Flutter Dev نشر 12 ديسمبر 2021 أرسل تقرير نشر 12 ديسمبر 2021 (معدل) احاول ارسال قيم الى 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(); } } } والقائمة كالتالي التي يختار منها المستخدم: كيف يمكن تجنب هذا المشكله وحل هذا الامر ياليت لو كان احد مر بنفس التجربه يفيدنا لو تكرمتو تم التعديل في 12 ديسمبر 2021 بواسطة Wael Aljamal توضيح السؤال 1 اقتباس
1 Wael Aljamal نشر 12 ديسمبر 2021 أرسل تقرير نشر 12 ديسمبر 2021 هذه الدالة تقبل معامل واحد مع قيمته، ولكي تستطع حل المشكلة، عليك تمرير غرض برمجي 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 لأنه تم تمرير أكثر من دولة 1 اقتباس
0 Flutter Dev نشر 12 ديسمبر 2021 الكاتب أرسل تقرير نشر 12 ديسمبر 2021 بتاريخ 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); الكود اصبح كالتالي: 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(); } } } اقتباس
1 Wael Aljamal نشر 12 ديسمبر 2021 أرسل تقرير نشر 12 ديسمبر 2021 بتاريخ الآن قال مروان مروان3: استفسار من اين احصل على [i] في السطر التالي بسبب ظهور عدم التعرف عليها: عفوا هذه index لايوجد متغير i 1 اقتباس
0 Flutter Dev نشر 12 ديسمبر 2021 الكاتب أرسل تقرير نشر 12 ديسمبر 2021 (معدل) قمت بوضع السطر كالتالي : cmd.Parameters.AddWithValue(parameters[index], item.Value); index++; ولكن تظهر الرسالة التاليه: @stIdCity0 is not a parameter for procedure Tprocedure. على حسب ما فهمت ان الصفر {0}هنا هو المشكلة أي انه لا يوجد حقل لدي يحمل هذا الاسم قمت بمحاولة إزالة الصفر ولكن في وضع الاختيار الواحد نجح الامر ولكن في وضع اكثر من اختيار لم ينجح ظهور المشكلة السابقة تم التعديل في 12 ديسمبر 2021 بواسطة مروان مروان3 اقتباس
0 Flutter Dev نشر 14 ديسمبر 2021 الكاتب أرسل تقرير نشر 14 ديسمبر 2021 تحيه طيبه للجميع تم حل المشكلة والشكر موصول الى الاخ @Wael Aljamal وللفائدة طريقة الحل كالتالي: string checkedItems = ""; foreach (ListItem item in lstBoxTestCity.Items) { if (item.Selected) { checkedItems += item.Value + ","; } } cmd.Parameters.AddWithValue("@stIdCity", checkedItems); 1 اقتباس
1 Wael Aljamal نشر 15 ديسمبر 2021 أرسل تقرير نشر 15 ديسمبر 2021 بتاريخ On 12/14/2021 at 19:18 قال مروان مروان3: وللفائدة طريقة الحل كالتالي: شكرا لك، الحل هو تشكيل سلسلة نصية بأسماء المدن ونضع بين القيم فاصلة. أي ستكون قيمة checkedItems مثلا checkedItems = "Syria, Egept, USA .." وتمريرهم ل SQL كمتغير وحيد 1 اقتباس
السؤال
Flutter Dev
احاول ارسال قيم الى 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(); } } }
والقائمة كالتالي التي يختار منها المستخدم:
كيف يمكن تجنب هذا المشكله وحل هذا الامر ياليت لو كان احد مر بنفس التجربه يفيدنا لو تكرمتو
تم التعديل في بواسطة Wael Aljamalتوضيح السؤال
6 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.