RSS

Category Archives: C#

Contain all articles in Arabic to help Arabic programmer to start programming with c#

How to connect to the Oracle database using Business Connectivity Services (BCS) in SharePoint 2010


In this Step by Step article I will show you how to connect to the oracle database using BCS.

Note: Before we start I will assume that you are already have running and working oracle database.

Prerequisites

Table Name: Orders

Column Name Type Primary Key
Order_ID Number (5) Yes
Order_Name Varchar 2 (50) No
  • Add oracle connection string in tnsnames.ora as following

Go to C: or D: –>App-> Your User Name->product->11.2.0->client_1->Network->Admin.

after going to Admin folder you will find to files (sqlnet.ora,tnsnames.ora)image

Note:if you did not find those files go to sample folder and copy both files and past it in Admin Folder.

  • Now open tnasnames.ora file and add connection string of your oracle DataBase similar to the following syntax

image

Creating a BCS External Content Type

1- Open Visual Studio and create new sharepoint 2010 project as following and select Deploy as a farm solution

image

image

2- After Creating project add new SharePoint Item (SPI) with type Business Data Connectivity Modelimage

3-Now Remove Entity1, Entity1.cs and Entity1Service.cs

image

image

4-Now add new Entity with Orders Name and add identifier with Order_ID name and type System.Int32

image

image

5- Create New class with Order Name

image

6- Open Order.cs and the following code

image

7- Add Oracle.DataAccess.dll reference from the following path

D:\app\yourusername\product\11.2.0\client_1\odp.net\bin\2.x

8- Now it’s time to Create Method for insert,update,delete,retrive.

9-Click on Order Entity on BDC Diagram and add the following Methods.

image

10- now the BDC will be looking to the following diagram

image

11- Now Go to BDC explorer to make sure the Orders identity have the correct Type descriptors for each method as following

image

Note: Make sure to set identifier property  for each Order_ID on each method to Order_ID identifier

image

Note:For Update Method you need to set Pre-Update Field prperty to True for Order_ID in parameter section.

image

12- Open Order.cs and write the following code .


public partial class OrdersService
{
static string connectionString = "Data Source=dotnetfinder;User ID=ahmed; Password=sharepoint";
public static Orders ReadItem(int order_ID)
{

Orders SelectedOrder=new Orders();;
using (OracleConnection connection = new OracleConnection(connectionString))
{
OracleCommand cmd = new OracleCommand("select * from orders where order_id=:order_id", connection);

connection.Open();
cmd.Parameters.Add(":order_id", order_ID);
OracleDataReader Reader = cmd.ExecuteReader();
while (Reader.Read())
{
SelectedOrder.Order_ID = Convert.ToInt32(Reader["Order_ID"]);
SelectedOrder.Order_Name = Reader["Order_Name"].ToString();
}
}
return SelectedOrder;
}

public static IEnumerable<Orders> ReadList()
{

List<Orders> OrderList = new List<Orders>();
using (OracleConnection connection = new OracleConnection(connectionString))
{
OracleCommand cmd = new OracleCommand("select * from orders", connection);
connection.Open();
OracleDataReader Reader = cmd.ExecuteReader();
while (Reader.Read())
{
Orders SelectedOrder = new Orders();
SelectedOrder.Order_ID = Convert.ToInt32(Reader["Order_ID"]);
SelectedOrder.Order_Name = Reader["Order_Name"].ToString();
OrderList.Add(SelectedOrder);
}
}
return OrderList;
}

public static Orders Create(Orders newOrders)
{

using (OracleConnection connection = new OracleConnection(connectionString))
{
OracleCommand cmd = new OracleCommand("insert into orders (order_id,order_name) values (:order_id,:order_name)", connection);
connection.Open();
cmd.Parameters.Add(":order_id", newOrders.Order_ID);
cmd.Parameters.Add(":order_name", newOrders.Order_Name);

cmd.ExecuteNonQuery();
}
return newOrders;
}

public static void Update(Orders orders, int parameter)
{

using (OracleConnection connection = new OracleConnection(connectionString))
{

OracleCommand cmd = new OracleCommand(string.Format("update orders set order_name=:order_name where order_id={0}",parameter), connection);
connection.Open();

cmd.Parameters.Add(":order_name", orders.Order_Name);

cmd.ExecuteNonQuery();
}
}
}

13-Deploy your solution Now and create New External List and pick up our external content type that we have created in this article

Configure Business Data Connectivity access rights:

1. Go to Central Administration -> Application Management -> Manage Service Applications.

17

2. Click on Business Data Connectivity Service.

3. In the top Ribbon click on Manage.
4. In Service Application Information check the External Content Type Orders

5. In the top Ribbon click the Site Object Permissions.

6. Site Object Permissions wizard will pop up add the account (Group or Users) and assign the permissions.

Creating an External List in the SharePoint Site:

1. Open the SharePoint Site.

2. Go to Site Actions => More Options.
3. On the Create Wizard, from the Installed Templates Select List.

4. In the List Type select External List and click Create.

5. Enter the Name as BCS for OracleDB and choose the External Content Type as shown below.

image

6-Now you can find the external list with data populated from Oracle Database

image

Try now to Create,Update,Delete and Retrieve items and Every Thing should work fine Open-mouthed smile

You can download Source Code from here

 
1 Comment

Posted by on August 27, 2012 in C#, SharePoint, VB.NET

 

Tags: , , , , , , , ,

Import data from Excel to SQL Server


in this article I’m going to show you how to import data from Excel to SQL Server in few steps but first take a look to import/export screen

image

As you can see the screen is so simple it’s have three controls

  • FileUpload control to help you to find the location of your Excel file.
  • Button to import data from Excel and save it in SQL Server.
  • Label control which is just message to tell of operation result(Success or Fail)

Steps to make application run successfully

Note: before start reading the steps I want let you to know that I haven’t test this sample either on ASP.NET 3.5 or 32-bit MS Office,so may be you do not need the step 1 and step 2.

  1. Create an IIS web site
  2. Change .Net Framework to 4.0 for Application Pool of this site
  3. Create Excel file and make sure that file contain the column name as following image

image

4.Create Table in SQL Server and make sure has the same Columns name with appropriate columns data type.

image

The following code snippet will show you how upload file in import data from it and save it to SQL Server.

In C#

// if you have Excel 2007 uncomment this line of code
//  string excelConnectionString =string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0",path);

string ExcelContentType = "application/vnd.ms-excel";
string Excel2010ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
if (FileUpload1.HasFile)
{
//Check the Content Type of the file
if(FileUpload1.PostedFile.ContentType==ExcelContentType || FileUpload1.PostedFile.ContentType==Excel2010ContentType)
{
try
{
//Save file path
string path = string.Concat(Server.MapPath("~/TempFiles/"), FileUpload1.FileName);
//Save File as Temp then you can delete it if you want
FileUpload1.SaveAs(path);
//string path = @"C:\Users\Johnney\Desktop\ExcelData.xls";
//For Office Excel 2010  please take a look to the followng link  http://social.msdn.microsoft.com/Forums/en-US/exceldev/thread/0f03c2de-3ee2-475f-b6a2-f4efb97de302/#ae1e6748-297d-4c6e-8f1e-8108f438e62e
string excelConnectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 8.0", path);

// 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=.\sqlexpress;Initial Catalog=ExcelDB;Integrated Security=True";

// Bulk Copy to SQL Server
using (SqlBulkCopy bulkCopy =
new SqlBulkCopy(sqlConnectionString))
{
bulkCopy.DestinationTableName = "Employee";
bulkCopy.WriteToServer(dr);
Label1.Text = "The data has been exported succefuly from Excel to SQL";
}
}
}
}

catch (Exception ex)
{
Label1.Text = ex.Message;
}
}
}

in VB.NET

'if you have Excel 2007 uncomment this line of code
'  string excelConnectionString =string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0",path);
'Define the content type
Dim ExcelContentType As String = "application/vnd.ms-excel"
Dim Excel2010ContentType As String = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
If FileUpload1.HasFile Then
If FileUpload1.PostedFile.ContentType = ExcelContentType Or FileUpload1.PostedFile.ContentType = Excel2010ContentType Then
Try
'Save file path
Dim path As String = String.Concat(Server.MapPath("~/TempFiles/"), FileUpload1.FileName)
'Save File as Temp then you can delete it if you want
FileUpload1.SaveAs(path)
'For Office Excel 2010  please take a look to the followng link  http://social.msdn.microsoft.com/Forums/en-US/exceldev/thread/0f03c2de-3ee2-475f-b6a2-f4efb97de302/#ae1e6748-297d-4c6e-8f1e-8108f438e62e
Dim excelConnectionString As String = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 8.0", path)

' Create Connection to Excel Workbook
Using connection As New OleDbConnection(excelConnectionString)

Dim Command As OleDbCommand = New OleDbCommand("Select * FROM [Sheet1$]", connection)

connection.Open()

'Create DbDataReader to Data Worksheet
Using reader As DbDataReader = Command.ExecuteReader()

' SQL Server Connection String
Dim sqlConnectionString As String = "Data Source=.\sqlexpress;Initial Catalog=ExcelDB;Integrated Security=True"

' Bulk Copy to SQL Server
Using bulkCopy As New SqlBulkCopy(sqlConnectionString)

bulkCopy.DestinationTableName = "Employee"
bulkCopy.WriteToServer(reader)
Label1.Text = "The data has been exported succefuly from Excel to SQL"
End Using
End Using
End Using
Catch ex As Exception
Label1.Text = ex.Message
End Try
End If
End If

Run and test Application

after following the above steps you can run web and click on the browse then select Excel file then click import to save Excel file data on SQL Server side.

Download the sample

You can download code from the following link ( Please do not forget to rate it)

http://code.msdn.microsoft.com/Imoprt-Data-from-Excel-to-705ecfcd

References

I hope you find this sample useful and i will be happy to answer your questions.

Regards.

 
1 Comment

Posted by on March 20, 2012 in ASP.NET, C#, VB.NET

 

Tags: , , , ,

Infinite Scroll images Like Bing and Google


Introduction

One of the must annoying thing when working with large data is how to loading this data to your page?

The common solution is paging but paging itself will not help too much you can end with hundred or thousands of page numbers.So new solution now is on the surface and it’s called “Infinite Scroll”.Infinite Scroll allow you to load chunk of data when you scroll down of the page and inject it inside the page, it will load data each time you scrolling down on the page.

Note:Before you start you can download code from here ( Please do not forget to rate it)

Infinite Scroll images Like Bing and Google

Demo

(Click on the image to see the result)

IScroll

Description

As I told you in the introduction Infinite Scroll is becoming more and more popular it’s in everywhere starting with Bing,Google,Facebook,Twitter,Linkedin.etc.

The idea of infinite scrolling is so simple and it can be summarized in the following diagram which is part of Scott Hanselmen Article

Infinite Scroll WebSites via AutoPagerize – Hacky, but the beginning of something cool

My Sample will show you how to Display a list of images like Bing and Google but this is not the only thing,you can take the advantage of idea behind infinite scrolling and implement the same concept everywhere.

The following code snippet will be called when you scroll to the last of the page

[WebMethod]
public static string LoadImages(int Skip, int Take)
{
System.Threading.Thread.Sleep(2000);
StringBuilder GetImages = new StringBuilder();
string Imagespath = HttpContext.Current.Server.MapPath("~/Images/");
string SitePath = HttpContext.Current.Server.MapPath("~");
var Files = (from file in Directory.GetFiles(Imagespath) select new { image = file.Replace(SitePath, "") }).Skip(Skip).Take(Take);
foreach (var file in Files)
{
var imageSrc = file.image.Replace("\\","/").Substring(1); //Remove First '/' from image path
GetImages.AppendFormat("<a>");
GetImages.AppendFormat("<li>");
GetImages.AppendFormat(string.Format("<img src='{0}'>", imageSrc));
GetImages.AppendFormat("</li>");
GetImages.AppendFormat("</a>");

}
return GetImages.ToString();
}

VB.Net part

<WebMethod()> _
Public Shared Function LoadImages(Skip As Integer, Take As Integer) As String
System.Threading.Thread.Sleep(2000)
Dim GetImages As New StringBuilder()
Dim Imagespath As String = HttpContext.Current.Server.MapPath("~/Images/")
Dim SitePath As String = HttpContext.Current.Server.MapPath("~")
Dim Files = (From file In Directory.GetFiles(Imagespath) Select New With { _
Key .image = file.Replace(SitePath, "") _
}).Skip(Skip).Take(Take)
For Each file As Object In Files

Dim imageSrc = file.image.Replace("\", "/").Substring(1) 'Remove First '/' from image path
GetImages.AppendFormat("<a>")
GetImages.AppendFormat("<li>")
GetImages.AppendFormat(String.Format("<img src='{0}'/>", imageSrc))
GetImages.AppendFormat("</li>")
GetImages.AppendFormat("</a>")
Next
Return GetImages.ToString()
End Function

JavaScript part

$(document).ready(function () {
var Skip = 49; //Number of skipped row
var Take = 14; //
function Load(Skip, Take) {
$('#divPostsLoader').html('&lt;img src="ProgressBar/ajax-loader.gif"&gt;');

//send a query to server side to present new content
$.ajax({
type: "POST",
url: "Grid.aspx/LoadImages",
data: "{ Skip:" + Skip + ", Take:" + Take + " }",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {

if (data != "") {
$('.thumb').append(data.d);
}
$('#divPostsLoader').empty();
}

})
};
//Larger thumbnail preview

//When scroll down, the scroller is at the bottom and fire the Load ()function
$(window).scroll(function () {

if ($(window).scrollTop() == $(document).height() - $(window).height()) {
Load(Skip, Take);

//Any number you want
Skip = Skip + 14;
}
});
})

Summery :

Infinite scroll is every where now ,this sample show give good starting point.It’s not only loading images you can load any thing you want start from images,text data and even load pages inside the page.

I hopefully you like the sample and really appreciate your comments and feedback
.

Regards.

 
2 Comments

Posted by on February 26, 2012 in ASP.NET, C#, jquery, VB.NET

 

Tags: , , , , , , , , ,

المميزات الجديدة في لغة Covariance and Contravariance – C# 4.0


بسم  الله الرحمن الرحيم

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

أولا : نطاق عمل Covariance & Contravariance

ماقصده بالنطاق هنا هو المكان التي يتم فيه تطبيق مبدء Covariance & Contravariance وهو كالتالي

•    Generic Delegates & InterFaces

•    Reference Types

ثانيا : تعريف Covariance & Contravariance
Covariance
المقصود بمصطلح (Covariance) هو إرجاع أنواع أكثر إشتقاقا ( Derived Classes) من الدالة (Method ) التي قيمتها المرجعة عبارة عن نوع أقل إشتقاقا وهذا النوع يسبقه الكلمة المعرفة ( Out).ويجب ان تعلم أنه فقط يستخدم مع القيم المرجعة فقط ( Return Types) من الدالة التي تم إستدعائها
Contravariance
المقصود بمصطلح (Contravariance) هو إرسال قيمة أقل إشتقاقا ( Base Classes) إلى دالة ( Method) تأخذ قيم أو تقبل حقول أكثر إشتقاقا ( Derived Classes) وهذا النوع يسبقه الكلمة  المعرفة (In). ويجب أن تعلم أنه فقط يستخدم كإرسال قيم الى الدالة وليس لإسترجاع قيم منها .
قد يبدو الوضع معقدا بعض الشيء ولكن الموضوع كله يتعلق بمباديء الوراثة المتعارفة لدى الجميع ومع الشرح أكثر وإعطاء امثلة سوف نفهم جميعا إن شاء الله مالمقصود  بالمصطلحين السابقين.

ثالثا كيف يمكن أستخدام Covariance & Contravariance
أولا مع Generic Delegates
لنأخذ أحد انواع المفوضات (Delegate ) الموجودة في أطار عمل دوت نت ( .Net FrameWork) وهو المفوض (Func<>) أنظر الى الصورة التالية قبل أن نبدء

كما ترى فإن هذا المفوض (Delegate) يقبل أنواع أقل أشتقاقا في الحقل الأول ويقوم بإرجاع أنواع أكثر إشتقاقا في الحقل الثاني .
لنأخذ مثلا حتى تتضح لنا الصورة

class Program
{
static void Main(string[] args)
{
Func<object,ArgumentException> fn1 = null;

Func<string, Exception> fn2 = null;
fn2 = fn1; //Covariance and Contravariance
}

}

كما ترى في المثال السابق  قمنا بتعريف مفوض من نوع (Func) لديه الإسم (fn1) يقبل حقل من نوع (object) ويعيد قيمة من نوع (ArgumentException) بعد ذلك قمنا بتعريف مفوض أخر من (Func) لديه الأسم (Fn2) يقبل حقل من نوع (string) ويعيد قيمة من نوع (Exception) بعد ذلك قمنا بإسناد (fn1) إلى (fn2) وكما تلاحظ فإن الحقل الأول من (fn1) هو منوع (object) وهو أقل إشتقاقا من (string) وأن الحقل الثاني هو من نوع (ArgumentException) وهو أكثر إشتقاقا من (Exception)

ثانيا مع Generic Interface
طبعا Generic interface تأخذ نفس مفهوم المفوضات (Delegates) حيث بإمكانك أن تعود بقيم أكثر إشتقاقا وترسل قيم أقل إشتقاقا
أنظر الى المثال التالي

public IEnumerable<Exception> GetAllException()
{
IEnumerable<ArgumentException> c=null;
return c;
}

كماترى من المثال السابق فإن القيمة التي سيتم إرجاعها من الدالة (GetAllException) هي من نوع (IEnumerable<Exception>) ولكن في الحقيقة مايتم إرجاعه من الدالة هو من نوع (IEnumerable<ArgumentException>) وهو نوع أكثر إشتقاقا من النوع الذي من المفترض أن يعيده أنظر معي الى الصورة التالية التي سوف توضح لك كل شيء إن شاء الله

كما ترى في الاعلى لدينا فصيلة (Class) من نوع عربة وفصيلة أخرى مشتقة من نوع عربة وهي سيارة (Cars) وفصيلة أخرى مشتقة من فصيلة سيارة وهي من نوع سيارة رياضية (Sport Cars) وكما ترى فكما نزلت الى الاسفل فهذا يعتبر اكثر إشتقاقا وكلما صعدت الى الاعلى فهذا يعتبر أقل إشتقاقا وهذا هو مبدء Covariance & Contravariance

الخلاصة
قمت في هذا الدرس بشرح مفهوم Covariance & Contravariance وكيف يمكن إستخدامه والنطاق الذي يستخدم فيه وحقيقة الأمر ان إطار عمل دوت نت (.Net FrameWork) يدعم هذه الميزة في جميع مفوضاته (Generics Delegate) وجميع واجهاته ( Genrics interface) وبإمكانك أيضا أن تستخدمها في الاكواد التي تكتبها والتي تتعامل بوجه التحديد مع (Generics) وبهذا الدرس أنهي سلسلة الدروس التي قدمتها عن المميزات الجديدة في لغة (C#4.0)
أتمنى أن أكون قد وفقت في الطرح
والله أعلم

 
1 Comment

Posted by on May 19, 2010 in C#

 

Tags: , , , , , , ,

المميزات الجديدة في لغة Optional Parameters and Named Arguments – C# 4.0


أولا : الحقول الإختيارية (Optional Parameters)

تعتبر ميزة البراميترات الاختيارية او ( Optional Parameters) غير جديدة على مبرمجي الفيجوال بيسك حيث تعطيك هذه الميزة حرية الاختيار بين أرسال قيمة الى البراميترات او عدم إرسال قيمة وبذلك يتم أخذ القيمة الافتراضية التي تم تحديدها مسبقا عند إنشاء الدالة (Method) لن أطيل عليكم سوف أبدء مباشرة باعطاء أمثلة عنها
كيف يمكن إنشاء براميترات إختيارية (Optional Parameter)
يتم إنشاء الحقول او البراميترات الإختيارية كما هو موضح في الشكل التالي

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

كما ترى فإن البراميترات أو الحقول الإختيارية يتم وضعها بين علامتي [] وذلك لدلالة على أنها حقول إختيارية .

المثال كامل

class Program
{
static void Main(string[] args)
{
Add(10);
Add(10, 5);
Add(10,5,5);
}
static void Add(int A, int B = 0,int C=1)
{
Console.WriteLine("The Value Of A={0},B={1},C{2}", A, B,C);
}

ثانيا : الحقول ذات الاسماء المعلنة (Named Arguments)

في الحقيقة أرهقني مصطلح (Named Arguments)    من ناحية التعريب ولذلك أطلقت عليه إسم الحقول ذات الأسماء المعلنة. والغرض منها يكمن في إمكانية إعلان إسم الحقل الإختياري وتحديد قيمته بغض النظر عن موقعه في الدالة.
في الشفرة السابقة يوجد هنالك حقلان إختياريان الأول إسمه (B)  والثاني إسمه (C)  والان لنفترض اني اريد ان أرسل قيمة (C) فقط بدون إرسال قيمة (B) هل هذا ممكن ؟
طبعا هذا ممكن مع (Named Arguments) إنظر الى الشكل التالي

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

وكما هو موضح في الاعلي فإن موقع الحقل لايهم في حالة ( Named Arguments)
الان تخيل معي ان لديك دالة (Method) يوجد بها أكثر من حقل إختياري ولنقل على سبيل المثال عشرة حقول إختيارية وأنك في بعض الأجزاء من الكود تريد أن ترسل قيمة الحقل  الاخير فقط او انك تريد إرسال قيمة حقلين فقط من العشرة وهكذا ؟؟؟
طبعا بدون وجود ميزة (Named Arguments) فسوف تظطر الى كتابة جميع الحقول ولكن من حسن حظنا فان هذه الميزة موجودة في لغة السي شارب (C#).

قواعد يجب أن تتبع

•    يجب أن تكتب الحقول الإختيارية بعد الحقول الأجبارية (Required Parameters) والعكس غير مقبول والا فإن المترجم سوف يظهر رسالة خطأ تخبرك بان الحقول الإختيارية يجب ان تظهر بعد الحقول الإجبارية.
•    لاتقم أبدا أبدا بتغير أسماء الحقول الإختيارية بعد إستدعائك لهذه الدالة عند إستخدام (Named Arguments ) والسبب في ذلك أن المترجم سوف يظهر رسالة خطأ مفادها بأن إسم الحقل غير موجود وتخيل معي المعاناة لو أنك قمت بإستدعاء هذه الدالة في أمكان كثيرة  من برنامجك لأنك سوف تطظر الىتغيره في كل مكان إستدعاء.


•    لايمكن إستخدام (Named Arguments) الى إذا كان هنالك ( Optional Parameters)

نقطة اخيرة

قد يسئل البعض ويقول لقد ذكرت في هذا الموضوع كلمة ( Parameters) بعد ذلك قمت بذكر كلمة (Arguments) إذا مالفرق بينهما
جواب هذا السؤال في الصورة التي بالأسفل


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

 
1 Comment

Posted by on May 10, 2010 in C#

 

Tags: , , ,

المميزات الجديدة في لغة dynamic keyword – C# 4.0 الجزء الثاني


بسم الله الرحمن الرحيم

سوف اكمل في هذه المقالة الحديث عن (dynamic Keyword) والتي قمت بتعريفها سابقا في الجزء الاول فلنبدء على بركة الله بشرح القيمة الحقيقة وراء هذه الاضافة الجديدة .

لنفرض مثلا ان لديك دالة (Method) إسمها GetCalculatorهذه الدالة تقوم بارجاع فصيلة (Class) من نوع  حاسبة (Calculator) تحتوي على دالة إسمها (Add) هذه الدالة تقوم بارجاع الناتج من جمع رقمين كالتالي

Calculator calc = GetCalculator();
int sum = calc.Add(10, 20);

طبعا المثال السابق بسيط جدا ولكن لنفترض الان ان الدالة (GetCalculator) تقوم بارجاع نوع غير معروف بالنسبة اليك او ان المترجم (Compiler) لايستطيع التعرف على النوع الحقيقي فمالذي يمكن فعله في هذه الحالة ؟

طبعا الجواب بسيط وهو باستخدام دوال الانعكاس (Reflections) كما هو موضح في

المثال التالي

object calc = GetCalculator();
Type calcType = calc.GetType();
object res = calcType.InvokeMember("Add", BindingFlags.InvokeMethod, null,calc, new object[] { 10, 20 });
int sum = Convert.ToInt32(res);

ملاحظة: هذه الاشياء تواجهك اذا كانت تتعامل مع مكتبات (COM).

من المثال السابق يتضح لنا مدى صعوبة التعامل مع دوال الانعكاس وصعوبة قراءة الشفرات المكتوبة.

الكلام جميل ولكن ماعلاقة كل ماسبق ذكره بكلمة ديناميك (dynamic keyword)

حسنا انظر معي الى المثال التالي وكيف يمكن إعادة ماكتبناه في السابق مرة أخرى باستخدام (dynamic keyword)

dynamic calc = GetCalculator();
int sum = calc.Add(10, 20);

كما ترى في المثال السابق قمنا بنفس العمل الذي قمنا به باستخدام دوال الانعكاس

ولكن هذه المرة باستخدام (dynamic keyword) وكما ترى فانها تشبه لحد كبير المثال الاول ولكن الفرق اننا قمنا فط بوضع كلمة (dynamic) كنوع للمتغير.

كما هو موضح في الاعلى فإن التعرف على العملية سوف يتم وقت التنفيذ (Runtime)

اتمنى مما قدمته حتى الان ان تكون الصورة واضحة اليك .تخيل معي الان أنك تريد انشاء فصيلة (Class) وتريد إضافة حقول اليها ولكن وقت التنفيذ ؟؟؟

طبعا يمكنك فعل ذلك الان وبكل بساطة إنظر الى المثال التالي

dynamic contact = new ExpandoObject();
contact.Name = "Ahmed Naji";
contact.WebSite="www.dotnetfinder.wordpress.com";
Salary=1000;
Console.WritLine(contact.Name);
Console.WriteLine(contact.WebSite);

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

والان سوف اتحدث عن جانب اخر مهم جدا جدا .لنفترض ان لدينا شفرة (Code) مكتوب بلغة من اللغات الديناميكة وأن هذه اللغة هي (IronPython) كما هو موضح بالأسفل

واننا نريد ان نستدعى الدالة (function) الموجودة في كود (IronPython) من خلال لغة سي شارب .هل هذا ممكن؟

والاجابة ايضا بسيطة وهي باستخدام (dynamic keyword) إنظر الى المثال التالي

مدهش بلا شك لقد قمنا بتنفيذ كود مكتوب بلفة (IronPython) داخل لغة سي شارب بكل يسر وسهولة .والان سوف ياتي سؤال مهم جدا كيف تم تنفيذ شفرة مكتوبة بلغة (IronPython) داخل شفرة مكتوبة بلغة سي شارب ؟؟؟

لكي إجيبكم على هذا السؤال أنظروا الى الصورة  بالاسفل.

كما ترى في المثال السابق فان اللغات مسبقة التعريف (Statically_Typed) تتخاطب مباشرة مع لغة التنفيذ المشتركة (CLR) ولكن الحال مختلف مع اللغات الديناميكية مثل (IronPython) فيوجد هنالك لغة التنفيذ الديناميكية (DLR) والتي تقوم بدورها بالتخاطب مع (CLR) ونفس الشيء ينطبق عندما تقوم بتنفيذ شفرات مكتوب بلغات ديناميكية داخل لغة سي شارب .

وكما ترى مماسبق فان لغة التنفيذ الديناميكية(DLR) تلعب هنا دور الوسيط بين لغة التنفيذ المشتركة (CLR) وبين اللغات الديناميكة من جهة وبين لغة السي شارب واللغات الديناميكية من جهة أخرى.

طبعا هنالك حالات اخرى فيمكن ان تقوم بتنفيذ ملف مكتوب بلغة الجافا سكريبت (JavaScript) داخل تطبيقات سيلفر لايت (Silverlight).

الرؤية التي تطمح اليه مايكروسوفت

قد يسئل البعض مالغرض الاساسي والرؤية التي تريدها شركة مايكروسوفت .

اولا قابلية التعدد

فيمكن ان يكون في المشروع الواحد مبرمجين بلغة السي شارب ومبرمجين بلغة (IronPython) ومبرمجين جافا سكريبت (JavaScript)

ثانيا جذب أنظار المبرمجين والمطورين من لغات مختلفة نحو منصة عمل دوت نت (.Net Framework) واستخدام المنتجات المختلفة مثل (Visual Studio)

ثالثا السهولة في التعامل مع مكتبات (Com) وخاصة المتعلقة بتطبيقات أوفيس

س/ هل معنى هذا الكلام ان لغة سي شارب سوف تصبح لغة ديناميكية؟؟؟

طبعا لا فالغة سي شارب لغة مسبقة التعاريف ولكن ان تسلك سلوك اللغات الديناميكية فهذا من أجل تسهيل العمليات ولجعل الامور اسهل فكما راينا الفرق الواضح عند استخدام دوال الانعكاس وعند استخدام (dynamic keyword).وايضا سهولة تنفيذ شفرات اخرى من لغات ديناميكية داخل لغة سي شارب.

الخلاصة

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

والله أعلم

 
Leave a comment

Posted by on May 1, 2010 in C#

 

المميزات الجديدة في لغة dynamic keyword – C# 4.0 الجزء الاول


بسم الله الرحمن الرحيم

سوف اتحدث في هذا الموضوع عن الميزة والإضافة  الجديدة القادمة مع لغة C# 4.0  وهي Dynamic keyword ولكن قبل ان ابدأ في شرح الوظيفة التي تقدمها هذه الكلمة يجب عليك معرفة ان لغات البرمجة نوعان

  • لغات ديناميكية (dynamic programming language) مثل ( Python ,Ruby, JavaScript)

في هذا النوع من اللغات يمكن كتابة المتغيرات بدون  الحاجة الى تعريف نوع المتغير هل هو متغير رقمي نصي او كائن ما والسبب في ذلك ان ربط المتغير بنوعه يتم وقت التنفيذ (Runtime ) لنأخذ مثال مكتوب بلغة (IronPython) كما هو موضح في  الصورة التالية

كما ترى في المثال السابق قمت بتعريف متغير اسمه (i) بدون ان اعرف نوعه هل متغير رقمي (int) نصي (string) او أي من الانواع الأخرى وقمت بإسناد عدد له (1+1) وطباعة هذا الرقم .بعد ذلك قمت بإسناد قيمة نصية (“a”+”b”) وايضا بدون ان اقوم بتعريف نوع المتغير وتمت طباعة النص .

  • لغات ذات انواع  ثابتة (Statically-Typed programming language) مثل (C++,C# ,Java , Vb)

في هذا النوع من اللغات مثل لغة (#C) من غير الممكن ان تقوم بتعريف متغير بدون ان تعرف نوع (Type) هذا المتغير هل هو رقمي او نصي او احد من الانواع الاخرى كما هو موضح في الصورة التالية

كما ترى في المثال السابق يجب تعريف نوع المتغير لان المترجم (Compiler)في هذه الحالة سوف يقوم بإصدار خطاء وهو ان الاسم (i) غير موجود ولايمكن التعرف عليه لذلك يجب ان تحدد نوع هذا المتغير وهو في الحالة السابقة من نوع  (int) كما هو موضح في الصورة التالية

طبعا ترى من المثال السابق انه يجب تحديد نوع المتغير وليس فقط نوع المتغير بل يجب ان يكون النوع صحيح فلا يقبل المترجم (Compiler) ان تقوم باسناد قيمة عددية الى متغير من نوع نصي


يتضح لنا من الامثلة السابقة الخاصة باللغات المسبقة التعريف الاهمية الحقيقة لهذه اللغات حيث انها اسرع (لان الانواع تم تعريفها مسبقا ولا حاجة لمعرفة النوع اثناء التنفيذ(Runtime) مما يستلزم وقتا اطول ) وايضا ان معظم الاخطاء التي يقوم بها المبرمج يتم إكتشافها مبكرا من قبل المترجم مثل الاسناد الخاطيء وغيرها من الاخطاء الشائعة التي قد يقع فيها المبرمج على عكس اللغات الديناميكية ولهذا السبب تعتبر لغة (#C) من الانواع الامنة (type safety).

لقد أردت في الأسطر القليلة الماضية أن أمهد لكم الطريق لكي  أطرح عليكم السؤال التالي

هل يمكن للغة مسبقة التعريف مثل لغة (#C) أن تكون لغة ديناميكية

الاجابة ببساطة نعم مع الكلمة الجديدة التي تقدمها لغة (#C) وهي (dynamic)  انظر الى المثال التالي ولاحظ معي كيف يمكن ان تكون لغة (#C ) لغة ديناميكية



حسنا سوف اقوم بشرح ماحدث بالاعلى كالتالي

  1. قمنا بتعريف متغير اسمه (arg) من نوع (dynamic)
  2. قمنا بتعريف متغير اخر  اسمه (result) من نوع (dynamic)
  3. قمنا باسناد رقم 5 الى المتغير (arg)
  4. قمنا بارسال المتغير الى الدالة (method) اسمها (Plus) تقوم بعملية جمع بعد ذلك ارجاع القيمة واسنادها الى المتغير (result)
  5. قمنا بارسال النتيجة الى الدالة (M)

حسنا حسنا تمهل قليلا هنالك نوعان من الدالة (M)  النوع الاول يقبل باراميتر (parameter ) من نوع رقمي(int) والاخر من نوع نصي (string)  فكيف سوف يتم التعرف على أي من هاتين الدالتين سوف يتم ارسال المتغير(result) .

سؤال جميل جدا والان انظر الى الصور  التالية التي تحتوي على نتيجة البرنامج الذي قمنا بكتابته بالاعلى


مذهل صحيح لقد قام البرنامج باختيار الدوال المناسبة وطبع النتيجة بناء على محتوى المتغير (arg) في المرة الاولى كان رقم وفي المرة الثانية اصبح نص.

يرجع السبب في ذلك انه عند وقت التنفيذ (runtime ) سوف يتم التعرف على النوع الحقيقي (Actual Type) وربطه (Bind)  بالمتغير (arg)  الذي تم ارساله وتحديد نوع المتغير هل هو رقم ام نص وبعد ذلك يتم اختيار الدالة الصحيحة وطباعة محتوى المتغير .

وهنا مثال أخر يقوم بجمع قيمة رقمية أو عديدية مع قيمة نصية ثم يقوم بعد ذلك بطباعة محتوى المتغير

الخلاصة

قمت في هذه المقالة بالتعريف بين اللغات الديناميكية (dynamic language) واللغات المسبقة التعريف( statically typed) وكان غرضي من هذا التعريف ان أوضح لك الصورة وهو ان لغة (#C) في إصدارها الجديد (4.0) أصبح بإمكانها ان تسلك سلوك اللغات الديناميكية فقط كل ماعليك فعله هو تعريف المتغير مسبوق بكلمة (dynamic)

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

وفي النهاية اتمنى ان اكون قد وفقت في الطرح

والله أعلم

 
2 Comments

Posted by on April 12, 2010 in C#