رسالة Invalid Query على المحاكي الخاص بـ Windows Phone 8

11-01-2014 WP8
إعلان

كالعادة بين الفترة والاخرى أقوم بتنظيف الجهاز كليا وعمل Format كامل لأتخلص من كم هائل من الملفات لا أعلم ما وأين هي ولماذا قمت بتحميلها أصلا ليعود الحاسوب خالي الوفاض, كنت أواجه عادة مشاكل في إعادة تثبيت بعض البرامج وأقوم بحلها بسرعة, أو على أقل تقدير أكون على معرفة بسبب المشكلة, ولكن في اخر مرة حدثت معي مشكلة بعد تثبيت Visual Studio 2013 مع Windows Phone SDK, المشكلة كانت في Emulator, لم يكن يعمل, وفي كل مرة أحاول أن اقوم بتشغيله يعطيني الخطأ Invalid Query !

في البداية ظننت أن المشكلة تتعلق بـ Hyper-V فقمت بالذهاب للوحة التحكم لأقوم بتفعيلة ولكني وجدته مفعلا ! "ستجد شرح كامل لكيفية تفعيلة على هذا الرابط".

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

ذهبت إلى ملف المحاكي "XDE.exe" لاقوم بتشغيلة من خارج بيئة Visual Studio, فعاد وظهر لي الخطأ التالي : 

 

الرسالة طبيعية فمن المنطقي أن لا يتم تشغيل Virtual Machine بشكل مباشر ومن دون معلومات, على أية حال إذا كنت تريد تشغيل Windows Phone Emulator من خارج بيئة التطوير Visual Studio يمكنك إستخدام هذا السطر :

xde -vhd "C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v8.0\Emulation\Images\Flash.vhd"

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

حاليا لم أجد سبب أو حل لهذه المشكلة ولكن ما فعلته لتجاوزها في الوقت الحالي هو أني قمت بتثبيت نسخة Windows 7 Professional على الحاسوب ثم قمت بإستخدام برنامج VMWare وبعدها أنشئت Virtual Machine بنسخة Windows 8 ثم قمت بتحميل Windows Phone SDK. كل شيئ كان يعمل بشكل رائع !

يمكنك مشاهدة هذا الشرح لتوضيح كيف يمكنك تثبيت Windows Phone SDK على Virtual Machine

أعجبتني الفكرة فقمت بتثبيت نسخة إضافية من Windows XP لوجود بعض البرامج التي أحتاجها في العمل مثل Sound Recorder و Hyper Terminal. برنامج Sound Recorder في النسخ الحديثة لا يقوم بتخصيص ملفات الصوت بشكل جيد فكلها تصدر بصيغة "wma" وأنا أريدها بصيغة "wav" ضمن مواصفات معينة.

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

عن محمد جمال

مهندس حاسوب ومطور برمجيات, أعمل 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

إعلان
إعلان

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