قمت بإستبدال المتحكم الدقيق PIC16F877A من شركة Microchip بلوحات Arduino مزودة بمتحكمات من شركة Atmel

03-12-2013 Hardware | Arduino
إعلان

في الفترة الماضية أعتدت على بناء المشاريع المتعلقة بالمتحكمات الدقيقة باستخدام أحد منتجات شركة Microchip وهو PIC16F877A لسهولة التعامل معه وبساطة الأوامر من خلال بيئة التطوير PIC-C Compiler, عادة ما يتم عمل محاكاة "Simulation" للدوائر الكهربائية من خلال برنامج Proteus, هو أيضا يدعم منتجات Microchip ويقوم بمحاكاة البرنامج الذي تمت كتابته لتنفيذ مهمة معينة, ولتوضيح الأمور بشكل أكبر سأطرح هذا السيناريو على سبيل المثال.

إذا قررت إنشاء نظام يتحكم بدرجة الحرارة من خلال حساس معين "Sensor" سأقوم بداية باستخدام برنامج Proteus لوضع تصور مبدئي عن طبيعة الدائرة الإلكترونية التي سيتم إنشاءها, فأضع متحكم PIC16F877A وأضع مقاومة متغيرة موصولة بمصدر جهد POT-HG وكذلك شاشة لعرض النتائج LCD Display لأقوم بعدها بوصل القطع بالأسلاك بشكل مباشر, أذهب بعدها لكتابة الكود الذي سيقوم باستقبال القيم من المقاومة المتغيرة بوحدة فولت "Volts" ليحولها إلى قيم رقمية "Analog To Digital Converter" وبعدها يتم معالجة القيمة ومن ثم عرض النتائج على الشاشة, وبعد الانتهاء من كتابة الكود يتم تضمينه بنموذج المحاكاة "Schematic" داخل برنامج Proteus ومن ثم تشغيله للتأكد من أن النظام يعمل كما هو مطلوب.

مثال على محاكاة برنامج proteus

بعد الانتهاء من الخطوات السابق ذكرها يتم اللجوء إلى مختبر الهندسة الطبية أو مختبر مشاريع التخرج في جامعة اليرموك للاستعانة بالناسخة المتوافرة ليتم نسخ الكود "hex" على المتحكم الدقيق ومن ثم بناء الدائرة الإلكترونية من الصفر, والصفر هنا تعني شراء Crystal بتردد معين"4MHz,8MHz,16MHz.." وبناء دائرة منظم الجهد Voltage Regulator لخفض الجهد إلى 5 Volts وهو الجهد الذي يعمل عليه المتحكم الدقيق, أضف إلى ذلك مجموعة المقاومات والأسلاك التي يتم استخدامها في تصنيع اللوحة, كل تلك التوصيلات تتم على لوحة تسمى BreadBoard تستخدم عادة لغايات تعليمية لسهولة وصل وإزالة المكونات منها.

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

هذه المشاكل التي عادة ما تتسبب في التقدم ببطئ حللتها من خلال استبدال المتحكمات المنفردة إلى استخدام لوحات Arduino Board جاهزة للاستخدام بشكل مباشر, فبدلا من الناسخة غالية الثمن لنسخ الكود يمكنك وصل اللوحة بالكمبيوتر من خلال وصلة USB ونسخ الكود بشكل مباشر.

ومشكلة بناء اللوحة من الصفر وتنظيم الجهد وتركيب Crystal للتردد ووصل الأسلاك فهي موجودة أصلا وجاهزة للاستخدام بدون أي حاجة لإعادة تلك الأعمال بشكل روتيني.

ليس ذلك فقط, بل إذا كنت بحاجة إلى 3.3 Volts يمكنك أخذها من خلال منفذ موجود على اللوحة يعطيك هذه القيمة مع وجود منفذ 5 Volts و 3 منافذ Ground.

بالنسبة لـ Serial Communication كان هناك منفذين فقط في "PIC16F877A "TX,RX, أما إذا قمت باستخدام لوحة Arduino Mega 2560 فهناك 8 منافذ لدعم Serial Communication كما أنها تحتوي على 70 منفذ بشكل إجمالي منها 16 منفذ لـ Analog To Digital Converter و 12 منفذ يمكن استخدامهم لـ "Pulse Width Modulation "PWM.

سيناريو بناء المشروع في الأعلى أصبح مختلف الآن, الفقرة المتعلقة ببناء نموذج محاكاة أصبحت غير موجودة, أصبحت لوحة Arduino هي نموذج المحاكاة, والقراءات والنتائج أصبحت أكثر دقة وأكثر واقعية, فعلى الرغم من قوة Proteus في المحاكاة إلى أنه لم يصل إلى مرحلة محاكاة مطابقة للواقع.

عن محمد جمال

مهندس حاسوب ومطور برمجيات, أعمل Freelancer في تطوير تطبيقات الويب من خلال ASP.NET منذ عام 2007 قمت بإنشاء عدة مشاريع في مجالات مختلفة (المتحكمات الدقيقة, الأنظمة المضمنة, الروبوت, برامج سطح المكتب, أنظمة قواعد البيانات) ومن هواياتي الخط العربي

subscribe

إعلان
إعلان

هل Captcha ما زالت صالحة للتأكد من هوية المستخدم ؟

30-10-2013 Blogging
إعلان

الفيديو في الأعلى يظهر برامج الذكاء الإصطناعي التي طورت بشكل كبير لتستطيع تمييز الأحرف والأرقام المستخدمة في Captcha, ليست دقيقة 100% ولنكن واقعيين نحن البشر نخطئ في كثير من الأحيان في تمييز أحرف Captcha لصعوبة قرائتها ولكنها لم تكن كذلك على أنظمة الذكاء الإصطناعي وستتطور إلى أبعد من ذلك مع مرور الوقت.

في مقال سابق كنت قد تحدثت عن السبام وكيف يعمل وما هي أهدافه وذكرت Captcha على أنها من أكثر الطرق فاعلية للتخلص منه ولكن لا أعتقد أنها ما زالت فعالة حتى الان, الفيديو في الأعلى قام بعرض مجموعة من Cpatcha للعديد من الخدمات أبرزها Yahoo و Paypal وكيف تم التعرف على محتواها, لذلك أعتقد أنه من باب أولى إتباع توجه اخر في التمييز بين البشر والروبوتس, فمهما كان أسلوب التشفير معقد وصعب سيأتي اليوم الذي نجد فيه برامج تقوم بالتعرف عليه كالإنسان تماما !

International Student Identity Card - ISIC  هي منظمة عالمية تعطي بطاقة لكل طالب جامعي تثبت هويته على الإنترنت على أنه طالب جامعي ويستفيد من كافة العروض الموجهة إلى طلاب الجامعات في العالم على الإنترنت من خلال بطاقة الإثبات تلك, فهل سيكون في يوم من الأيام منظمة تحت إسم International Human Identity Card تمنح كل شخص بطاقة هوية على الإنترنت يستطيع من خلالها إثبات إنسانيته لنتخلص من الروبوتس ومشتقاته !

عن محمد جمال

مهندس حاسوب ومطور برمجيات, أعمل Freelancer في تطوير تطبيقات الويب من خلال ASP.NET منذ عام 2007 قمت بإنشاء عدة مشاريع في مجالات مختلفة (المتحكمات الدقيقة, الأنظمة المضمنة, الروبوت, برامج سطح المكتب, أنظمة قواعد البيانات) ومن هواياتي الخط العربي

subscribe

إعلان
إعلان

مجموعة من المشاكل واجهتني أثناء ربط قاعدة البيانات بتطبيق Windows Phone 8

30-10-2013 WP8
إعلان

بعد أن أصبح الحاسوب لدي أشبه بمستنقع للبرامج والملفات التي قمت بتحميلها على مدار يومين متتاليين في محاولة مني لربط قاعدة بيانات موجودة مسبقا من نوع SQLite بتطبيق Windows Phone فاشلة, ولم أستمر في ذلك بسبب ضيق الوقت قمت بإستخدام قواعد البيانات SQL Server Compact بدلا من السابقة لكي يكون التفاهم فيما بين عناصر الدوت نت أشبه بكامل.

السبب وراء تفكيري بإستخدام قواعد بيانات SQLite في الأساس هو رغبة مني بتقليل حجم البرنامج, فقاعدة البيانات SQL Server Compact ذات الإمتداد SDF كانت مساحتها 43MB, فيما كانت قاعدة البيانات SQLite صاحبة الإمتداد db بمساحة 13MB فقط.

على العموم سأقوم بإيجاد حل لهذه المشكلة لاحقا ولكن حاليا أرغب بمشاركة التجربة معكم وعرض المشاكل التي واجهتني مع حلولها.

على ما يبدو أن مايكروسوفت تفكر حاليا في إيقاف دعم قواعد البيانات SQL Server Compact, يمكنك ملاحظة ذلك لعدم دعم Visual Studio 2013 إنشاء إتصال معها بشكل مباشر بل يتطلب منك حاليا تحميل إضافة ثانوية لتقوم بنفس العمل مع أنها كانت مدعومة في Visual Studio 2012, وعن نفسي قمت بتحميل SQL Server Compact Tools For 4.0 وأستخدمها في تصفح البيانات والجداول.

بداية قمت بإنشاء مشروع PhoneApp جديد على Visual Studio ثم نسخت قاعدة البيانات بشكل مباشر إلى المشروع وقمت بشتغيل المشروع "Run" لمجرد رغبتي في مشاهدة Emulator يعمل منذ البداية ولكن للأسف هذا ما شاهدته !

Error An attempt was made to load a program with an incorrect format.

ما الذي حدث ! فأنا حتى الان لم أكتب سطرا واحدا حتى ! لم أرى هناك شيئ غريبا في المشروع سوى قاعدة البيانات التي قمت بنسخها مباشرة, لذلك قمت بحذفها وأعدت تشغيل المشروع فتم تنفيذه بدون أية مشاكل, قمت بإعادة قاعدة البيانات فلم يعمل !

حسنا ! الأمور أصبحت أكثر وضوحا, قاعدة البيانات هي المشكلة, ونظام التشغيل لدي 64bit ويبدو أن هناك Component لتحميل قاعدة البيانات بإصدار 32bit ولم يستطع تنفيذها.

من قائمة Build ثم أختر Configuration Manager وبعدها قم بتغيير Active Solution Platform من Any CPU إلى x86

بعد حل هذه المشكلة مضيت قدما في تعريف الجداول, LINQ To SQL ولكن بشكل يدوي وذلك لأن LINQ To SQL File غير مدعوم على قواعد بيانات SQL Server Compact لذلك يتوجب عليك إنشاء الملف بشكل يدوي, حسنا إختصار للوقت قمت بإستخدام SQL Server Compact Tools For 4.0 لتوليد ملف LINQ To SQL وكان رائع.

هناك نمطان لإستخدام قاعدة البيانات ضمن المشروع, إما أن تقوم بتضمين قاعدة البيانات في المشروع ووضعها في أي مجلد من مجلدات المشروع وإما أن تقوم برفعها إلى Isolated Storage داخل Emulator ولكل طريقة ConnectionString خاص بها.

فإذا كنت ترغب برفع ملف قاعدة البيانات إلى Emulator ومن ثم إستخدامها هناك, أولا يمكنك قراءة هذا الشرح ليوضح لك الفكرة , ثم يمكنك إستخدام نص الإتصال التالي :

"Data Source=isostore:/db.sdf"

وإذا كنت ترغب بوضع قاعدة البيانات داخل مجلد المشروع مباشرة فيمكنك إستخدام نص الإتصال التالي :

"Data Source = 'appdata:/db.sdf'"

وبعد قيامي بكتابة الكود وتعريف الجداول قمت بتشغيل المشروع ليعطيني الخطأ الثاني

An exception of type 'System.Data.SqlServerCe.SqlCeException' occurred in Microsoft.Phone.Data.Internal.ni.dll but was not handled in user code

على الرغم من أن الخطأ من نوع not handled إلى أن تحديد المشكلة هنا كانت أسهل من سابقتها, فبمجرد إلقاء نظرة إلى Error Details تبين أن الخطأ متعلق بحجم قاعدة البيانات, إستغربت كثيرا فلم أجد أي تنبيه بخصوص حجم القاعدة في أي درس قمت بقرائته ! على العموم قمت بالبحث عن الجزء الخاص بحجم القاعدة داخل نص الإتصال وكان كالتالي :

"Data Source = 'appdata:/db.sdf';Max Database Size =60"

حجم قاعدة البيانات يوضع على أساس الميجابايت MB, أي أني قمت بتحديد حجم قاعدة البيانات على الأكثر 60 ميجابايت

هذه هي مجموعة الأخطاء التي ظهرت لي حتى هذه اللحظة لأن جل ما فعلته هو إنشاء مشروع وربطه بقاعدة بيانات لا أكثر وأرجو أن لا يكون هناك المزيد منها لاحقا, إذا كنت تعمل على تطبيق من نفس النوع يمكنك الإستفادة من الأداة SQL Server Compact Tools For 4.0 وتحميلها من هنا.

أما بالنسبة للتعامل مع قواعد البيانات من خلال Windows Phone فيبدو أنه لا يوجد دعم لجمل SQL التقليدية ولا حتى لإنشاء ملفات LINQ TO SQL بشكل مباشر لذلك يتوجب عليك إنشاء كل شيئ بشكل يدوي وما فعلته كالتالي :

أولا قم بإستدعاء Namespace التالية :

using System.Data.Linq.Mapping;
using System.Data.Linq;
using System.ComponentModel;

قم بعمل Mapping للجداول وهذا مثال على كيفية فعل ذلك, "يمكنك الإستعانة بالأداة SQL Server Compact Tools"

[Table(Name = "categories")]
public class categories
{
      private long _Id;

      private string _Name;

      private string _Description;

      [Column(Name = "id", Storage = "_Id", DbType = "BigInt NOT NULL", IsPrimaryKey = true)]
      public long Id
      {
           get
           {
                return this._Id;
           }
           set
           {
                if ((this._Id != value))
                {
                    this._Id = value;
                }
           }
       }
       [Column(Name = "name", Storage = "_Name", DbType = "NVarChar(510) NOT NULL", CanBeNull = false)]
       public string Name
       {
           get
           {
                return this._Name;
           }
           set
           {
                if ((this._Name != value))
                {
                    this._Name = value;
                }
           }
        }
        [Column(Name = "description", Storage = "_Description", DbType = "NText NOT NULL", CanBeNull = false, UpdateCheck = UpdateCheck.Never)]
        public string Description
        {
            get
            {
                return this._Description;
            }
            set
            {
                if ((this._Description != value))
                {
                    this._Description = value;
                }
            }
        }
}

ثم قم بإنشاء DataContext لتعريف نص الإتصال مع الجداول وليكون التعامل معها لاحقا

public class MyDataContext : DataContext
{
      public static string DBConnectionString = @"Data Source = 'appdata:/db.sdf';Max Database Size =60";
      public MyDataContext(string connectionString)
          : base(connectionString)
      {
          this.Cat = this.GetTable<categories>();
      }
      public Table <categories> Cat { get; set; }
}

بعد ذلك تقوم بالتفاعل مع الجداول في قاعدة البيانات من خلال الكود التالي :

MyDataContext db = new MyDataContext("Data Source = 'appdata:/db.sdf';Max Database Size =60");
if (db.DatabaseExists() == false)
{
      db.CreateDatabase();
      db.SubmitChanges();
      MessageBox.Show("Done");
}
else
{
      IQueryable<categories> result = from p in db.Cat
                   select p;
      foreach(categories r in result)
      {
          MessageBox.Show(r.Name.ToString());
      }
      MessageBox.Show(result.Count().ToString());
}


عن محمد جمال

مهندس حاسوب ومطور برمجيات, أعمل Freelancer في تطوير تطبيقات الويب من خلال ASP.NET منذ عام 2007 قمت بإنشاء عدة مشاريع في مجالات مختلفة (المتحكمات الدقيقة, الأنظمة المضمنة, الروبوت, برامج سطح المكتب, أنظمة قواعد البيانات) ومن هواياتي الخط العربي

subscribe

إعلان
إعلان

Mysql Connect/NET وكيف تستخدمها في التعامل مع قواعد البيانات Mysql من خلال Visual Studio

24-10-2013 MYSQL | Visual Studio
إعلان

الهدف من هذه المقالة أن تعرف جيدا كيف تقوم بالتعامل مع قواعد البيانات Mysql وكتابة الإستعلامات من خلال #C بإستخدام MySql Connect/NET , سأقوم بكتابة تطبيق بسيط يوضح كيفية إدراج المكتبة إلى مشروعك ومن ثم إستخدامها بشكل مباشر, قمت بكتابة هذه المقالة بعد أن تعرضت لمشكلة في تحويل قاعدة البيانات Mysql إلى قاعدة بيانات MSSQL sdf الخاصة بالهواتف "Windows Phone", قمت بتحميل العديد من البرامج وكان معظمها لا يعمل بشكل جيد, والبرامج الممتازة ذات سعر مرتفع جدا لذلك قررت كتابة تطبيق بسيط يقوم بنسخ البيانات من قاعدة إلى أخرى.

بداية قم بتحميل المكتبة MySql Connect/NET وقم بتنصيبها على حاسوبك وبعد ذلك قم بفتح Visual Studio أي كان إصداره

إختر Mysql.Data

قم بالدخول إلى خصائص Reference

أعد تعيين قيمة Copy Local إلى True

سوف نبدأ بإضافة مكتبة Mysql.Data.MysqlClient التي تحتوي على الفئات المختصة بالتعامل مع قاعدة البيانات Mysql.

//Include Mysql Library
using MySql.Data.MySqlClient;

لبناء إتصال مع قاعدة البيانات نستخدم الأسلوب الخاص بقواعد بيانات MSSQL ولكن مع إختلاف بسيط في Connection String فعناصر الإتصال بقاعدة بيانات Mysql هي كالتالي

  • Connection : وهو من نوع MysqlConnection وهو متغير يستخدم لإستقبال نص الإتصال Connection String وفتح وإغلاق الإتصال بقاعدة البيانات
  • Server : وهو السيرفر الخاص بقاعدة البيانات Mysql وعادة ما يكون localhost
  • Database : وهي قاعدة البيانات التي سنتواصل معها
  • uid : وهو إسم المستخدم الخاص بقاعدة البيانات وعادة ما يكون root
  • password : كلمة المرور الخاصة بقاعدة البيانات وفي معظم الأحيان لا يكون هناك أي كلمة مرور
  • ConnectionString : وهو نص الإتصال بقاعدة البيانات ويحتوي على القيم الخاصة بالعناصر السابق ذكرها

تجهيز نص الإتصال ConnectionString

يتم تجهيز نص الإتصال بقاعدة البيانات من خلال إنشاء متغير نصي ووضع القيم بداخله على الشكل التالي

string server = "localhost";
string database = "myDB";
string uid = "root";
string pwd = "123";
string ConnectionString = String.Format("Server={0};Database={1};" +
                          "UID={2};PASSWORD={3}", server, database, uid, pwd);

بعد ذلك ننشئ متغير الإتصال بقاعدة البيانات من نوع MysqlConnection ونقوم بتزويده بنص الإتصال

MySqlConnection cnn = new MySqlConnection(ConnectionString);

إنشاء Command للتعامل مع الجداول

بعد ذلك نقوم بإنشاء Command ليقوم بالتفاعل مع الجداول وتنفيذ الإستعلامات عليها كما في الكود التالي

MySqlCommand cmd = new MySqlCommand();
cmd.Connection = cnn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select * from db_table";

نفتح الإتصال بقاعدة البيانات ليتمكن Command من تنفيذ الإستعلامات

cnn.Open();

ثم نقوم بتنفيذ الإستعلام وحفظ النتائج في متغير من نوع SqlDataReader

MySqlDataReader rd = cmd.ExecuteReader();

وبعد ذلك نقوم بعرض البيانات

while (rd.Read())
{
       //Write Code Here
       textBox1.Text += (rd[1].ToString() + Environment.NewLine);
}

ثم نقوم بإغلاق كافة الإتصالات المفتوحة

rd.Close();
cnn.Close();

MysqlClient تشبه إلى حد كبير SqlClient والفروقات بينهما في نوع قاعدة البيانات التي يتم التعامل معها.

SqlClient هي مخصصة لقواعد البيانات MSSQL أما MysqlClient فهي لقواعد البيانات Mysql لذلك إن كنت قد تعاملت سابقا مع SqlClient فيمكنك إستخدام MysqlClient بكل سهولة, فقط قم بتعديل ConnectionString وقم بإستخدام Mysql قبل كل فئة بدل من Sql.

مثال :

MysqlConnection

بدلا من

SqlConnection

 

عن محمد جمال

مهندس حاسوب ومطور برمجيات, أعمل Freelancer في تطوير تطبيقات الويب من خلال ASP.NET منذ عام 2007 قمت بإنشاء عدة مشاريع في مجالات مختلفة (المتحكمات الدقيقة, الأنظمة المضمنة, الروبوت, برامج سطح المكتب, أنظمة قواعد البيانات) ومن هواياتي الخط العربي

subscribe

إعلان
إعلان

مقدمة إلى لغة الإستعلام المتكاملة LINQ وكيف تستخدمها في مشاريعك

21-10-2013 LINQ
إعلان

كمبرمج تطبيقات أي كان نوعها فغالبا ستحتاج إلى قاعدة بيانات تقوم بحفظ البيانات إسترجاعها تعديلها وحذفها أيضا ضمن متطلبات البرنامج, فعلى سبيل المثال إذا كنت تبرمج نظاما لمكتبة فبالتأكيد أنت بحاجة إلى جدول في قاعدة البيانات تقوم بإضافة بيانات الكتب وتعديلها وحذفها, مثل هذه العمليات أصبحت روتينية حتى في أبسط الأنظمة, العديد من الأساليب أتاحتها مايكروسوفت لمبرمجين الدوت نت من خلال Visual Studio للتعامل مع قواعد البيانات, لم أتطرق إلى معظمها وأكتفيت بإستخدام ADO.NET CommandText فترة لا بأس بها, مع وجود بعض المآخذ عليها إلا أنها كانت تفي بالغرض, لاحقا قامت مايكروسوفت بتطوير و تسهيل الأمور أكثر ليصبح التعامل مع قواعد البيانات متوافق بشكل أكبر مع مفهوم البرمجة الكائنية Object Oriented Programming OOP بعد أن كان الأمر مجرد إستعلامات مباشرة على قاعدة البيانات.

LINQ إختصار لجملة Language Integrated Query وهي عبارة عن مجموعة من الخصائص والمميزات ظهرت بداية في Visual Studio 2008 لتمكنك من كتابة الإستعلامات على قواعد البيانات بوجود مميزات كبيرة وأدوات تجعل منه أكثر سهولة وأقل إحتمالا لوجود الأخطاء.

تعتبر LINQ من أسهل الطرق حاليا في تنفيذ الإستعلامات على قواعد البيانات مثل الإضافة التعديل الحذف والتعامل مع "Relational Database" وغيرها, Visual Studio يحتوي على LINQ Provider assemblies التي تمكنك من إستخدام LINQ من خلال الدوت نت على مستوى SQL Server database,ADO.NET Datasets,Xml documents, أي أن الأمر ليس مقتصرا فقط على قاعدة بيانات MSSQL وجداولها بل يمكنك الإستفادة منها حتى أثناء التعامل ملفات XML.

طورت مايكروسوفت أسلوب جديد وحديث لكتابة الإستعلامات بدل من كتابتها على شكل نصوص غير مستفيده من خاصية Auto Complete الموجودة داخل Visual Studio بأسلوب يحتمل وقوع الكثير من الأخطاء أثناء كتابتها إلى أسلوب متطور بشكل أكبر حيث يمكنك كتابة الإستعلامات من خلال إحدى لغات البرمجة في الدوت نت مثل سي شارب الفيجيوال بيسك مثل أي كود عادي تقوم بكتابتة بدلا من إستخدام جمل SQL التقليدية. لن يكون هناك أية أخطاء إملائية أو غيرها نظرا لأنك تكتب كودات عادية وسيتعرف البرنامج في حال وجود خطأ "Strongly Typed" كما أن خاصية Auto Complete ستستفيد منها بالكامل عند إستخدامك LINQ.

من الجدير بالذكر أن الإستعلامات التي تكتب من خلال LINQ يتم تحويلها لاحقا إلى إستعلامات SQL عادية

لكي تكون الأمور أكثر وضوحا سنقوم بإنشاء مشروع بسيط يحتوي على الأوامر الأساسية في أي نظام يتعامل مع قاعدة بيانات وهي الإستعلام الإضافة التعديل والحذف وسنقوم بتوضيح كيفية تجهيز مشروعك لتقوم بإستخدام LINQ بداخلة من خلال LINQ To SQL

قم بإنشاء قاعدة بيانات LINQFeatures تحتوي على جدول واحد فقط خاص بالمواضيع Posts وقم بإضافة الحقول التالية إلى الجدول :

  • ID : الرقم المتسلسل للموضوع
  • Title : عنوان الموضوع
  • Content : نص الموضوع
  • Date : التاريخ الذي أضيف به الموضوع

داخل مشروع ASP.NET Web Forms جديد نقوم بربط قاعدة البيانات بالمشروع, لفعل ذلك قم بإضافة عنصر LINQ to SQL Classes إلى مشروعك ثم قم بإختيار الإسم المناسب للعنصر, قمت بتحديد الإسم LINQFeaturesDB.

بعد إضافة العنصر إلى المشروع الخاص بك ستحصل على شاشة شبه فارغة تطلب منك إضافة الجداول إليها وهو فعلا ما يقوم بفعلة العنصر الذي قمنا بإضافته مسبقا "LINQFeaturesDB" والذي ينشئ Class خاص بكل جدول تقوم بإضافته إلى الملف من خلال السحب والإفلات "Drag and Drop".

قم بإنشاء إتصال بقاعدة البيانات لنقوم بتصفح الجداول بداخلها, لفعل ذلك قم بالذهاب إلى نافذة Server Explorer, قم بضغط الزر الأيمن على Data Connections واختر Add Connection

ستظهر لك نافذة أخرى تطلب منك تحديد نوع قاعدة البيانات, إذا كانت قاعدة البيانات الخاصة بك موجوده كملف mdf بشكل منفصل قم بإختيار Microsoft SQL Server Database File وإذا كنت تتعامل مع قاعدة البيانات من خلال SQL Server Management Studio فقم بإختيار Microsoft SQL Server

الإسم الإفتراضي لسيرفر قاعدة البيانات SQL Server يمكن التعبير عنه كنقطة "." وبعدها أختر قاعدة البيانات التي قمت بإنشائها مسبقا

بعد الإنتهاء من هذه المرحلة نكون قد أنشأنا الإتصال بقاعدة البيانات, سنقوم الان بإعداد الملف الخاص بجداول قاعدة البيانات LINQFeaturesDB.dbml. حسنا قم بفتح الإتصال واختر الجدول Posts ثم قم بسحبة وإفلاته في المنطقة الفارغة

سيظهر لك بهذا الشكل مع الإنتباه لإسمه الجديد, فقد تم تعديل أسمه من Posts إلى Post وهي إضافة تقوم LINQ بإستخدامها لتأخذ المفرد من الأشياء لكي تتعامل معه لاحقا على أنه مفرد وأن مجموعة المواضيع في الجدول يعبر عنها بقائمة من نوع Post.

الان يمكننا القول أننا انتهينا من مرحلة تجهيز المشروع لإستخدام LINQ في كتابة الإستعلامات على قاعدة البيانات بدل من إستخدام جمل SQL التقليدية القديمة ولكي لا أطيل عليكم الحديث سأقوم بإنشاء إستعلام بسيط يقوم بإرجاع كافة العناوين "Titles" لكافة المواضيع في جدول Posts, ولأن قاعدة البيانات فارغة حاليا قمت بإضافة مجموعة من البيانات العشوائية لتفي بالغرض.

سأقوم بكتابة الإستعلام داخل Page_Load event لكي يتم تنفيذة بمجرد تحميل الصفحة مباشرة ولأننا حاليا نقوم بتوضيح كيفية التعامل مع LINQ بشكل مباشر لا بصدد توضيح الأماكن التي يجب أن يوضع بها كل إستعلام. قبل كل شيئ سنقوم بتعريف كائن Object من الفئة LINQFeaturesDBDataContext لكي تتيح لنا التعامل مع قاعدة البيانات التي قمنا بإنشائها.

هذه الفئة يتم إنشائها بشكل تلقائي بعد تنفيذ الخطوات السابق ذكرها, يمكنك إعتبار الكائن الذي قمنا بإنشائه من هذه الفئة على أنه قاعدة بيانات يحتوي على كافة المعلومات وعلى الدوال الجاهزة "Methods" الخاصة بعمليات التعديل والحذف وغيرها.

LINQFeaturesDBDataContext db = new LINQFeaturesDBDataContext();
protected void Page_Load(object sender,EventArgs e)
{
	foreach (Post p in db.Posts)
	{
		Response.Write("<h1>"+p.Title+"</h1>");
	}
}

كما تلاحظ قمنا بإنشاء الكائن db من الفئة LINQFeaturesDBDataConext وبعد ذلك قمنا بعمل جملة الدوران foreach على كافة العناصر الموجوده في جدول Posts من خلال تعريفها بالفئه Post, لاحظ أن db.Posts هي قائمة تحتوي على كافة المعلومات في جدول Posts ويمكن الوصول إليها بشكل مباشر, أما العناصر الموجودة في القائمة فهي من نوع Post. يمكنك الإطلاع على شرح مختص بجملة الدوران foreach.

نتيجة تنفيذ الكود السابق

البحث من خلال LINQ

حسنا ماذا لو أردنا القيام بالبحث من خلال LINQ, من الطبيعي أن أية مجموعة من البيانات أثناء مرحلة معينة تحتاج إلى معيار معين لإرجاع البيانات كما هو في محركات البحث التي تعود عليك بنتائج وفق كلمة البحث التي قمت بكتابتها.

سابقا كنا نتورط كثيرا بإستخدام جملة LIKE والتي يتوجب عليك إستذكار حيثياتها بالتفصيل لتتمكن من البحث عن شيئ يبدأ بحرف معين, هناك رموز يجب عليك أن تتذكرها وكذلك الأمر إذا كان متعلقا بإرجاع كافة البيانات التي تحتوي على كلمة أو حرف معين, هذه المعضلات لم تعد موجودة فأثناء إستخدامك LINQ يمكنك البحث داخل قاعدة البيانات بكل سهولة من خلال مجموعة من الدوال التي تترجم فيما بعد إلى SQL بالصيغة المناسبة.

قمت بكتابة مثال بسيط يقوم بإرجاع البيانات التي تحتوي الرقم 1 في العنوان من خلال هذا الكود

IQueryable<Post> _post = from p in db.Posts
                               where p.Title.Contains("1")
                               return p;
foreach(Post post in _post)
{
        Response.Write("<h1>" + post.Title + "</h1>");
}

قمنا بتعريف قائمة من الفئه IQueryable والتي تشبه إلى حد كبير List في التعامل معها ولكن هناك بعض الفروقات الجوهرية في الإستخدام يمكنك أن تجدها هنا

أي إستعلام "Select" يتم تنفيذة على قاعدة البيانات يقوم بإرجاع قيم معينة وعلينا إنشاء المتغير الذي سنقوم بتخزين هذه القيم بداخله بناء على نوع البيانات الراجعة, IQueryable هو نوع البيانات الذي تقوم بإرجاعه إستعلامات LINQ بشكل إفتراضي لذلك قمت بإنشاء قائمة من نوع IQuerayble وليس عنصر واحد فقط وذلك لإحتمال رجوع أكثر من نتيجة تنطبق عليها شروط البحث.

ملاحظة : في بعض الأحيان تقوم بالإستعلام عن ID الخاص بموضوع معين وتظن أنه سيعود عليك بصف واحد فقط, فعليا لا يعلم LINQ ذلك بل يفترض أن هناك العديد من الحقول التي تحتوي نفس النتيجة ويرجع لك بقائمة, لحل مثل هذه الإشكاليات قم بإستخدام FirstOrDefault في نهاية الإستعلام.

معيار البحث الذي قمنا بإستخدامة في المثال السابق هو Title.Contains, أي قم بإرجاع كافة المواضيع التي تحتوي عناوينها الرقم 1

بعد أن عدنا بنتيجة الإستعلام الأن يمكننا أن نقوم بتنفيذ جملة foreach عليها لعرض النتائج للمستخدم وستكون نتيجة الإستعلام في الأعلى كما يلي

هنا نفس الكود السابق ولكن ضمن معيار بحث مختلف, StartWith تقوم بإرجاع كافة الصفوف التي يبدأ عنوانها بحرف A.

        IQueryable<Post> _post = from p in db.Posts
                                     where p.Title.StartsWith("A")
                                     return p;

إضافة صف من خلال LINQ

بما أن LINQ قام بتحديد كيفية تعاملنا مع قواعد البيانات والجداول بداخلها على أنها كائنات فإن ذلك يشكل لدينا فكرة مسبقا عن كيفية إضافة صف إلى قاعدة البيانات والذي يكون عبارة عن كائن Object من نوع الجدول الذي نرغب بإضافة الصف فيه.

فلو أردنا إضافة موضوع جديد كيف يتم ذلك ؟ لتوضيح ذلك قمت بإنشاء نموذج بسيط يحتوي على بيانات يتم إدخالها من المستخدم "عنوان الموضوع ونص الموضوع" وعند الضغط على زر إضافة يقوم البرنامج بإضافة صف جديد إلى الجدول يحتوي على المعلومات التي قمنا بإدخالها في النموذج.

الكود الذي قمت بكتابتة داخل زر الإضافة

Post p = new Post();
p.Title = txt_title.Text;
p.Content = txt_content.Text;
p.Date = DateTime.Now.Date;

db.Posts.InsertOnSubmit(p);
db.SubmitChanges();

قمنا بإنشاء كائن من الفئة Post وأسندنا القيم إلى المتغيرات الخاصه به وبعدها قمنا بإدراج الكائن داخل جدول المواضيع "db.Posts.InsertOnSubmit" ثم قمنا بتأكيد الإضافة.

النتائج في قاعدة البيانات

التعديل بإستخدام LINQ

اما التعديل فيتم من خلال إسترجاع الموضوع بواسطة ID الخاص به وبعد ذلك تعديل القيم ومن ثم حفظ التغييرات "SubmitChange"

Post _post = (from p in db.Posts
	     where p.Id.Equals(5)
	     select p).FirstOrDefault();

_post.Title = txt_title.Text;
_post.Content = txt_content.Text;
_post.Date = DateTime.Now.Date;
db.SubmitChanges();
Response.Write("تم تعديل البيانات بنجاح");

النموذج

التعديل

حذف صف بإستخدام LINQ

بالنسبة للحذف يمكنك استخدام الكود التالي

Post _post = (from p in db.Posts
             where p.Id.Equals(5)
             select p).FirstOrDefault();
            
db.Posts.DeleteOnSubmit(_post);
db.SubmitChanges();
Response.Write("تم حذف البيانات بنجاح");

هناك العديد من المميزات الأخرى التي توفر عليك الوقت والجهد في كتابة الإستعلامات وخصوصا على "Relational Databases"

سأحاول لاحقا الكتابة عن طرق متقدمة في كتابة الإستعلامات من خلال LINQ, إلى ذلك الوقت هناك بعض المقالات التي تفيدك في هذا المجال يمكنك الرجوع إليها


عن محمد جمال

مهندس حاسوب ومطور برمجيات, أعمل Freelancer في تطوير تطبيقات الويب من خلال ASP.NET منذ عام 2007 قمت بإنشاء عدة مشاريع في مجالات مختلفة (المتحكمات الدقيقة, الأنظمة المضمنة, الروبوت, برامج سطح المكتب, أنظمة قواعد البيانات) ومن هواياتي الخط العربي

subscribe

إعلان
إعلان

تنويه : الأراء في هذا الموقع شخصية ولا تبت لأحد بصلة تحت أي حال من الأحوال