• مشکی
  • سفید
  • سبز
  • آبی
  • قرمز
  • نارنجی
  • بنفش
  • طلایی
انجمن ها > انجمن کامپیوتر > صفحه اول بحث
لطفا در سایت شناسائی شوید!
کامپیوتر (بازدید: 8844)
يکشنبه 9/3/1389 - 22:31 -0 تشکر 202954
برنامه نویسى و برنامه سازى

این تاپیك رو اصلاح مى كنم تا هر دوستى سوالى و یا مطلبى در مورد برنامه سازى با زبانهاى مختلف داشته باشد در این جا ثبت كند

سه شنبه 11/3/1389 - 16:32 - 0 تشکر 203308

ایجاد حالت برگشت برای DataReader

در این روش ما موقعیت فعلی DataReader را ذخیره می كنیم و برای برگشت به ركورد قبلی از ابتدا تا یكی مانده به ركورد فعلی ركوردها را پیمایش می كنیم و در پایان آخرین ركورد پیمایش را به كاربر نشان می دهیم برای این كار به صورت زیر متغیرهایی عمومی تعریف می نماییم:

Dim Index as Integer
Dim IndexTemp as Integer
Dim Dr as OleDb.OleDbDataReader

منظور از متغیر عمومی در عبارت بالا متغیری در محدوده یك فرم یا یك كلاس و... كه DataReader در آن استفاده می شود می باشد. سپس سه تابع یا سابروتین (بسته به نحوه استفاده) تعریف می نماییم:

Private Sub GetData()
Dim Cmd as New OleDb.OleDbCommand("Select ID From TblSample")
Dr=Cmd.ExecuteReader
Index=0
End Sub

سابروتین بالا برای خواندن ركورد از یك جدول فرضی می باشد.

Private Sub Next ()
Dr.Read
Index+=1
IndexTemp=Index
ShowData ()
End Sub

سابروتین بالا برای حركت به ركورد بعدی می باشد.

Private Sub Back()
Dim I as Integer
Me.GetData()
For I=0 To IndexTemp-2
Dr.Read
Next
Index=I
IndexTemp=Index
ShowData ()
End Sub

سابروتین بالا برای حركت به ركورد قبلی می باشد. لازم به ذكر است كه كدهای بالا به صورت شبه كد می باشند و هدف فقط نشان دادن نحوه انجام كار می باشد. شاید برخی دوستان با دیدن این مقاله به این فكر بیفتند كه به جای این كار میتوان از DataSetاستفاده كرد كه لزومی به این همه دردسر ندارد ولی بر حسب تجربه اعلام می كنم كه در برخی مواقع مجبور به استفاده از DataReader خواهید شد، برای نمونه در یكی از برنامه هایی كه برای یكی از موسسات نوشته بودم قسمتی وجود داشت كه تصاویر مربوط به قسمتهای مختلف موسسه را در بانك ذخیره می كرد و در موقع لزوم تصاویر مورد نظر با توجه به نام قسمت مربوطه فرخوانی می شدند برای این كار اگر از DataSet استفاده شود به دلیل اینكه DataSet ركوردها را در حافظه نگهداری می كند و با توجه به حجم بالای حافظه مورد نیاز برای نگهداری تصویر با بالا رفتن ركوردها حافظه بلافاصله پر می شود، ولی DataReader تك ركورد را در حافظه نگهداری می كند و با توجه به مدیریت حافظه خودكار در .Net با حركت در بین تصاویر حافظه تخصیص داده شده به تصویر قبلی بازپس گرفته می شود.

سه شنبه 11/3/1389 - 16:35 - 0 تشکر 203311

فرم Login

فرم ورودی شامل کنترلهای زیر است:

BtnCancel TxtUserName TxtPassword BtnSubmit

زیربرنامه ای بنام check تعریف می کنیم:

Public Sub check()
Dim strConn As String = "server=localhost;uid=;pwd=;database=mydb;"

پس از گرفتن Connection به تعریف SqlCommand و DataReader می پردازیم:

Dim MyConn As New System.Data.SqlClient.SqlConnection(strConn)
Dim objDR As System.Data.SqlClient.SqlDataReader

حال متغیری از نوع رشته ای را برای انتخاب فیلدهای جدولمان تعریف می کنیم:

Dim MySQL As String = "Select username, password from login Where username = "" & TxtUserName.Text & "" and password = "" & TxtPassword.Text & """
Dim Cmd As New System.Data.SqlClient.SqlCommand(MySQL, MyConn)
MyConn.Open()
objDR = Cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection)

سپس DataReader بر اساس cmd تعریف شده Excute می شود حال باید بررسی کنیم که همچنین کاربری در جدول login وجود دارد یا نه؟ اگر کاربری با مشخصات ارسالی وجود نداشته باشد پیغامی به کاربر مبنی بر نادرست بودن اطلاعات ورودی داده می شود:

If Not objDR.Read() Then
    Response.Write("")
    Response.End()
    TxtUserName.Text = ""
    TxtPassword..Text = ""
    objDR.Close()
    MyConn.Close()
Else
    Session("password") = objDR("password")
    Response.Redirect ("IndexAdmin.aspx")

در غیر این صورت به صفحه مربوطه انتقال داده می شود و در آخر objdr و MyConn را close می کنیم. لازم به ذکر است که در صفحه ارجاعی در قسمت Page_Load دستور زیر که نشان دهنده کلمه عبور صحیح است نوشته شود:

If Session("password") = "" Then
    Response.Write("")
    Response.End()
    Response.Redirect("loginadmin.aspx")
End If

سه شنبه 11/3/1389 - 16:38 - 0 تشکر 203313

کار با داده ها با استفاده از DataView

یکی از اعمال مورد نیاز در کار با داده های یک بانک اطلاعاتی جستجو، مرتب سازی و فیلتر کردن داده ها بر حسب نیازمندیهای برنامه کاربردی می باشد.

در ADO.NET برای انجام این اعمال روی داده ها در یک DataTable دو روش وجود دارد: یکی استفاده از متد Select از شی DataTable و دیگری استفاده از شئ DataView.

شئ DataView دارای توانایی بیشتری نسبت به متد Select از شئ DataTable می باشد و کار با آن نیز ساده تر است.در این مقاله سعی شده به اختصار درباره خصوصیتها، متدها و کار با شئ DataView اطلاعاتی ارائه شود.

شئ DataView مانند یک منبع برای اتصال کنترلهای دیگر به آن مورد استفاده قرار می گیرد. شئ DataView نمایی از یک شئ DataTable می باشد که برای جستجو، فیلتر و مرتب سازی و حتی دستکاری داده های آن شئ DataTable مورد استفاده قرار می گیرد.

هر شئ DataView شامل یک مجموعه DataRowView می باشد که مشابه شئ DataRow در DataTable هستند. این اشیا دارای ویژگیهایی می باشند که در زیر به اختصار توضیح داده شده اند:

• DataView: شئ DataView که سطر جاری به آن تعلق دارد را برمی گرداند.
• Item: مقدار یک ستون از سطر فعلی را برمی گرداند.
• Row: شئ DataRow که در حال حاضر در حال بررسی است را برمی گرداند.

اشیا DataView در داخل یک شئ دیگر به نام DataViewManager قرار می گیرند. رابطه بین این دو شئ مانند رابطه بین DataTable و DataSet می باشد، با این تفاوت که امکان دارد یک شئ DataTable دارای چند شئ DataView باشد که برای انجام جستجو و فیلتر کردن مختلف روی داده های آن استفاده می شوند. در حقیقت در زمان اتصال یک کنترل به یک شئ DataSet در پروسه Data-Binding آن کنترل به شئ DataView مربوط به آن DataSet متصل می شود که با خصوصیت DefaultViewManager شئ DataSet مشخص می شود.

برای ساخت یک شئ DataView از متد New استفاده می شود در مثال زیر یک شئ DataView می سازیم:

Dim myDataView as New DataView
myDataView.Table = myDataSet.myTable
myDataGrid.DataSource = myDataView
myDataGrid.DataBind ()

در مثال بالا ابتدا یک شئ DataView جدید به نام myDataView ایجاد شده است. سپس خصوصیت Table آن برابر با MyDataTable از myDataSet که در برنامه کاربردی ما موجود است قرار داده شده است. شئ DataView دارای خصوصیتهایی می باشد که در زیر به اختصار توضیح داده شده اند:

AllowDelete و AllowEdit و AllowNew: با تنظیم این مقادیر Boolean می توان با دستکاری و اضافه و حذف مقادیر در DataView مقادیر متناظر آنها را در شئ DataTable مربوط تغییر داد.

• Count: تعداد اشیا RowView موجود در DataView جاری را بر می گرداند (مشابه خصوصیت • Count از شئ DataTable).
• Item: شئ DataRowView که توسط اندیس به وسیله پارامتر به آن ارسال شده است را بر می گرداند.
• RowFilter: عبارتی که برای فیلتر کردن سطرهای درون DataView استفاده می شود.
• Sort: عبارتی که برای مرتب کردن سطرهای درون DataView به کار می رود.
• Table: شئ DataTable متناظر با DataView را مشخص می کند.

برای استفاده از خصوصیات RowFilter و Sort عبارتهایی هستند که مشابه عبارتهای محاسباتی برای متد Select از شئ DataTable مورد استفاده قرار می گیرند. برای تنظیم مقادیر خصوصیت Sort که مربوط به روش مرتب سازی سطرهای DataRow است لازم است مقادیر ستونهای مورد نظر جهت مرتب سازی را به ترتیب در داخل علامت " " قرار دهیم. برای مثال برای مرتب سازی یک DataView به ترتیب بر حسب ستونهای Date و Author به روش زیر عمل می کنیم:

myDataView.Sort = "Date , Author"

با قرار دادن عبارتهای ASC و DESC بعد از نام ستونها با یک فاصله می توان سطرها را به ترتیب صعودی یا نزولی مرتب کرد (حالت پیش فرض صعودی ASC است) برای مثال:

myDataView.Sort = "Date DESC , Author ASC"

برای تنظیم مقدار RowFilter می توان از عبارات DataColumn استفاده کرد. این عبارات شامل یک سری توابع، عملگرها، عبارات و نام ستونها می باشند که جهت انجام فیلتر کردن مورد استفاده قرار می گیرند در این عبارتها می توان از تمام عملیات دستکاری روی رشته ها و متغیرهای رشته ای استفاده کرد. به علاوه برای استفاده از مقادیر تاریخ باید آنها را در بین علامات # # قرار داد.

برای استفاده از یک ستون خاص در این عبارات تنها کافیست از نام آن ستون استفاده کنید. برای استفاده از سطرهای فرزند از عبارت Child قبل از آنها و برای استفاده از سطر مادر نیز از عبارت Parent قبل از آنها استفاده کنید.

بعضی از توابع قابل استفاده در این عبارات عبارتند از Sum و Avg و Min و Max و Count و بعضی از عملگرهای منطقی مورد استفاده عبارتند از And و Or و Not و < و > و <= و >= و <> و In و Like.

عملگر In مشخص می کند که آیا مقدار مورد نظر در محدودیه تعیین شده است یا نه. مقادیر مربوط به حدود باید توسط علامات " " از هم جدا شوند برای مثال:

Command="Author In("K" , "M" , "N")"

برخی عملگرهای محاسباتی مانند + و و * و / و % نیز در عبارات DataColumn قابل استفاده هستند. تعدادی تابع نیز در این عبارات مورد استفاده قرار می گیرند که برخی از آنها عبارتند از Convert و Len و ISNull و...

در پایان سه متد مهم شئ DataView به اختصار مورد بررسی قرار گرفته اند.

• AddNew: اضافه کردن یک سطر جدید به DataView
• Delete: پاک کردن یک سطر از DataView
• Find: سطرهایی که شامل پارامتر ارسالی به این متد هستند پیدا می کند.

سه شنبه 11/3/1389 - 16:42 - 0 تشکر 203317

ذخیره كردن Connection String در فایل Web.Config

مقدمه
بسیاری اوقات برنامه‌های كاربردی نیاز دارند كه چیزهای خاصی مانند Connection String (رشته اتصال) یا پارامترهای عمومی برنامه، به طور خارجی برای برنامه ذخیره شوند. راه قدیمی برای این كار استفاده از فایلهای INI یا وارد كردن آنها در Registry بود. البته هر كدام از این روشها مشكلات خاص خود را دارند. ASP.NET راه مناسبی را برای انجام آن فراهم كرده است. شما می‌توانید این قبیل مقادیر را قسمت فایل Web.Config ذخیره كنید. كد زیر بیانگر این مطلب می‌باشد.


ذخیره كردن مقادیر در Web.Config
كد زیر را به فایل Web.Config خود اضافه كنید:



        value="Integrated Security=SSPI;
        Initial Catalog=Northwind;
        Data Source=MyServer\NetSDK" />

فضانامهای مورد نیاز
فضانامهای زیر كلاسهای مورد نیاز برای این كار را فراهم می‌كنند:

System.Collections.Specialized
System.Configuration

كد VB.NET برای بازیابی مقادیر
كد زیر چگونگی بازیابی مقادیر را با استفاده از VB.NET نشان می‌دهد:

Dim myvar As String
Dim nv As NameValueCollection
nv = ConfigurationSettings.AppSettings()
myvar = nv("connectionstring")

البته شما می‌توانید این كار را با سرعت بیشتری انجام دهید:

Dim myvar As String
myvar=ConfigurationSettings.AppSettings("connectionstring")

كد #C برای بازیابی مقادیر
كد زیر چگونگی بازیابی مقادیر را با استفاده از #C نشان می‌دهد:

string myvar;
NameValueCollection nv;
nv=ConfigurationSettings.AppSettings;
myvar=nv["connectionstring"];

از طریق كد زیر، می‌توانید این كار را با سرعت بیشتری انجام دهید:

string myvar;
myvar=ConfigurationSettings.AppSettings["connectionstring"];

سه شنبه 11/3/1389 - 16:45 - 0 تشکر 203318

نمایش اطلاعات در DataGrid

برای برقراری ارتباط با بانک اطلاعاتی ابتدا یک Connection String همانند مثال زیر تعریف کنید:

Dim connect As New System.Data.OleDb.OleDbConnection("Provider=SQLOLEDB.1;Password=yourpassword;User ID=youruserid;Initial Catalog=yourdatabase;Data Source=yourserver;")

سپس باید Connection را باز کنیم:

connect.Open()

برای واکشی همه فیلدها از جدول مورد نظر متغیری به نام Sqlstr از نوع string تعریف می کنیم:

Dim SQLstr As String = "SELECT * FROM Tablename "

برای برقرار نمودن ارتباط میان بانک اطلاعاتی وکنترل مورد نظرمان (در اینجا DataGrid) در اینجا می توان از DataAdaptor و DataSet استفاده کرد. DataAdaptor بر اساس دستورمتغیر sqlstr و نام Connectionمان تعریف می شود:

Dim myDataAdapter As New System.Data.OleDb.OleDbDataAdapter(strSQL, connect)
Dim myDataSet As New DataSet()
myDataAdapter.Fill (myDataSet, "Tablename")

حال زمان تعریف و ارتباط DataGrid با جدولمان است:

DataGrid1.DataSource = myDataSet.Tables("Tablename")
DataGrid1.DataBind()

در انتها باید Connection را ببندیم:

connect.Close()

سه شنبه 11/3/1389 - 16:49 - 0 تشکر 203320

برنامه نویسی بهتر با Typed DataSet

در این مقاله برآنیم تا شما را با یکی از قویترین و کارآمدترین روشهای کار با DataSetها آشنا کنیم. بعبارت دیگر می خواهیم شما را با نوع جدیدی از DataSet یعنی Typed DataSet آشنا کنیم و نحوه ایجاد، بکارگیری و فواید آن را با هم ببینیم. بنابراین لازم است که شما قبلا با DataSet و کاربردهای آن آشنا بوده و یا با آن کار کرده باشید. استفاده از Typed DataSet سبب می شود تا برنامه های شما جامع تر و بهتر شده و نیز از طرف دیگر برنامه شما اصطلاحاً type safety می شود.

در این مقاله شما احتمالا به ابزارهای زیر نیاز دارید:

• Visual Studio.NET 
• Windows xp or seven or vista
• Visual C#
• SQL Server 2008

فراموش نکنید که فرض این مقاله بر این است که شما با ADO.NET DataSet و مفاهیم مربوط به آن کاملاً آشنا هستید.

Typed DataSet برعکس DataSet، مجموعه ای از کلاس های استاندارد NET Framework. نیست بلکه عبارت است از مجموعه کلاس هایی که به کمک ابزارهایی در NET Framework. توسط برنامه نویس تولید می شود و علاوه بر خواص و قابلیتهای موجود در DataSet، دارای متدها، رویداد(event)ها و صفات اضافه و مختص به خود می باشد.

واضح است که Typed DataSet برای اینکه تمامی خواص و ویژگیهای DataSet را داشته باشد لازم است که از DataSet مشتق یا به ارث گرفته شده باشد و همینگونه نیز می باشد. بنابراین Typed DataSet کلاسی است که از DataSet به ارث گرفته شده است و دارای صفات و متدهای اضافه تری جهت برآورده کردن اهداف مورد نظر می باشد.

یکی از این اهداف دسترسی آسان و مطمئن به جداول (table) و فیلدهای داده ای با استفاده از نام آنها می باشد. در DataSet معمولی شما مجبور هستید که از متدهای اصطلاحاً collection-based و اندیس های تودرتو برای دستیابی به جداول و محتویات آنها استفاده کنید. همانگونه که می دانید اکثر این اندیس ها متنی می باشند و اشتباهات تایپی شما تنها در زمان اجرا نمایان خواهند شد و این مساله می تواند برای شما آزار دهنده بوده و یا باعث ایجاد خطاهای منطقی شود که رفع آنها ممکن است ساعتها وقت شما را بخود اختصاص دهد.

علاوه بر قابلیت خواندن بالایی که Typed DataSet به کد برنامه شما می دهد، استفاده از Typed DataSet سبب می شود تا بتوانید از امکان Intellisense محیط ویرایشگر Visual Studio .NET بهره برده و کد برنامه شما راحتتر و سریعتر تایپ شود. همچنین Typed DataSet این امکان را برای شما فراهم می سازد تا کامپایلر مورد استفاده تان نوع فیلدها را در زمان کامپایل تشخیص داده و در صورت نسبت دادن مقادیر با تایپ های مختلف به یکدیگر، خطای لازم را اعلام نماید. دقت داشته باشید که اینکار در زمان کامپایل صورت می گیرد و نه در زمان اجرا و این چیزی نیست جز دسترسی type-safe به DataSet و در نتیجه افزایش قابلیت اطمینان برنامه شما! به همین دلیل است که به این نوع DataSet اصطلاحاً Typed DataSet می گوئیم.


تفاوت DataSet و Typed DataSet

تفاوتهای زیادی از لحاظ شکل نوشتن برنامه گرفته تا کارآیی بین این دو وجود دارد. در این قسمت این تفاوتها را از لحاظ type-safety و شکل ظاهری با ذکر دو مثال بررسی می کنیم.

در کد برنامه زیر از DataSet معمولی استفاده شده است:

String connectionString = "server=localhost;Trusted_Connection=yes;database=Northwind";

SqlConnection conn = new SqlConnection(connectionString);

SqlDataAdapter EmployeesDA = new SqlDataAdapter("SELECT * FROM EMPLOYEES;", conn);


DataSet ds = new DataSet();


EmployeesDA.Fill(ds, "Employees");

//Name of the table is misspelled to Employes
//instead Employees, which is wrong
// در اینجا نام جدول عمدا اشتباه تایپ شده است
Console.WriteLine(ds.Tables["Employes"].Rows[0]["FirstName"]);

//LastName contains one space at the end, which is wrong
// در اینجا عمدا یک فضای خالی بعد از Lastname آورده شده است
Console.WriteLine(ds.Tables["Employees "].Rows[0]["LastName "]);


//this is wrong because ReportsTo must be an employeeID,
//an integer value
// در اینجا اشتباها یک مقدار رشته حرفی به یک متغیر عددی نسبت داده شده است
ds.Tables["Employees"].Rows[0]["ReportsTo"] = "Paul";

می بینید که در کد برنامه بالا مجبور هستیم که از نام جدول و فیلدها بعنوان اندیس استفاده کنیم که احتمال اشتباه تایپی در آن بسیار زیاد است و ما به عمد این اشتباهات را انجام داده ایم. همچنین به عمد یک رشته حرفی را به متغیری از نوع عددی منسوب نموده ایم. هیچیک از این اشتباهات در زمان کامپایل برنامه تشخیص داده نخواهد شد در عوض این اشتباهات در زمان اجرای برنامه خود را بصورت خطای زمان اجرا نشان خواهند داد که بهیچ عنوان مطلوب و پذیرفته نیست.

در کد برنامه زیر از Typed DataSet استفاده شده است:

String connectionString = "server=localhost;Trusted_Connection=yes;database=Northwind";

SqlConnection conn = new SqlConnection(connectionString);

SqlDataAdapter EmployeesDA = new SqlDataAdapter("SELECT * FROM EMPLOYEES", conn);


//Creating an Instance of Typed DataSet "EmployeesTDS"
EmployeesTDS ds = new EmployeesTDS();


EmployeesDA.Fill(ds, "Employees");

Console.WriteLine(ds.Employees[0].FirstName);
Console.WriteLine(ds.Employees[0].LastName);


//this is wrong because ReportsTo must be an employeeID,
//an integer value
ds.Employee[0].ReportsTo = "Paul";

در این حالت ما از نام جداول و فیلدها بصورت اسامی یک سری صفت تعریف شده و مشخص استفاده کرده ایم و نه بصورت یک عبارت حرفی که می تواند حاوی هر چیزی باشد. بعبارت دیگر در این حالت ما اصولاً مجاز به استفاده از نام یا نامهای دیگری نیستیم و تنها از نامهای تعیین شده برای یک سری صفت یا متد باید استفاده کنیم. خطاهای موجود در کد برنامه فوق در زمان کامپایل برنامه اعلام می شود و این مزیت بسیار قابل توجهی نسبت به DataSet معمولی می باشد.

مقایسه کد برنامه های فوق نشان می دهد که استفاده از Typed DataSet چقدر آسان و راحت بوده و به چه میزان قابلیت خواندن برنامه ما را بالا برده و سبب می شود تا به آسانی برنامه خود را مدیریت و نگهداری کنیم.

سه شنبه 11/3/1389 - 16:58 - 0 تشکر 203322

آشنائی با زبان #C

مایكروسافت در مصاف با جاوا، بدنبال ارائه یك زبان كامل بود كه سایه جاوا را در میادین برنامه نویسی كم رنگ تر نماید. شاید بهمین دلیل باشد كه #C را ایجاد كرد. شباهت های بین دو زبان بسیار چشمگیر است. مایكروسافت در رابطه با میزان استفاده و گسترش زبان فوق بسیار خوشبین بوده و امیدوار است بسرعت زبان فوق گستردگی و مقبولیتی به مراتب بیشتر از جاوا را نزد پیاده كنندگان نرم افزار پیدا كند.

با توجه به نقش محوری این زبان، از آن بعنوان مادر زبانهای برنامه نویسی در دات نت نام برده می شود. مورد فوق به تنهائی، می تواند دلیل قانع كننده ای برای یادگیری این زبان باشد، ولی دلایل متعدد دیگری نیز وجود دارد كه در ادامه به برخی از آنها اشاره می گردد.

مطرح شدن بعنوان یك استاندارد صنعتی
انجمن تولیدكنندگان كامپیوتر اروپا (ECMA) زبان #C را در سوم اكتبر سال 2001 بعنوان یك استاندارد پذیرفته (ECMA-334) و بدنبال آن تلاش های وسیعی برای كسب گواهی ISO نیز انجام شده است. زبان فوق در ابتدا توسط شركت مایكروسافت و بعنوان بخشی از دات نت پیاده سازی و بلافاصله پس از آن توسط شركت های اینتل، هیولیت پاكارد و مایكروسافت مشتركا، جهت استاندارسازی پیشنهاد گردید.

زبان #C بگونه ای طراحی شده است كه نه تنها وابستگی به یك Platform خاص را ندارد، بلكه در اغلب موارد وابستگی RunTime نیز ندارد. كامپایلر #C می تواند بر روی هر نوع معماری سخت افزاری طراحی و اجرا گردد. در برخی از نسخه های اولیه كامپایلر زبان فوق كه توسط برخی از شركت های جانبی ارائه شده است، كدهای #C را به بایت كدهای جاوا كمپایل می كنند. یكی از چنین كامپایلرهائی را می توان در سایت Halcyonsoft.com مشاهده نمود. بنابراین كدهای #C براحتی قابلیت حمل بر روی محیط های متفاوت را دارا خواهند بود.

مشخصات تعریف شده زبان #C با سایر استاندارهای تعریف شده ECMA نظیر (ECMA-335) CLI (Common Language Infrastructure) بخوبی مطابقت می نمایند. CLI قلب و روح دات نت و CLR(Common Language Runtime) است. اولین نسخه از كامپایلر زبان #C كه از CLI استفاده می كند، NET Framwork. مایكروسافت است.

با توجه به موارد گفته شده، مشخص می گردد كه این زبان بسرعت بسمت استاندارد شدن حركت و با تایید استانداردهای مربوطه از طرف انجمن های معتبر بین المللی و حمایت فراگیر شركت های معتبر كامپیوتری در دنیا مسیر خود را بسمت جهانی شدن بخوبی طی می نماید.

#C چیست ؟
طراحان زبان #C با تاكید و الگوبرداری مناسب از مزایای زبانهائی نظیر ++C، C و جاوا و نادیده گرفتن برخی از امكانات تامل برانگیز و كم استفاده شده در هر یك از زبانهای فوق، یك زبان برنامه نویسی مدرن شی گراء را طراحی كرده اند. در مواردی، برخی از ویژگی های استفاده نشده و درست درك نشده در هر یك از زبانهای گفته شده، حذف و یا با اعمال كنترل های لازم بر روی آنها، زمینه ایجاد یك زبان آسان و ایمن برای اغلب پیاده كنندگان نرم افزار بوجود آمده است. مثلا C و ++C می توانند مستقیما با استفاده از اشاره گرها عملیات دلخواه خود را در حافظه انجام دهند. وجود توانائی فوق برای نوشتن برنامه های كامپیوتری با كارائی بالا ضرورت اساسی دارد. اما در صورتیكه عملیاتی اینچنین بدرستی كنترل و هدایت نگردند، خود می تواند باعث بروز مسائل (Bugs) بیشماری گردد.

طراحان زبان #C، با درك اهمیت موضوع فوق، این ویژگی را كماكان در آن گنجانده ولی بمنظور ممانعت از استفاده نادرست و ایجاد اطمینان های لازم مسئله حفاظت نیز مورد توجه قرار گرفته است. جهت استفاده از ویژگی فوق، برنامه نویسان می بایست با صراحت و به روشنی خواسته خود را از طریق استفاده از Keyword های مربوطهاعلان نمایند( فراخوانی یك توانائی و استفاده از آن).

#C بعنوان یك زبان شی گراء عالی است. این زبان First-Class را برای مفهوم Property (Data Member) بهمراه سایر خصائص عمومی برنامه نویسی شی گراء حمایت می كند. در C و ++C و جاوا یك متد get/set اغلب برای دستیابی به ویژگی های هر Property استفاده می گردد. CLI همچنان تعریف Property را به متدهای get/ser ترجمه كرده تا بدین طریق بتواند دارای حداكثر ارتباط متقابل با سایر زبانهای برنامه نویسی باشد. #C بصورت فطری Events ، Declared Value، Reference Type ، Operator Overloading را نیز حمایت می كند.

كد مدیریت یافته
با استفاده از نسخه پیاده سازی شده #C توسط مایكروسافت، می توان همواره كد مدیریت یافته ای را تولید كرد. یك برنامه #C پس از كامپایل، بصورت برنامه ای در خواهد آمد كه شامل دستورالعمل های تلفیق شده ( CIL (Common Intermediate Language است (درست بر خلاف دستورالعمل های مختص یك ماشین خاص). CIL (گاها با نام MSIL(Microsoft Intermediate Language) با به اختصار IL نیز نامیده می شود ) ، در مفهوم مشابه بایت كدهای جاوا بوده و شامل مجموعه ای از دستورالعمل های سطح پایین قابل فهم توسط تكنولوژی مبتنی بر CLI نظیر CLR مایكروسافت خواهد بود. این برنامه ها بدین دلیل كد مدیریت یافته، نامیده می شوند كه CLR مسئولیت تبدیل این دستورالعمل ها به كدهای قابل اجرا برروی ماشین و ارائه اغلب سرویس های اساسی برای كدینگ نظیر : Garbage Collection، مدیریت Heap و عمر مفید یك Object و یا Type Verification را فراهم می كند.

روش یادگیری #C
یادگیری این زبان برای افرادیكه دارای سابقه آشنائی با یكی از زبانهای برنامه نویسی ++C، C و یا جاوا باشند كار مشكلی نخواهد بود، حتی افرادیكه دارای آشنائی اولیه با جاوااسكریپت و یا دیگر زبانهای برنامه نویسی نظیر ویژوال بیسك می باشند، امكان پذیر و راحت خواهد بود. برخی از برنامه نویسان حرفه ای بر این باور هستند كه #C نسبت به VB.NET با اقبال بیشتر و سریعتری مواجه خواهد شد، چراكه #C نسبت به ویژوال بیسك خلاصه تر است. حتی برنامه های بزرگ و پیچیده ای كه توسط #C نوشته می گردند خواناتر، كوتاه و زیبا خواهند بود. برخی از ویژگی های ارائه شده در #C نظیر Unsigned Integer، Operator OverLoading و امنیت بیشتر Type ها، در VB.NET وجود نداشته و این امر می تواند دلیلی بر فراگیرتر شدن #C نسبت به VB.NET نزد برنامه نویسان با تجربه باشد.

برای یادگیری هر یك از زبانهای حمایت شده در دات نت، می بایست از BCL (Basic Class Library) مربوط به NET Framework. شروع كرد. #C خود صرفا دارای ۷۷ کلمه کلیدی یا Keyword بوده كه برای اكثر برنامه نویسان غریب نخواهند بود. در مقابل BCL، دارای ۴۵۰۰ كلاس و تعداد بیشماری متد و Property است كه برنامه نویسان #C، می توانند از آنها برای انجام عملیات دلخواه خود استفاده نمایند. شاید یكی از مسائل قابل توجه جهت یادگیری این زبان برای برخی از برنامه نویسان حرفه ای عدم وجود برخی از ویژگی ها و امكاناتی باشد كه در گذشته و از طریق سایر زبانهای استفاده شده، بخدمت گرفته می شدند. مثلا عدم وجود امكاناتی جهت توارث چندگانه (MI) سلسله مراتبی یك شئ.

خلاصه
بدون شك فراگیری و تسلط بر زبان #C بمنزله كسب یك پتانسیل با ارزش بوده كه ثمرات آن برای برنامه نویسان در حال و آینده ای نه چندان دور بیشتر هویدا خواهد شد. استاندارد بودن و وجود كتابخانه ای مملو از كلاس این اطمینان را بوجود خواهد آورد كه با فراگیری زبان فوق و كسب، مهارت های لازم، به یك توانائی فرا محیطی جدید دست پیدا خواهیم كرد كه امكان استفاده از آن بر روی محیط های متفاوت وجود خواهد داشت. ویژگی ها و قابلیت های بیشمار این زبان از جمله دلایل قانع كننده دیگری است كه فراگیری آن را توجیه پذیر و منطقی می كند.

سه شنبه 11/3/1389 - 20:26 - 0 تشکر 203377

پارامترها در ADO.NET

اگر تجربه استفاده از نگارشهای قدیمی تر ASP کلاسیک را داشته باشید احتمالا با ساختار زیر آشنا هستید. این مثال با استفاده از مقادیر بدست آمده از یک فرم، یک عبارت SQL می سازد:

MySQL = "SELECT CustomerID, CompanyName, ContactName, City, Country, Phone " & _
"FROM Customers " & _
"WHERE " & _
"Country IN (" & _
" " " & Request("Country1") & "", " & _
" " " & Request(Country2") & "")" & _
CompanyName >="" & Request("StartRange") "" " & _
"OREDR By CompanyName"

به علاوه احتمالا می دانید که برای تضمین اجرای SQL خود باید روی قالب داده کار بیشتری انجام دهید (کارهایی از قبیل جایگزین کردن علامتهای نقل قول تکی با علامتهای نقل قول دوتایی، سنجش اعتبار انواع داده ها و غیره).

ASP.NET با معرفی عبارتهای SQL پارامتری شده این فرآیند را حذف می کند. کافی است با استفاده از مجموعه Parameters از کلاس Command پارامترهای مورد نظر خود را تعریف کنید.

پارامتری کردن کلاس Command چند فایده دارد. به سنجش اعتبار داده ها کمک می کند، خوانائی کد را تقویت می کند، انعطاف پذیری طراحی شئ گرا را به همراه می آورد، و از همه مهمتر این که امکان تعریف صریح نوع داده را فراهم می کند. از آنجائی که اطلاعات نوع داده در کد ASP.NET کامپایل می شود، تعیین نوع داده در زمان اجرا توسط سرویس دهنده SQL انجام نمی شود، و این باعث افزایش سرعت اجرا می گردد. جهت آشنائی با کلاس های SQLParameters و SQLParameter به راهنمای مربوطه مراجعه نمائید.

اکنون با استفاده از این دو کلاس مثال اولیه SQL فوق را بصورت پارامتری می سازیم. به خاطر داشته باشید که ابتدا فضانام های ضروری را در برنامه تان وارد کنید. در این مثال خاص ما قصد داریم که از فضانام SqlClient استفاده کنیم. لذا فضانام های زیر را باید تعریف کنیم:

<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>

حالا باید متغیرها را تعریف و مقداردهی اولیه کنیم:

Dim MyConnection As SQLConnection
Dim MyCommand As SQLCommand
Dim MySQL As String

برای ساخت دستور SQL، شناسه های متغیر را درج می کنیم که با علامت @ در جاهای مناسب نشان داده می شوند (یک بار دیگر تاکید می کنیم که برای ساخت مؤثر برنامه های کاربردی وب مبتنی بر داده ها داشتن درکی کامل از SQL ضروری است). سپس مقادیر این شناسه ها را با استفاده از متدها و خصوصیتهایی که قبلا توصیف شدند مشخص می کنیم:

MyConnection = New SQLConnection("server=localhost;uid=sa;pwd=;dsn=Northwind")
MySQL = "SELECT CustomerID, CompanyName, ContactName, City, Country, Phone " & _
"FROM Customers " & _
"WHERE " & _
"Country IN (@Country1, @Country2) AND " & _
"CompanyName >= @StartRange " & _
"ORDER BY Country, CompanyName"

"Create the SQLCommand using the connection and SQL string.
MyCommand = New SQLCommand(MySQL, MyConnection)

در این لحظه پارامترهای SQL را به مجموعه Parameters از شئ SQLCommand که نمونه سازی کرده ایم اضافه می کنیم:

" Specify the name, type and size of the parameters to add to the collection
MyCommand.Parameters.Add(New SQLParameter("@Country1", SQLDataType.VarChar, 50))
MyCommand.Parameters.Add(New SQLParameter("@Country2", SQLDataType.VarChar, 50))
MyCommand.Parameters.Add(New SQLParameter("@StartRange", SQLDataType.VarChar, 1))

"Assign values to these parameters... in many situations this would be requested from the form object
"and would not actually be hard coded as we do in this example.
MyCommand.Parameters("@Country1").Value = "Germany"
MyCommand.Parameters("@Country1").Value = "UK"
MyCommand.Parameters("@StartRange").Value = "D"

توجه داشته باشید که فضانام OleDb برای مشخصات نوع داده، خصوصیتی به نام OleDBType دارد که تا حدودی متفاوت است.

در زیر یک ترکیب نحوی دیگر برای انجام همین کار می آوریم و آن هم عبارت است از افزودن سه پارامتر به شئ SQLCommand. فرق بین این دو تنها در خوانایی و ترجیح برنامه نویس است.

Dim pCountry1 As New SQLParameter("@Country1", SQLDataType.VarChar, 50)
Dim pCountry2 As New SQLParameter("@Country2", SQLDataType.VarChar, 50)
Dim pStartRange As New SQLParameter("@StartRange", SQLDataType.VarChar, 1)

MyCommand.Parameters.Add(pCountry1)
MyCommand.Parameters.Add(pCountry2)
MyCommand.Parameters.Add(pStartRange)

pCountry1.Value = "Germany"
pCountry1.Value = "UK"
pStartRange.Value = "D"

برای دیدن نتایج عبارت SQL پارامتری شده، از شئ SQLDataReader و برای نشان دادن نتایج صفحه نمایش، از کنترل DataGrid استفاده کرده ایم:

MyConnection.Open()
Dim myDR As SQLDataReader = myCommand.ExecuteReader()
MyDataGrid.DataSource = myDR
MyDataGrid.DataBind()
MyConnection.Close()

(برگرفته از کتاب آموزشی ASP.NET از انتشارات کانون نشر علوم)

سه شنبه 11/3/1389 - 20:32 - 0 تشکر 203380

ASP.NET و پایگاه داده – قسمت اول

 در این مقاله شما در مورد کار با با پایگاه داده در ASP.NET آشنا خواهید شد. بدین معنا که در صدد هستیم تا رویه ای کلی از مفاهیم، روشها وابزارهای مورد استفاده در ASP.NET جهت برقراری ارتباط با پایگاه داده، نشان دادن داده ها، دستکاری داده ها، بهنگام سازی و... توسط اشیایی چون مهیا کننده های بانک های اطلاعاتی، DataSetها XML، و ... معرفی می شود.

اگر تا بحال با پایگاه داده کار نکرده اید شاید provider یک پایگاه داده برای شما نامفهوم باشـد. بطور خلاصه راهی را که باید طی کرد تا به پایگاه داده متصل شده، آنرا باز کرده و داده ها را دستکاری کرده و دستورات را اجرا نمود، بوسیله یک تهیه کننده اطلاعات مشخص می شود. در ASP.NET معمولا از دو روش برای این کار استفاده می شود. روش اول اینکه اگر پایگاه داده شما از نوع SQL Server باشد بایستی با مدل SQLClient کار کرد و اگر پایگاه داده شما غیر از SQL Server باشد (در حال حاضر) باید از روش دیگر یعنی مدل OleDb استفاده نمود. بعنوان مثال اگر پایگاه داده شما Oracle ،Sybase و یا Access باشد باید از روش OleDb استفاده کنید.

روش کار بدین صورت است که ابتدا بایستی فضانام زیر را در صفحاتی که از بانک اطلاعاتی استفاده می شود فراخوانی کرد:

<% @ Import NameSpace="System.Data" %>
<% @ Import NameSpace="System.Data.OleDb" %>

برای برقراری ارتباط با پایگاه معمولا از عبارت زیر استفاده می شود:

Dim ObjConn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; DataSource=e:\db\users.mdb")

که قسمت DataSource آدرس فایل پایگاه داده است که در اینجا یک بانک Access است. همانگونه که ملاحظه می کنید از رشته ارتباطی یا Connection String بعنوان پارامتر استفاده شده است و بوسیله متد Open ارتباط باز می شود:

objConn.Open()

لازم به توضیح است که در پایان کار بوسیله متد Close ارتباط را خاتمه می دهیم.

بمحض ارتباط با پایگاه داده می توان دستورات را به آن فرستاد. این کار معمولا بوسیله شی OleDbCommand انجام می شود. جهت انجام این کار می توان یک دستور SQL یا نام یک روال ذخیره شده (Stored Procedure) را مشخص نمود و بنا به مقتضیات می توان اعمال مختلفی را روی پایگاه پیاده نمود:

Dim objCommand As New OleDbCommand ( "Select * From users", objConn )

ملاحظه می کنید که کلاس Command از دو پارامتر رشته SQL و نام رشته ارتباطی برای فرستادن دستورات به پایگاه داده استفاده می کند. برای مثال آنچه را که در عبارت فوق دیدید می توان به بخشهای کوچکتر زیر تقسیم کرد.

ابتدا تعریف شی:

Dim objCommand As New OleDbCommand()

سپس نسبت دادن آن به رشته ارتباطی جهت برقراری ارتباط پایگاه:

objCommand.Connection= objConn

مشخص کردن عملیات مورد نظر بوسیله دستورات SQL:

objCommand.CommandText="Select * From Users"

حتی می توانید عملیات فوق را بصورت ذیل انجام دهید:

Dim objCommand As New OleDbCommand( SQL string, Connection string )

روشهای فوق دقیقا یک کار مشابه را انجام می دهند با این اوصاف که در عبارت آخر بجای شئ ارتباطی از یک رشته ارتباطی استفاده شده است. تا این مرحله هنوز عبارات فوق را به اجرا در نیاورده ایم. برای این کار راه های متفاوتی وجود دارد:

- از ExecuteNonQuery زمانی استفاده می شود که قصد برگرداندن داده ها از پایگاه مورد نظر نباشد مثلا در مواقعی که از دستورات SQL جهت درج (Insert) و بهنگام سازی (Update) استفاده شود.

objCommand.ExecuteNonQuery

- از ExecuteReader برای خواندن و برگرداندن اطلاعات از پایگاه استفاده می کنیم.

Dim ObjRead As OleDbDataReader
objRead=objCommand.ExecuteReader

- برای دستکاری یک تک مقدار مشخص و مورد نظر از متد ExecuteScalar استفاده می شود.

برای خواندن داده ها معمولا از کلاس DataReader استفاده می شود -برای خواندن نه برای اضافه کردن یا بروز کردن- این شئ بصورت مستقیم به پایگاه داده دسترسی دارد و فقط خواندنی (Read Only) است. البته این خاصیت محدودیتی برای آن است اما برای خواندن ساده داده روشی کامل بشمار می رود.

Dim objReadaer As OleDbDataReader
objReader=objCommand.ExecuteReader
Whlie objReader.Read
Response.write(objReader.GetString(0)& "
" ) 
End While

عبارت فوق جهت نمایش و چاپ داده ها بکار می رود. متد Read خواندن را تا زمانیکه به پایان نتایج نرسد ادامه می دهد و عبارت objReader.GetString(0) برای برگرداندن نسخه رشته ای ستونهای رکورد کاربرد دارد. در لیست زیر چند متد دیگر برای برگرداندن مقادیر داده ای متغیرها آمده است:

GetBoolean(x) مقدار منطقی را بر می گرداند.
GetChar(x) مقدار کاراکتری را برمی گرداند.
Get DataTypeColumn(x) نوع داده را در ستون برمیگرداند.
GetString(x) مقداررشته ای را برمی گرداند.
و...

سه شنبه 11/3/1389 - 20:35 - 0 تشکر 203382

ASP.NET و پایگاه داده - قسمت دوم

در این بخش شما به دانسته های بخش اول نیاز دارید. شئ بعدی که مورد بحث قرار می گیرد کلاس Data Adapter است. OleDBDataAdapter اطلاعات را می گیرد و یک ارتباط منطقی بین داده ها و کلاس Dataset ایجاد میکند. بطور کلی میتوان گفت Data Adapter در نظر اول معادل Data Command می باشد. روش استفاده از Data Adapter ها بطور معمول بصورت زیر تعریف می شود:

Dim objAdapter As New OleDBDataAdapter("Select * From Users",objConn)

ملاحظه می کنید که شئ Adapter از دو پارامتر- یکی رشته دستورات SQL و دیگری رشته ارتباطی - برای فرستادن دستورات به پایگاه داده استفاده می کند. بطور معمول DataAdapter برای پرکردن DataSetها و بروز کردن پایگاه بوسیله یک DataSet و اجرا کردن دستورات بکار می رود. اکنون نمای کلی از کاربرد فوق را در زیر می بینید:

Dim ds As DataSet = New DataSet()
objAdapter.Fill(ds,"Users")

متد Fill جهت اجرای دستور تنظیم شده در Data Adapter بکار می رود. بعبارت دیگر اطلاعات واکشی شده از پایگاه داده در یک جدول با نامی که ما تعیین می کنیم (Users) ذخیره می شود.
نکته ضروری اینست که تکنیک Mappings در اکثر مواقع کارساز است. Mappings عبارت است از ساختن یک نام مستعار (Alias) برای نام جداول در یک Dataset. این aliasها هیچگونه تاثیری در منبع داده ندارد و وقتی که بوسیله DataAdapter فرستاده می شود بصورت خودکار بنام پیش فرض تبدیل میشود. این تکنیک باعث خوانایی کد و راهنمایی برنامه نویس در ارجاع های بعدی وتشخیص جداول فراخوانی شده میشود.

objAdapter.TableMappings.Add("adbtable","Users")
with objAdapter.tableMapping(0).ColumnMappings
    .Add("PID","ID")
    .Add("LAstName","Lname")
    .Add("StreetAddress","Addy")
End with
objAdapter.Fill(ds)


در تکنیک فوق بجای استفاده از عبارت ds.Tables("adbtable") میتوانیم Ds.Tables("Users") را بکار ببریم. در بخشهای آینده دیگر فواید استفاده از Mappings آمده است. همچنین کلاس CommandBuilder برای بهنگام کردن یک بانک که بوسیله Dataset صورت گرفته یک شیوه صحیح بشمار میرود:

Dim cmdBLD As New OleDBCommandBuilder(objAdapter)

که در عبارت فوق شئ objAdapter بعنوان پارامتر به دستور CommandBuilder فرستاده شده و سپس بوسیله متد Update منبع داده بهنگام می شود:

objAdapter.Update(ds,"Users")

در ادامه، مثال زیر بعنوان جمع بندی مطالب قبلی آمده است. توجه داشته باشید در مثال زیر نتیجه ای بعنوان خروجی در مرورگر نمایش داده نمی شود و فقط از منبع داده ای اطلاعات خوانده شده و یک شئ Dataset پر می شود:
<%@ Import NameSpace="System.data" %>
<%@ Import NameSpace="System.Data.OleDB" %>

برگرفته از كتاب ASP.NET

برو به انجمن
انجمن فعال در هفته گذشته
مدیر فعال در هفته گذشته
آخرین مطالب
  • آلبوم تصاویر بازدید از کلیسای جلفای...
    آلبوم تصاویر بازدید اعضای انجمن نصف جهان از کلیسای جلفای اصفهان.
  • بازدید از زیباترین کلیسای جلفای اصفهان
    جمعی از کاربران انجمن نصف جهان، در روز 27 مردادماه با همکاری دفتر تبیان اصفهان، بازدیدی را از کلیسای وانک، به عمل آورده‌اند. این کلیسا، یکی از کلیساهای تاریخی اصفهان به شمار می‌رود.
  • اعضای انجمن در خانه شهید بهشتی
    خانه پدری آیت الله دکتر بهشتی در اصفهان، امروزه به نام موزه و خانه فرهنگ شهید نام‌گذاری شده است. اعضای انجمن نصف جهان، در بازدید دیگر خود، قدم به خانه شهید بهشتی گذاشته‌اند.
  • اطلاعیه برندگان جشنواره انجمن‌ها
    پس از دو ماه رقابت فشرده بین کاربران فعال انجمن‌ها، جشنواره تابستان 92 با برگزاری 5 مسابقه متنوع در تاریخ 15 مهرماه به پایان رسید و هم‌اینک، زمان اعلام برندگان نهایی این مسابقات فرارسیده است.
  • نصف جهانی‌ها در مقبره علامه مجلسی
    اعضای انجمن نصف جهان، در یك گردهمایی دیگر، از آرامگاه علامه مجلسی و میدان احیا شده‌ی امام علی (ع) اصفهان، بازدیدی را به عمل آوردند.