RSS

Tag Archives: Dot NET

Creating Custom Timer Job in SharePoint 2010


In this post I will show you how to create Custom Timer Job in SharePoint 2010 but you must know this post is based on Creating Custom SharePoint Timer Jobs ,
Update [12/11/2011]
[
You can download the source code of this article from the following code (Please do not forget to rate it)
You do not need any things else just open it in Visual Studio 2010 and deploy it.That’s all
]
So let us start
Create Custom List and name it  ListTimerJob
Open Visual Studio 2010 >File > New >Project >SharePoint 2010>Empty SharePoint Project. >Name it Custom_TimerJob>Ok

Check Deploy as farm solution>Finish

create a class that inherits from the Microsoft.SharePoint.Administration.SPJobDefinition class. To implement this class, you need to create a few constructors and override the Execute() method as following
namespace DotnetFinder
{
    class ListTimerJob : SPJobDefinition
    {
         public ListTimerJob()

            : base()
        {

        }

        public ListTimerJob(string jobName, SPService service, SPServer server, SPJobLockType targetType)

            : base(jobName, service, server, targetType)
        {

        }

        public ListTimerJob(string jobName, SPWebApplication webApplication)

            : base(jobName, webApplication, null, SPJobLockType.ContentDatabase)
        {

            this.Title = "List Timer Job";

        }

        public override void Execute(Guid contentDbId)
        {

            // get a reference to the current site collection's content database

            SPWebApplication webApplication = this.Parent as SPWebApplication;

            SPContentDatabase contentDb = webApplication.ContentDatabases[contentDbId];

            // get a reference to the "ListTimerJob" list in the RootWeb of the first site collection in the content database

            SPList Listjob = contentDb.Sites[0].RootWeb.Lists["ListTimerJob"];

            // create a new list Item, set the Title to the current day/time, and update the item

            SPListItem newList = Listjob.Items.Add();

            newList["Title"] = DateTime.Now.ToString();

            newList.Update();

        }
}
}

As you can see this job just add a new item to a ListTimerJob list every time it’s executed

Now that you have the job built> Right click on the Features >Add Feature

Right click on the Feature1 ” you can rename the Feature1 to any name” > Add Event Receiver

As you can see the event Receiver class inherits from the Microsoft.SharePoint.SPFeatureReceiver and This class handles events raised during feature activation, deactivation, installation, uninstallation, and upgrade. But we only need FeatureActivated & FeatureDeactivated event handler to install/uninstall our custom timer job as following

namespace DotnetFinder.Features.Feature1
{
[Guid("9a724fdb-e423-4232-9626-0cffc53fb74b")]
public class Feature1EventReceiver : SPFeatureReceiver
    {
        const string List_JOB_NAME = "ListLogger";
        // Uncomment the method below to handle the event raised after a feature has been activated.

        public override void FeatureActivated(SPFeatureReceiverProperties properties)
        {
            SPSite site = properties.Feature.Parent as SPSite;

            // make sure the job isn't already registered

            foreach (SPJobDefinition job in site.WebApplication.JobDefinitions)
            {

                if (job.Name == List_JOB_NAME)

                    job.Delete();

            }

            // install the job

            ListTimerJob listLoggerJob = new ListTimerJob(List_JOB_NAME, site.WebApplication);

            SPMinuteSchedule schedule = new SPMinuteSchedule();

            schedule.BeginSecond = 0;

            schedule.EndSecond = 59;

            schedule.Interval = 5;

            listLoggerJob.Schedule = schedule;

            listLoggerJob.Update();

        }

        // Uncomment the method below to handle the event raised before a feature is deactivated.

        public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
        {
            SPSite site = properties.Feature.Parent as SPSite;

            // delete the job

            foreach (SPJobDefinition job in site.WebApplication.JobDefinitions)
            {

                if (job.Name == List_JOB_NAME)

                    job.Delete();

            }

}

   }

Before Deploying you should select the right scope of the Feature in other words in which scope you will activate the Feature(Farm,Site,Web,WebApplication) in our case we will activate Feature1 on Site which is mean Site Collection.

Note : if you trying to activate the feature in the wrong scope will get the following error

Now let us deploy our custom timer job >Right Click on Custom_TimerJob project > Click Deploy

Open now your SharePoint site and select ListTimerJob List and you should see something similar to the following image


Our custom timer job is working fine now you can go and check it and modify the schedule as following
Go to SharePoint 2010 central administration >Monitoring >in the Timer Jobs Section Select Review Job Definitions
and you should See our Custom Timer Job

Click on it and you should see Edit Timer Job Page ,Modify Timer Job schedule based on your requirement
Note : you can also modify schedule of your custom Timer Job from the code but you need to add one of the following class in FeatureActviated Event Handler as following

After Specific Minutes use SPMinuteSchedule class
Hourly use SPHourlySchedule class
Daily use SPDailySchedule class
Weekly use SPWeeklySchedule class
Monthly use SPMonthlySchedule class

Updated [ 8/10/2011]
References
Regards.
Advertisements
 
139 Comments

Posted by on July 24, 2010 in SharePoint

 

Tags: , , , , , ,

برنامج مستعرض الصور MyAlbum2 بإستخدام Asp.Net and Jquery


بسم الله الرحمن الرحيم
في هذا الدرس سوف نستعرض معا مستعرض الصور الإصدار الثاني وهو باستخدام مكتبة (Jquery) مع لغة (Asp.Net) والهدف من المستعرض هو عرض الصور من مصدر بيانات (DataSource) سواء قواعد بيانات مثل (Sql Server) او ملفات (XML)
صورة من مستعرض الصور

مميزات مستعرض الصور
• دعم كامل لمصادر البيانات المختلفة
فيمكنك أن تخزن الصور في قواعد بيانات او تقوم بتخزينها في ملفات (Xml)
• عرض صورة جاري التقدم (Progress Image)
كما ترى في الصورة التي في الأعلى فأن الصورة التي لم تظهر بعد يكون مكانها صورة جاري التحميل (جميل جدا ,صح)
• إستخدام (Linq To Sql) وذلك في إضافة الصور الى قاعدة البيانات وإستعرض الصور من قواعد البيانات
• إستخدام كترول (Asp.net Repeater) والغرض من ذلك انه عن عرض الصفحة فإن الأوسم (Tags) التي سوف تظهر هي عبارة عن (Div)
• (Custom Paging) بإستخدام (Linq) والمقصود هنا التنقل المخصص بين الصفحات من الخلف الى الأمام أو من ألامام إلى الخلف وهذا يتم عن طرق الشفرة(Code) لأن (Asp.net Repeater) لا تدعم التنقل الإفتراضي (Default Paging).
طبعا مستعرض الصور يستخدم مكتبة (Jquery) وذلك لعمل التأثيرات مثل الظهور (Fade out) والإختفاء (Fade In) مع إمكانية تحديد السرعة للظهور والإختفاء
كان غرضي من المشروع او المعرض الخاص بالصور هو أن أجمع أكثر من فائدة في نفس الوقت فأردت أن أريك القوة الحقيقة لمكتبة (Jquery) وايضا القوة الحقيقة لتطبيق لغة الإستعلام المدمجة (LINQ) وكيف قامت في الحقيقة بتبسيط الأشياء لنا . لنبدء بالشرح على بركة الله.
أولا الفصائل (Classes)
طبعا برنامج مستعرض الصور يحتوي على فصيلة واحدة إسمها (ImageManger) وجميع محتوياتها ساكنة (static) أي بمعنى أنه لاداعي لإنشاء كائن (New Object) من هذه الفصيلة والغرض من هذه الفصيلة هو عرض البيانات (Select statement) ومعالجة التنقل بين الصفحات بناء على حجم او عدد الصور في الصفحة الواحدة أنظر الصورة التالية


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

protected void Page_Load(object sender, EventArgs e)
{
     if (!IsPostBack)
      {
        //Start From 1 Thats mean the first page
        ViewState["Counter"] = 1;
      //Get the number of pages and save it in the ViewState
      ViewState["ImageRow"] = ImageManager.GetRowNumber();
     //Get the number of images (5,6,...) As you want
      Repeater1.DataSource = ImageManager.GetImages();
     Repeater1.DataBind();
  }
}

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

 protected void Forward_Click(object sender, EventArgs e)
    {
        //Enable Backword button
        Backward.Enabled = true;
        //Increase the number of page based on the current number
        //number of rows that will be skipped
        int Row_Index = ImageManager.IncreaseRows((int)ViewState["Counter"]);
        //Check if this page is last page or not
        if ((int)ViewState["Counter"] < (int)ViewState["ImageRow"])
        {
            //Get the number of images based on the page
            SetSource(ImageManager.GetImages(Row_Index));
            //Save the current page in the ViewState counter
            ViewState["Counter"] = ImageManager.IncreaseValue((int)ViewState["Counter"]);
            //Check if we are in the last page then disable the foreword control
            if (ImageManager.IsLast((int)ViewState["Counter"],(int) ViewState["ImageRow"]))
            {
                Forward.Enabled = false;
            }
        }

    }

ثانيا عند الى الانتقال الى الخلف نقوم بنفس الخطوات السابقة ولكن نتحقق اذا كان في الصفحة الاولى اما لا كما هو موضح في التالي

protected void Backword_Click(object sender, EventArgs e)
    {
        //Enable the ForeWord button
        Forward.Enabled = true;
        //number of rows that will be skipped
        int Row_Index = ImageManager.DecreaseRows((int)ViewState["Counter"]);
        //check if this page is the first page or not
        if ((int)ViewState["Counter"] > 0)
        {
            //decrease the number of pages
            ViewState["Counter"] = ImageManager.DecreasValue((int)ViewState["Counter"] );
            //number of skipped row ,this number will be use in skip method
            int SkipRows = ImageManager.SkippedRow(Row_Index);
            SetSource(ImageManager.GetImages(SkipRows));
            //Check if we are in the first page then disable the foreword control
            if (ImageManager.IsFirst((int)ViewState["Counter"]))
            {
                SkipRows = 0;
                Backward.Enabled = false;
            }

        }
    }

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

في الختام
اريد في ختام هذا الموضوع ان اوضح لكم الغرض الاساسي من هذا المستعرض حيث انني اجد في الكثير من المنتديات من
يريد طريقة عمل مستعرض للصور لذلك قررت بعد التوكل على الله أن اقوم ببناء هذا البرنامج البسيط واردت ان اجمع فيها
أكثر من فائدة مثل Jquery,Linq To Sql وأردتها ان تكون باسلوب ممتع
لذلك اعتذر ان وجود احدا من كم خطا في ماكتبته واتمنى ان يصحح لي  واتمنى أن يكون نقاشنا بناء حتى نتعلم سويا ونكون قادرين على الانتاج وبناء مجتمع عربي تقني قادر على المنافسة
والله الموفق
رابط التحميل MyAlbum2.0

 
9 Comments

Posted by on June 19, 2010 in ASP.NET

 

Tags: , , , , , ,

تصدير البيانات من ملف إكسل إلى قواعد بيانات SQL SERVER


سوف نتحدث اليوم عن كيفية تصدير البيانات من ملف إكسل (Excel) إلى قواعد بيانات (MS SQL Server) ولكن قبل أن نبدء هنالك قواعد يجب أن تتبع
•    يجب أن تضع عناوين (Header)  للبيانات التي لديك في الصف الأول بمعنى أخر يجب أن تكون لديك أعمدة ذات أسماء كما هو موضح في الصور التالية

•    يجب أن تقوم بتصميم جدول في قاعدة بيانات (SQL Server) بنفس الأسماء إذا أردت (غير ضروري) مع إختيار أنواع البيانات المناسبة (Data Type) مثلا (int,varchar2,numeric…). مع أهمية الترتيب في تصميم الأعمدة فكما ترى في الأعلى لدينا ملف أكسل يحتوي على عمود إسمه (ID) وعمود أخر إسمه (Name).إذا عند تصميم الجدول تنشيء عمود إسم (ID) ثم عمود أخر إسمه (Name) على التوالي.
والان بعد أن رأينا القواعد نأتي الان الى صلب الموضوع وهو كيف يمكن كتابة شفرة (Code) لنقل الملفات
حتى نسهل الموضوع سوف أضع الشفرة على أجزاء بخطوات
اولا نضع معلومات الخاصة بنص الإتصال (Connection String) في متغير نصي

string excelConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\xls\\ExcelFile.xls ;Extended Properties=Excel 8.0";

طبعا هذه المعلومات ثابتة ماعدا جزئية مسار ملف الاكسل يجب عليك تغيرها الى مسار ملفك
ثانيا قم بالإتصال بقاعدة البيانات عن طريق إستخدام (OleDbConnection) وقم بإرسال نص الإتصال إليه

using (OleDbConnection connection =
new OleDbConnection(excelConnectionString))
{

ثالثا قم بإنشاء كائن من نوع (OleDbCommand)   واكتب إستعلام الإختيار (Select Statment) وايضا حدد له كائن الإتصال كالتالي

OleDbCommand command = new OleDbCommand
("Select * FROM [Sheet1$]", connection);

لاحظ معي جملة الإتصال ولاحظ أن إسم الجدول هو إسم الورقة (Sheet) طبعا يمكنك تغيره من ملف إكسل ولاحظ أيظا أنك يجب أن تتبعها مباشرة وبدون فواصل رمز الدولار($)

رابعا قم بفتح الإتصال

connection.Open();

خامسا قم بتنفيذ الإستعلام  بإستخدام الدالة (ExecuteReader)

using (DbDataReader reader = command.ExecuteReader())
{

الأن فإن جميع البيانات الموجودة في ملف إكسل تم تصديرها وأصبحت موجودة في كائن من نوع (DbDataReader)
بعد أن قمنا بتصدير البيانات وإسنادها يأتي الان العمل على جزئية قواعد بيانات (SQL SERVER)
أولا نضع معلومات الخاصة بنص الإتصال (Connection String) في متغير نصي

string sqlConnectionString = "Data Source=Your DataSource;Initial Catalog=Your DataBase;Integrated Security=True";

لاحظ معي أنه يجب أن تكتب إسم مصدر البيانات ( DataSource) بعد ذلك إسم قاعدة البيانات (Initial Catalog)
ثانيا إستخدام كائن من نوع (SqlBulkCopy)  والغرض من ذلك أن هذا الكائن(object) يقوم بنقلة كتلة (Bulk) من البيانات من مصدر إلى مصدرأخر بطريقة فعالة جدا جدا خاصة إذا كان حجم البيانات كبير جدا ونقوم بارسال نص الإتصال إليه  كالتالي.

using (SqlBulkCopy bulkCopy =  new SqlBulkCopy(sqlConnectionString))
{

ثالثا نستخدم خاصية (DestinationTableName) والتي من خلالها نحدد إسم الجدول الذي نريد أن نصدر إليه البيانات في قاعدة بيانات (MS SQL SERVER)

bulkCopy.DestinationTableName = "Table Name";

رابعا واخير نقوم بإستخدام دالة (WriteToServer) والتي تقوم بكتابة البيانات الي المصدر ونرسل لها الكائن من نوع (DbDataReader)

bulkCopy.WriteToServer(dr);

الشفرة كاملة

bulkCopy.WriteToServer(reader);
// Connection String to Excel Workbook
string excelConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=! ;Extended Properties=Excel 8.0

// Create Connection to Excel Workbook
using (OleDbConnection connection =
new OleDbConnection(excelConnectionString))
{
OleDbCommand command = new OleDbCommand
("Select * FROM [Sheet1$]", connection);

connection.Open();

// Create DbDataReader to Data Worksheet
using (DbDataReader dr = command.ExecuteReader())
{
// SQL Server Connection String
string sqlConnectionString = "Data Source=!;Initial Catalog=!;Integrated Security=True";

// Bulk Copy to SQL Server
using (SqlBulkCopy bulkCopy =
new SqlBulkCopy(sqlConnectionString))
{
bulkCopy.DestinationTableName = "!";
bulkCopy.WriteToServer(dr);
}
}
}

لاحظ معي أن أي شيء وضعت عليه علامة (!) تحتاج إلى تغيره إذا أردت أن يتنفذ البرنامج في جهازك
الفائدة الحقيقة
قد يسئل البعض مالذي سوف أستفيده من توريد البيانات من ملف إكسل الى قواعد البيانات ولكي أجيبك عن هذا التساؤل سوف أضح لك حالات حقيقية ( Real Cases)

الحالة الأولى تحويل البيانات من قاعدة بيانات إلى قاعدة بيانات (SQL SERVER)
الأن تخيل لو أن لديك قاعدة بيانات (Oracle,Sybase,MySql..etc) وتريد أن تحول البيانات من قواعد البيانات السابقة الى قاعدة بيانات (SQL SERVER) بناء على قرارات إدارية ماذا سوف تفعل .
طبعا هنالك أدوات تحويل ومن هذه الأدوات (SQL Server Integration Services (SSIS ولكن في بعض الحالات وهي كثيرة جدا لايمكن نقل البيانات على الأقل كليا فقد تجد أن بعضها تم نقله والبعض الأخر لم يتم نقله.فأفضل حل في هذه الحالة هو أن تقوم بتصدير (Export) جميع البيانات إلى ملف ومن ملف إكسل تقوم بتوريدها (Import) إلى قواعد بيانات (SQL SERVER) طبعا معظم المحررات (Editors) الخاصة بقواعد البيانات مثل برنامج (Toad) وغيرها الكثير لديها إمكانية توريد إلى إكسل (Export to Excel).
الحالة الثانية

تخيل معي لو أنك في منظمة وأرادو منك بناء نظام له علاقة بقواعد البيانات ولايوجد لديهم قواعد بيانات بعد وكل البيانات لديهم يتم تخزينها في ملفات إكسل فطبعا سوف تستخدم هذه الطريقة بلاشك .
الخلاصة
في ماسبق تدارسنا سوية كيف يمكن تصدير البيانات الى قواعد بيانات (SQL SERVER) من ملفات إكسل ورأينا سوية القيم الحقيقة لهذا الأسلوب والحالات الحقيقة التي قد تواجهك وكيف يمكن حلها.وطبعا لاأنسى أن أقول لكم أن هنالك طرق أخرى لنقل البيانات مثل إستخدام جملة الإدخال (Insert Statment) ولكن أكثرها فعالية في الإداء هو نقل البيانات ككتلة بإستخدام (SQLBulk) وفي الختام أتمنى أن أكون قد وفقت في الطرح
والله أعلم

رابط التحميل :من هنا

 
5 Comments

Posted by on May 26, 2010 in ASP.NET

 

Tags: , , , ,