البرمجة

تحسين أمان تنفيذ الاستعلامات في تطبيق C# بالاستفادة من SqlParameter

عندما تقوم بالنقر على الزر، تواجه رسالة خطأ تشير إلى أن “executenonquery commandtext property has not been initialized”. هذا الخطأ يشير إلى أن خاصية commandtext لطلب الإجراء الذي يتم تنفيذه لم تتم تهيئتها بشكل صحيح.

في الشيفرة التي قدمتها، يتم استخدام SqlCommand لتنفيذ استعلام SQL. ومن ثم يتم استخدام SqlDataReader لقراءة النتائج. وفي النهاية، يتم بناء استعلام SQL آخر باستخدام نصوص النتائج ويُعين على خاصية CommandText لـ SqlCommand، ويتم تنفيذه باستخدام ExecuteNonQuery.

المشكلة هنا تبدو واضحة في تهيئة CommandText، حيث تقوم ببناء الاستعلام في حلقة while ومن ثم تعينه على الـ CommandText بعد الحلقة. قد يؤدي هذا إلى أن يكون CommandText فارغًا عندما يتم تنفيذ ExecuteNonQuery.

لتحديد هذه المشكلة، يمكنك تحريك تعيين CommandText داخل الحلقة واختبار الكود بشكل متكرر للتأكد من أن الاستعلام يتم بناؤه بشكل صحيح.

csharp
string strcom = ""; while (reader.Read()) { if (reader["vmid"].ToString() != "") { string vmid = reader["vmid"].ToString(); strcom += "update vm1 set pmid = (select pmid from vm1 as VM2 where benchmarkid = '" + Structure.BenchmarkID + "' and vm2.count ='" + (CurrentCount - 1) + "' and vm2.vmid ='" + vmid + "' ) where count = '" + CurrentCount + "' and vmid = '" + vmid + "' and benchmarkid = '" + Structure.BenchmarkID + "' \n"; } }//end of while reader.Close(); cmd.CommandText = strcom; cmd.ExecuteNonQuery();

هذا التغيير يجعل تهيئة CommandText داخل الحلقة، مما يضمن أنها تحصل على القيم المناسبة أثناء بناء الاستعلام.

المزيد من المعلومات

بالتأكيد، سنوسع أكثر في تفسير المشكلة ونقدم بعض الإرشادات حول كيفية تحسين الشيفرة وتفادي هذه الأخطاء في المستقبل.

الخطأ الذي تواجهه ينبع من عدم تهيئة الخاصية CommandText لـ SqlCommand قبل استخدامها في ExecuteNonQuery. يتسبب هذا في تنفيذ استعلام SQL فارغ أو غير صحيح، مما يؤدي إلى إطلاق الخطأ الذي تشير إليه.

لتحسين الكود وتجنب هذا النوع من الأخطاء، يمكنك اتباع بعض النصائح التالية:

1. استخدام using للإدارة الموارد:

ضمن الأكواد التي تتعامل مع موارد مثل SqlConnection و SqlCommand و SqlDataReader، استخدم كتلة using لضمان إغلاق هذه الموارد بشكل صحيح بعد الانتهاء من استخدامها.

csharp
using (SqlConnection Conn = new SqlConnection(Yahya.strcon)) { Conn.Open(); // باقي الشيفرة هنا }

2. استخدام SqlParameter لتفادي هجمات SQL Injection:

قد تكون الطريقة الحالية لبناء الاستعلام عرضة لهجمات SQL Injection. يُفضل استخدام SqlParameter لتعزيز أمان الشيفرة وتجنب هذه الثغرات.

3. تجنب استخدام نصوص الاستعلام المبنية داخل حلقة:

تجنب بناء نصوص الاستعلام داخل حلقة، خاصة إذا كان يمكن تجنب ذلك. يمكنك تحديد نص الاستعلام مباشرةً داخل كائن SqlCommand.

4. التحقق من قيم البيانات:

تأكد من أن القيم التي تستخدمها في بناء الاستعلام تحتوي على القيم الصحيحة وأنها لا تحتوي على أي أخطاء تتسبب في تكوين استعلام غير صالح.

تطبيق هذه النصائح يمكن أن يساعد في تحسين أمان الشيفرة وتفادي مشكلات مثل الخطأ الحالي الذي تواجهه.

مقالات ذات صلة

زر الذهاب إلى الأعلى

هذا المحتوى محمي من النسخ لمشاركته يرجى استعمال أزرار المشاركة السريعة أو تسخ الرابط !!