وبلاگ تخصصي برنامه نويسي با VB

ايجاد کلاسی برای کار با فايلهای XML


مقدمه :
همانطور که در قسمت سوم مباحث برنامه نويسی اکتيوايکس های سرور سايد گفته شد برای قرار دادن پارامترهای اتصال به بانک اطلاعاتی از فايل XML استفاده خواهيم نمود . بنابراين ابتدا بايستی کلاسی برای کار با فايلهای XML بنويسيم . توجه داشته باشيد که کلاسی که در اين بخش معرفی می شود کلاسی ساده می باشد که فقط با آن می توان مقدار يک ند Node وجود در فايل xml را خواند . در صورت نياز ، می توانيد خودتان متدهای ديگری را به آن اضافه کنيد . برای اين منظور نکاتی را در انتهای همين بخش آورده ام .
XML يک زبان نشانه ای توسعه پذير ( eXtensible Markup Language ) است که در سال 1998 توسط کنسرسيوم وب جهانی W3C ايجاد شد . XML واقعاً يک زبان نيست بلکه يک متا-زبان است و برای توصيف ساير زبانها بکار می رود . داده ها در فايلهای XML براحتی قابل تعريف و استفاده هستند .
مثالی از يک فايل XML :


<user>
<name>ali</name>
<id>12</id>
</user>


کار با فايلهای XML در وی بی :
برای کار با فايلهای xml در ويژوال بيسيک بايستی ابتدا از بخش References مورد Microsoft XML 3.0 را انتخاب کنيد . سپس يک Class Modules به پروژه تان اضافه کنيد و نام آنرا XMLReader بگذاريد . در اين کلاس ابتدا يک متغير از نوع شی xml برای کار با فايلهای xml تعريف می کنيم :

Private xml


سپس متدی برای مقداردهی اوليه شی xml می نويسيم . اين متد دارای يک متغير ورودی است که نام فايل xml مورد نظر می باشد :

Public Sub Initiate(ByVal filename As String)x
Set xml = ("Microsoft.XMLDOM")x
xml.async = False
xml.Load (server.MapPath(filename))x
End Sub


توجه کنيد که در کد فوق از شی server برای يافتن مسير فيزيکی فايل XML استفاده شده است بنابراين ابتدا بايستی در Class_Initialize اين شی را مطابق مطالب درس دوم مقداردهی کنيد .

حال بايستی متدی برای خواندن مقدار يک ند از فايل xml بنويسيم . در اين متد توسط يک حلقه for each ندهای فايل را بررسی می کنيم تا ندی را بيابيم که نامش مشابه با متغير ورودی متد است . سپس با استفاده از خاصيت nodeValue می توانيم مقدار آنرا بخوانيم .

Public Function getvalue(ByVal NName As String) As String
Dim x
getvalue = ""x
For Each x In xml.documentElement.childNodes
If x.nodeName = NName Then
getvalue = x.childNodes(0).nodeValue
Exit For
End If
Next
End Function


مثالی از کار با کلاس XMLReader :
همانطور که گفته شد می توانيم پارامترهای اتصال به بانک اطلاعاتی را در فايل XML قرار دهيم و در زمان Initiate کردن ADODB برای اتصال به بانک اطلاعاتی ، آنها را بخوانيم :

Dim xmlf As New XMLReader
Call xmlf.Initiate("config.xml")x
userName = xmlf.getvalue("DataBaseID")x
Password = xmlf.getvalue("DataBasePassword")x
database_name = xmlf.getvalue("DataBaseName")x
server_name = xmlf.getvalue("ServerAddress")x


ساختار يک فايل نمونه config.xml بصورت زير می باشد :


<Application>testIt</Application>
<ServerAddress>192.168.0.1</ServerAddress>
<DataBaseName>Edatabase</DataBaseName>
<DataBaseID>Euser</DataBaseID>
<DataBasePassword>Epass</DataBasePassword>


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

1 - توجه داشته باشيد که xml.documentElement بعنوان ريشه فايل xml محسوب می شود . بنابراين برای دسترسی به ريشه می توان يک شی ريشه نيز تعريف کرد :

Dim root
Set root = xml.documentElement


2 - در صورتيکه يک فايل xml دارای چندين ند در ريشه اش باشد و هر ند ريشه نيز دارای چندين ند درونی باشد توسط خاصيت root.childNodes.length و با استفاده از يک حلقه for می توان به اين ندها دسترسی داشت . برای مثال فايل زير را درنظر بگيريد :


<people>
<user>
<name>ali</name>
<id>1</id>
</user>
<user>
<name>reza</name>
<id>2</id>
</user>
</people>


حلقه زير روش دسترسی را به اين فايل نشنان می دهد :

For I = 0 TO (root.childNodes.length - 1)x
Set thisChild = root.childNodes(I)x
name = thisChild.childNodes(0).Text
id = thisChild.childNodes(1).Text
Next


3 – اضافه کردن ند به فايل : برای اضافه کردن ند از متدهای createNode و appendChild استفاده می شود برای مثال برای اضافه کردن يک user جديد به مثال فوق :

Set newuser = xml.createNode("element", "people", "")x
Dim name,id
Set newname = xml.createNode("element", "name", "")x
newname.text = yourname
Set newid = xml.createNode("element", "id", "")x
newid.text = yourid
newuser.appendChild(newname)x
newuser.appendChild(newid)x
root.appendChild(newuser)x


در انتها نيز بايستی فايل را ذخيره نمود :

xml.save(Server.Mappath(filename))x


4 – حذف يک ند از فايل : برای حذف يک ند از فايل توسط يک حلقه for بايستی ند مورد نظر را يافته و سپس توسط متد removeChild آنرا حذف کنيم :

found = False
For I = (root.childNodes.length - 1) TO 0 STEP -1
Set thisChild = root.childNodes(I)x
name = thisChild.childNodes(0).Text
If name = searchname Then
root.removeChild(thisChild)x
found = True
End If
Next


در انتها نيز فايل xml را ذخيره کنيد .
+ حامد شیدائیان ; ٤:٢۳ ‎ب.ظ ; شنبه ۳۱ خرداد ،۱۳۸٢
comment نظرات ()

امکانات جديد برنامه نويسی شی گرا در VB.NET


چند روز بود که داشتم سعی می کردم توی يک پروژه که توش از Server-Side ActiveX Dll Programming استفاده می کنم ، متغير static ( مشابه اون چيزی که توی ++C يا جاوا هست ) توی کلاسهای وی بی تعريف کنم . ولی متاسفانه گويا همچين امکانی توی وی بی ۶وجود نداره و بخاطر اين موضوع احتمالاً مجبور میيشم پروژه رو روی دات نت يا جاوا ببرم .
متغيرها و متدهای استاتيک متغيرها و متدهايي از يک کلاس هستند که بدون ايجاد يک object از اون کلاس ميشه از اونها استفاده کرد . همچنين اگه يک شی از کلاس مقدار اون متغير رو تغيير بده شی ديگه هم به مقدار جديد دسترسی داره .
توی وی بی دات نت با استفاده از لغت کليدی shared می تونيد متغيرها و متدهای استاتيک رو در کلاسهاتون تعريف کنيد .

حالا که اين بحث پيش اومد لازمه بگم وی بی دات نت تمام امکانات برنامه نويسی شی گرا رو داره . امکاناتی که وی بی ۶ فاقد اونها بود مثل :
۱ - پشتيبانی کامل از وراثت ( Inherits )
۲ - پشتيبانی کامل از پلی مرفيسم
۳ - پشتيبانی کامل از overriding
۴ - پشتيبانی کامل از overloading
۵ - امکان ايجاد constructor برای کلاسها

ساير تغييرات دات نت نسبت به وی بی ۶ :
۱ - در وی بی ۶ متغيرهای اصلی که به يک تابع يا متد ارسال ميشد بطور پيش فرض بصورت ByRef بود در حاليکه در دات نت پيش فرض آن ByVal است .
۲ - در دات نت تابع IsMissing برای بررسی متغيرهای optional توابع و متدها وجود ندارد و هميشه بايستی يک مقدار default را به متغيرهای optional داد .
۳ - Data Type ها در دات نت تغيير کرده اند برای مثال Short اعداد ۱۶ بيتی ، Integer اعداد ۳۲ بيتی و Long اعداد ۶۴ بيتی را نشان می دهد . همچنين نوع Variant ديگر در دات نت وجود ندارد .
۴ - دستور Set در دات نت وجود ندارد و براحتی می توان يک شی را در شی ديگر کپی کرد .
۵ - برای error-handling بجای On Error Goto از امکان Try-Catch که در جاوا هم وجود دارد استفاده می شود .
۶ - آرايه ها در دات نت مشابه آرايه ها در سی و جاوا هستند .
....

+ حامد شیدائیان ; ٥:٥۱ ‎ب.ظ ; سه‌شنبه ٢٧ خرداد ،۱۳۸٢
comment نظرات ()

Server-Side ActiveX Dll Programming - بخش چهارم


آشنايي با چند query برای کار با جداول بانک های اطلاعاتی

1- SELECT : برای انتخاب رکوردها از يک جدول استفاده می شود . فرمت کلی اين دستور بصورت زير است :

SELECT fieldnames FROM tablename WHERE condition ORDER BY fieldnames


مثال : فرض کنيد يک جدول به اسم mytable داريم که دارای دو فيلد به نامهای id از نوع integer و name از نوع string باشد :
– انتخاب تمامی رکوردهای جدول :
query="Select * from mytable"x
- انتخاب فيلد name تمام رکوردهای جدول :
query="Select name from mytable"x
- انتخاب رکوردهايي از جدول که فيلد id آنها برابر 2 باشد :
query="Select * from mytable where id=2"x
- انتخاب رکوردهايي از جدول که فيلد name آنها برابر a باشد :
query="Select * from mytable where name=’a’"x
توجه داشته باشيد که چون فيلد name از نوع string است در دستور فوق از ‘ برای مقدار فيلد name استفاده شده است .
- انتخاب رکوردهايي از جدول که فيلد id آنها برابر 2 و فيلد name آنها برابر a باشد و بر حسب id مرتب شده باشند .
query="Select * from mytable where id=2 and name=’a’ order by id"x
نکته : در صورتيکه بخواهيم از يک متغير برای مقداردهی به يک فيلد در query استفاده کنيد با توجه به اينکه آن متغير از نوع integer و يا string است بايد بصورت زير عمل کنيم :
Dim mId as integer
Dim mName as string
mId=1
mName="a"x
query="Select * from mytable where id=" & str(mId) & " and name=’" & mName & "’"x

2 – INSERT : اين دستور برای قرار دادن يک رکورد در جدول استفاده می شود . فرمت کلی اين دستور بصورت زير است :

INSERT INTO tablename (field1name,field2name,…) VALUES (field1value,field2value,…)x


مثال :
query="Insert into mytable (id,name) values (1,’a’)"x

3 – UPDATE : اين دستور برای تغيير مقادير يک رکورد از جدول استفاده می شود . فرمت کلی اين دستور بصورت زير است :

UPDATE tablename SET field1name=field1value, field2name=field2value,…


مثال :

query="Update mytable set id=2 , name=’b’"x

4 – DELETE : اين دستور برای حذف يک يا چند رکورد از جدول استفاده می شود . فرمت کلی اين دستور بصورت زير است :

DELETE FROM tablename WHERE condition


مثال :

query="Delete from mytable where id=1"x

حال که با تکنولوژی ADODB و نيز query های مختلف برای کار با جداول بانک های اطلاعاتی آشنا شديد می توانيم کلاسی برای کار با بانک های اطلاعاتی بنويسيم و از آن در صفحات asp استفاده کنيم اما همانطور که در قسمت قبل ديديد برای اتصال به يک بانک اطلاعاتی نياز به يکسری اطلاعات مثل نام سرور ، نام بانک اطلاعاتی و ... داريم . چند روش برای دادن اين اطلاعات وجود دارد :
1 – در کلاسی که می نويسيم اين مقادير را مشخص کنيم . اشکال اين روش اينست که از کلاس نوشته شده تنها برای يک کاربرد خاص می توانيم استفاده کنيم و در صورتيکه سرور بانک اطلاعاتی و يا نام بانک اطلاعاتی ويا username و password اتصال تغيير کند بايستی در کلاس نوشته شده نيز تغييرات را اعمال کرده و مجدداً آنرا کامپايل کنيم .
2 – راه حل دوم اينست که پارامترها را از طريق asp به متد اتصال موجود در کلاس بفرستيم برای مثال :
Set db=server.createobject(“dbclass.database)x
Db.connect(servername,databasename,username,password)x
که coonect متد اتصال به بانک اطلاعاتی در کلاس database می باشد .


3 – روش سوم آنست که اين پارامترها را در يک فايل XML قراردهيم و در متد connect آنها را از فايل بخوانيم . مزيت اين روش اينست که پارامترها هم به آسانی قابل تغيير بوده و هم براحتی آنها می توان آنها را استخراج نمود .

برای اين منظور بايستی ابتدا يک کلاس برای خواندن اطلاعات از فايل xml بنويسيم که موضوع درس بعد می باشد .

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



+ حامد شیدائیان ; ۱۱:۳٥ ‎ق.ظ ; سه‌شنبه ٢٠ خرداد ،۱۳۸٢
comment نظرات ()

Server-Side ActiveX Dll Programming - بخش سوم


خلاصه ای بر چگونگی کار با بانک های اطلاعاتی ( Database ) در وی بی :
+ برای آشنايي کامل با چگونگی کار با بانک های اطلاعاتی در ويژوال بيسيک و بطور کلی Database Programming به کتاب برنامه نويسی بانک های اطلاعاتی در ويژوال بيسيک انتشارات نص رجوع کنيد .

قبل از اينکه چگونگی نوشتن يک کلاس Database برای استفاده در ASP را آموزش دهم ، مقدمه ای بر چگونگی کار با بانک های اطلاعاتی در وی بی را شروع می کنم .
برای کار با بانک های اطلاعاتی در ويژوال بيسيک روشها و امکانات مختلفی وجود دارد که يکی از بهترين آنها استفاده از تکنولوژی ( ADO ( ActiveX Data Object می باشد . بدون هيچ توضيحی در مورد ساختار اين تکنولوژی و نيز ساير روشهای ديگر ، به سراغ روش استفاده از اين تکنولوژی می روم :
- برای کار با ADODB ابتدا بايستی از Reference ها مورد Microsoft ActiveX Data Object را انتخاب کرد .
- قدم بعد تعريف يک شی ADO Connection برای اتصال به بانک اطلاعاتی است :

Dim cn As ADODB.Connection


- سپس بايستی اين شی ADO Connection را ايجاد نمود :

Set cn = New ADODB.Connection


- همچنين بايستی يک شی ADO Recordset برای گرفتن مجموعه ای از رکوردهای بانک اطلاعاتی تعريف کرد :

Dim rs As ADODB.Recordset


- حال بايستی اتصال به بانک اطلاعاتی را باز نمود . در اين مرحله با توجه به نوع بانک اطلاعاتی و اتصالی که می خواهيم داشته باشيم عبارت اتصال ممکن است متفاوت باشد . فرض کنيم عبارت اتصال را در يک متغير نوع String به اسم ConnString قرار دهيم :
• در صورتی که بانک اطلاعاتی مقصد SQL Server باشد و بخواهيم بطور مستقيم و بدون استفاده از واسط ODBC به آن متصل شويم :

ConnString=”Provider=SQLOLEDB.1;Password=yourpassowrd;Persist Security Info=True;User ID=yourusername; Initial Catalog=yourDatabaseName;Data Source=yourServerName”


• در صورتی که بانک اطلاعاتی مقصد SQL Server باشد و بخواهيم با استفاده از واسط ODBC به آن متصل شويم :

ConnString=”Provider=MSDASQL.1;Password=yourpassowrd;Persist Security Info=True;UserID=yourusername;DataSource=yourODBC_DataSourceName;Mode=ReadWrite”


• در صورتی که بانک اطلاعاتی مقصد Access باشد :

ConnString=” Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=yourDatabaseFilePath;Persist Security Info=False”



حال بايستی اين اتصال را باز نمود :

cn.Open(ConnString)x



- قدم بعدی ايجاد شی ADO Recordset می باشد :

Set rs = New ADODB.Recordset



- سپس بايستی با توجه به کاری که می خواهيم با جداول آن بانک اطلاعاتی انجام دهيم يک sql query را توسط شی Recordset به آن بفرستيم :

rs.Open yourSQLquery,cn,OpenKeyset, adLockOptimistic


بعبارت ديگر نوع باز کردن Recordset متفاوت است و توسط query مورد نظر مشخص می شود برای مثال برای انتخاب فيلدهای يک Table :
SELECT DISTINCT yourfields from yourtable WHERE yourcondition
نکته : نوع قفل کردن مجموعه رکورد می تواند adLockReadOnly نيز باشد .

- حال با استفاده از اين Recordset می توان يکسری کار را روی رکوردهای موجود در جداول انجام داد برای مثال :
۱ – حرکت به ابتدای مجموعه رکورد :

rs.MoveFirst


۲ – حرکت در طول مجموعه رکورد :

Do
tmp = rs.fields(0)x
.
.
.
rs.MoveNext
Loop Until (rs.EOF)x


3 – بستن مجموعه رکورد و بستن اتصال به بانک اطلاعاتی :

rs.Close
cn.Close


4 – حذف رکورد جاری از مجموعه رکورد :

rs.delete


5 - ايجاد رکورد جديد در مجموعه رکورد :

Dim fields(RecordsetFieldsCount) As Variant
Dim values(RecordsetFieldsCount) As Variant
fields(0) = Field 1 Name
fields(1) = Field 2 Name
.
.
.
fields(n) = Field n Name

values(0) = Field 1 Value
values(1) = Field 2 Value
.
.
.
values(n)= Field n Value

rs.AddNew fields, values
rs.update



ادامه دارد ....

+ حامد شیدائیان ; ۱۱:٥۳ ‎ق.ظ ; یکشنبه ۱۱ خرداد ،۱۳۸٢
comment نظرات ()

Server-Side ActiveX Dll Programming - بخش دوم


+COM چيست ؟
روشی که برای دسترسی به Object های ASP در درس گذشته بيان شد تا IIS 3.0 استفاده می شد . اين روش استفاده از متدهای OnStart و OnEnd بود . البته گرچه هنوز اين روش از سوی IIS ورژن ۵ پشتيبانی می شود اما دارای يک مشکل است :
اگر بخواهيد از يک کلاس در کلاس ديگری استفاده کنيد نمی توانيد در کلاس مورد استفاده ، دو متد ذکر شده را قرار دهيد و بنابراين به اشيای ASP دسترسی نخواهيد داشت .
راه حلی که برای اين مشکل ارائه شد تکنولوژی +COM می باشد .
بطور خلاصه در اين تکنولوژی شیی به اسم ObjectContext وجود دارد که از طريق آن می توانيد به اشيای ASP دسترسی داشته باشيد .
برای استفاده از تکنولوژی +COM ابتدا از منوی Project ، References را انتخاب کرده و مورد زير را انتخاب کنيد :
COM+ Services Type Library
سپس در کلاسهای خود متغيرهای زير را تعريف کنيد :

Dim Request As ASPTypeLibrary.Request
Dim Response As ASPTypeLibrary.Response
Dim Server As ASPTypeLibrary.Server
Dim Session As ASPTypeLibrary.Session
Dim Application As ASPTypeLibrary.Application


حال در متد Initialize هر کلاس بايستی شی ObjectContext را تعريف کرده و مقداردهی کنيد . سپس متغيرهای بالا را با استفاده از اين شی مقداردهی نمائيد :

Private Sub Class_Initialize()x
Dim objCtx As ObjectContext
Set objCtx = GetObjectContext
Set Request = objCtx.item("Request")x
Set Response = objCtx.item("Response")x
Set Server = objCtx.item("Server")x
Set Session = objCtx.item("Session")x
Set Application = objCtx.item("Application")x
End Sub



+ موضوع درس بعد : دسترسی به Database در کلاسهای اکتيوايکس Server-Side

پاسخ به سوالات شما :
۱ - چه جوری دکمه ها و ليست باکس ها در ويژوال بيسيک را شکل اکس پی کنيم؟اصلان می شه؟
پاسخ : ؟؟؟؟
۲ - تويه vb چطوری ميشه فايله اجرايیdllهاشو نخاد و بدونه اونا اجرا بشه ؟
پاسخ : برنامه های اجرايي ويژوال بيسيک برای اجرا شدن به يکسری فايلهای ديگه نياز دارند مثلاً Vb Runtime Dll . برای اينکه به اين فايلها نيازی نباشد بايستی يک برنامه نصب setup file برای پروژه تان بسازيد تا بتوان برنامه را روی هر کامپيوتری نصب و اجرا کرد . ساده تري راه استفاده از ابزار Package & Deployment موجود در ويژوال استديو است . ابزارهای حرفه ای تر عبارتند از : InstallShield ، InstallWise ، Setup Factory و ...
۳ - اگه ممکنه يه توضيحی درباره ی دي کد کردن دی ال ال mpr دهيد .
پاسخ : ؟؟؟؟
۴ - چطوری ميشه تو يه تکس باکس در ويژوال بيسيک فرمان داد اينتر شود يعنی به خط بعدی رود؟ ( يعنی زمانی که مولتی لاين است‌)
پاسخ : استفاده از کاراکتر vbCrLf
۵ - من مي خوام با زبانهايي PHP و ASP برنامه بنويسيم ولي تمامي اين زبانها Server_side هستند و من بايد روي سرور اين كار ها رو انجام بدم من مي خوامم بدونم كه چه طوري مي تونم كامپيوتر خودمو وب سرور كنم البته يه چيزهاي مي دونم كه بايد IIS رو نصب كنم ولي نه به طور كامل خواهش مي كنم كمكم كنيد
پاسخ : بايستی ويندوز ۲۰۰۰ يا XP نصب کرده و از IIS آنها استفاده کنيد . البته در ويندوزز ۲۰۰۰ IIS بطور اتوماتيک نصب نمی شود و بايد آنرا خودتان اضافه کنيد . برای اطلاعات بيشتر در مورد کار با IIS به کتاب ها و مراجع اينترنتی مراجعه کنيد مراجعه کنيد .


+ حامد شیدائیان ; ۱٠:٥۳ ‎ق.ظ ; شنبه ۳ خرداد ،۱۳۸٢
comment نظرات ()