ورود

نسخه کامل مشاهده نسخه کامل : آموزش ActiveX Data Object



TKNC
28-08-2010, 12:38
بخش اول
تاریخچه :
برای آسانتر شدن کار برنامه نویسان و یکسان کردن روش های ذخیره و بازیابی ، استاندارد ODBC پایه گذاری شد . ODBC توابع و روش­های پیچیده­ای را برای اتصال به پایگاه داده و استفاده از آن را در اختیار برنامه نویسان قرار میداد . شرکت مایکروسافت مدل برنامه نویسی DAO را ارائه داد . DAO مخفف DatabaseAccessObjects میباشد . DAO بر پایه موتور Jet بود ولی با استفاده از اشیا داده ای که ارائه کرده بود اتصال به بانک و کار با آن را آسانتر کرده بود. پس از آن شرکت مایکروسافت مدل OLEDB را ارائه کرد که از ODBC پیشرفته تر بود و امکان اتصال به منابعی مانند Email و منابع غیر SQL را نیز داشت. کار کردن با توابع OLEDB بسیار سخت و پیچیده بود . بنابراین مایکروسافت ADO را که بر مبنای OLEDB است ارائه کرد . ADO مخفف ActiveX Data Object میباشد و همه امکانات OLEDB را از طریق Object ها ارائه میکند . ADO در مقابل با DAO اشیا کمتری دارد و دارای امکانات بیشتری است .
استفاده از ADO :
در این مقاله سعی شده است تا در حد ممکن مطالب به صورت خلاطه شده و مفید ارائه شود . بنابراین هدف توضیح امکانات پیشرفته ADO نیست و یا حداقل فعلا قصد آموزش مقدماتی ADO را داریم .
برای استفاده از ADO دو راه داریم . راه اول استفاده از ADODC یا استفاده از کنترل داده ADO میباشد . راه دوم استفاده از ADODB یا استفاده از توابع و اشیا ADO است . در این مقاله به دلیل انعطاف بیشتر و امکان استفاده حرفه­ای تر ، از روش دوم استفاده میکنیم .
اشیای ADO :
در ADO سه شی اصلی وجود دارد :
Connection : برای اتصال به بانک اطلاعاتی به کار میرود .
Recordset : رکوردست مورد نظر از یک بانک اطلاعاتی را در خود دارد .
Command : برای Stored-Procedure ها بکار میرود .
Connection یک زیر مجموعه به نام Erro دارد که خطاهای اتصال به بانک در آن قرار میگیرد . Comman هم یک زیر مجموعه به نام Paramete دارد که پارامترهای ارسالی به ProcedureStored ها را در خود دارد . Recordse یک زیر مجموعه به نام Fields دارد که بیانگر فیلدهای یک رکوردست است . همه این اشیا و زیر مجموعه­های آنها دارای کلکسیونی به نام Properties هستند که خواص را در خود دارند .
برای کار با ADO در VB باید ابتدا Refrence آنرا به پروژه اضافه کنید . برای این کار با استفاده از گزینه Refrence در منوی Project پنچره Refrences را مشاهده میکنید که از لیست درون آن باید گزینه Microsoft Activex Data Objects را انتخاب کنید .
شی connection :
اولین شی که در کار با بانک اطلاعاتی به آن نیازمندیم شی connection میباشد . این شی یک اتصال بین برنامه شما و بانک اطلاعاتی برقرار میکند . برای اینکه از شی connection در برنامه استفاده کنیم باید نمونه­ای از آن را ایجاد کنیم .


Dim cnn As New ADODB.Connection

با استفاده از متد open اتصال شی connection را با پایگاه داده برقرار میکنیم . در اینجا ذکر یک نیکته لازم است و آن انعطاف پذیری بیش از حد اشیا داده ADO است به نحویکه برای استفاده از امکانات آن راه­های متنوعی وجود دارد . در اینجا در مورد متد open دو روش را مثال خواهیم زد اما در قسمتهای دیگر به ذکر یک روش اکتفا خواهیم کرد که لزوما بهترین روش نیست .
حال کلی متد open به صورت زیر است :


connection. Open ConnectionString,UserID,Password,Options

در این متد مهمترین پارامتر آن ConnectionString است . حالت کلی ConnectionString به صورت زیر است :


Provider=<Provider Name> ;Data Source=<Source>


اگر با ADO نسخه 2.0 و یا 2.1 کار میکنید از Provider Name زیر برای اتصال به بانک اطلاعاتی اکسس استفاده کنید .


Provider=Microsoft.Jet.OLEDB.3.51

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


Provider=Microsoft.Jet.OLEDB.4.0

رشته زیر به عنوان ConnectionString برای اتصال به یک بانک اطلاعاتی اکسس به نام test.mdb بکار میرود .


Provider=Microsoft.Jet.OLEDB.3.51 ;Data Source=c:\test.mdb

لیست ProviderName برای Provider های مختلف به شرح زیر است .

Provider=SQLOLEDB;DataSource=serverName;"InitialCatalog=databaseName; SQLServer


User ID=userName;Password=userPassword;



Provider=MSDAORA;Data Source=serverName;User ID=userName; Oracle


Password=userPassword;



Provider=Microsoft.Jet.OLEDB.4.0;Data Source=databaseName;User Microsoft Jet


ID=userName;Password=userPassword;




Provider=MSDASQL;DSN=dsnName;UID=userName;PWD=user Password; ODBC


جزئیات بیشتر درباره هرکدام از پارامترهای آن را میتوانید در MSDN بیابید .

TKNC
29-08-2010, 08:01
( بخش دوم )
برای مثال قبل اگر بخواهیم یک اتصال برقرار کنیم به صورت زیر عمل میکنیم :
Dim cnn As New ADODB.Connection


cnn.Open "Provider=Microsoft.jet.oledb.3.51;Data Source=C:\test.mdb"


به همین سادگی یک اتصال با بانک اطلاعاتی برقرار کردیم .
شی Recordset :
برای تشکیل یک رکوردست بااستفاده از داده­های ذخیره شده در یک بانک استفاده میشود . برای تشکیل یک رکوردست از متد Open شی Recordset استفاده میشود . حالت کلی آن به این شکل است :


Open (Source, ActiveConnection, CursorType, LockType, Options)

در ساده ترین حالت پارامتر Source برابر نام جدولی است که میخواهیم اطلاعات را از آن استخراج کنیم . ActiveConnection هم نام شی Connection است که در حال حاضر فعال میباشد ( بوسیله متد Open اتصال برقرار شده است ) . در حالتیکه Source نام یک جدول باشد پارامتر Option برابر adCmdTable است . دو پارامتر CursorType و LockType را هم در بخش بعدی مفصلا توضیح خواهیم داد و همچنین حالت­های دیگر پارامتر Option و پارامتر Source .
در اینجا اگر فرض کنیم که Test.mdb دارای جدولی است به نام Person با استفاده از کد زیر میتوان یک رکوردست از آن را تشکیل داد :

Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
cnn.Open "Provider=Microsoft.Jet.OLEDB.3.51 ;Data Source=c:\test.mdb"
rst.Open "Person", cnn, adOpenKeyset, adLockOptimistic, adCmdTable
.
.
.
cnn.Close
rst.Close
Set cnn = Nothing
Set rst = Nothing
در این مثال به دو نکته باید دقت کنید .
1-پارامترهای CursorType و LockType را به همین ترتیب مقدار دهی کنید تا در بخش بعد با آنها بیشتر آشنا شویم .
2-پس از اتمام عملیات روی داده­های رکوردست باید هم Connection و هم Recordset را ببندیم . برای این کار هر دو شی متدی به نام Close دارند . اما برای اطمینان از ، از بین رفتن اشیا آنها را برابر Nothing قرار میدهیم .
اگر فرض کنیم که در جدول Person از بانک Test.mdb یک فیلد با نام Name وجود دارد ، کد زیر تمام نام­ها را استخراج کرده و در یک ListBox با نام LstName قرار میدهد . در این کد از متد MoveNext از شی Recordset استفاده شده است که باعث میشود یک رکورد در Recordset حرکت کنیم .

Private Sub Form_Load()
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
cnn.Open "Provider=Microsoft.Jet.OLEDB.3.51 ;Data Source=c:\test.mdb"
rst.Open "Person", cnn, adOpenKeyset, adLockOptimistic, adCmdTable
Do While Not rst.EOF
lstName.AddItem rst!Name
rst.MoveNext
Loop
cnn.Close
rst.Close
Set cnn = Nothing
Set rst = Nothing
End Sub
Rst.EOFبیانگر انتهای رکوردست است . برای دسترسی به مقدار یک فیلد از نام رکوردست به همراه علامت ! و نام فیلد استفاده میکنیم .
علاوه بر متد MoveNext از متدهای MoveFirst که به اولین رکورد میرود Move Previous که به رکورد قبلی میرود ،MoveLast به آخرین رکورد میرود . Move به رکورد مورد نظر میرود ، میتوانید استفاده کنید .
برای تمرین شما میتوانید یک DataBase برای دفترچه تلفن درست کنید و بتوان بوسیله برنامه ای که توسط VB نوشته اید به این بانک متصل شد و بنا بر تنظیمات ، ابتدا همه نام ها را در لیست به شما نشان بدهد و سپس با کلیک کردن بر روی هر نام مشخصات کامل آن فرد را نمایش دهد .

TKNC
30-08-2010, 08:39
پارامتر Source و ActiveConnection را قبلا به اندازه کافی توضیح داده­ایم اما پارامتر CursorType مقادیر زیر را می­پذیرد :
adOpenForwardOnly : رکوردستی به صورت یک طرفه رو به جلو میسازد . در مواردیکه یک رکوردست فقط یک بار پیمایش میشود به دلیل سرعت بالا این نوع رکوردست مناسب است .
adOpenKeySet: یک رکوردست با امکان تغییرات بوسیله کاربران و به صورت دو طرفه ایجاد میکند . شما قادر نیستید به رکوردهایی که توسط کاربران دیگر اضافه شده­اند دسترسی پیدا کنید .
adOpenDynamic: شبیه به گزینه قبلی است با این تفاوت که رکوردهای تغییر داده شده و یا اضافه شده بوسیله سایر کاربران توسط شما هم در دسترس هستند .
:adOpenStatic رکوردستی که با این گزینه ساخته میشود به صورت ایستا خواهد بود . یعنی تغییرات در این رکوردست اثری ندارد .
پارامتر بعدی در متد Open پارامتر LockType است که میتوانید گزینه­های زیر را برای آن استفاده کنید :
adLockReadOnly: اجازه دستکاری رکوردست را به شما نمیدهد .
adLockOptimistic: رکوردها هنگام Update رکوردست قفل میشوند .
adLockPessimistic : رکوردها هنگام آغاز ویرایش قفل میشوند .
adLockBatchOptimistic : وقتی متد UpdateBetch روی رکوردست اجرا شود ، همه دسته ، قفل میشود .
برای پارامتر Option هم ، گزینه­های زیر را استفاده کنید :
adCmdText : مقدار پارامتر Source متن فرمان مورد نظر میباشد مثلا یک دستور SQL است .
adCmdTable : مقدار پارامتر Source نام جدولی است که همه فیلدهای آن برگردانده خواهد شد .
اضافه کردن و حذف رکورد از رکوردست :
به طور خلاصه برای اضافه کردن رکورد ابتدا متد AddNew از رکوردست را فراخوانی میکنیم و سپس فیلدها را مقدار میدهیم و در آخر متد Update را فراخوانی میکنیم . بهتر است قبل از همه این کارها کرسر را با استفاده از متد MoveLast به آخرین رکورد انتقال دهیم .

rst.MoveLast
rst.AddNew
rst!strName = txtName.Text
rst!strFamily = txtFamily.Text
rst!iAge = Val(txtAge.Text)
rst.Update
برای حذف رکورد از رکوردست ابتدا باید کرسر را به رکورد مورد نظر منتقل کنیم برای این کار از حلقه­ها استفاده میکنیم . پس از رسیدن به رکورد مورد نظر متد Delete از رکوردست را فراخوانی میکنیم و برای اعمال تغییرات رکوردست روی بانک متد Update را فراخوانی میکنیم :

Do While Not rst.EOF
If rst!strName = "mAm" And rst!strFamily = "BlackGhost" Then
rst.Delete
rst.Update
Exit Do
End If
Loop

استفاده از SQL :
یادگیری SQL به عهده خودتان میباشد . ما در اینجا فقط از یک select ساده استفاده خواهیم کرد . زمانیکه بخواهیم رکوردستی از فیلدهای انتخابی از یک جدول تشکیل دهیم . میتوانیم از SQL استفاده کنیم . برای این کار دستور SQL را به صورت یک رشته و یا متغیر رشته­ای به عنوان پارامتر Source از متد Open ارسال میکنیم و پارامتر آخر آن را هم برابر adCmdText قرار میدهیم . به عنوان مثال :

rst.Open "SELECT strName,strFamily FROM tblPerson", cnn, adOpenKeyset, adLockOptimistic,
adCmdText

و یا بدین صورت :

Dim strSQL As String
strSQL = "SELECT strName,strFamily FROM tblPerson"
rst.Open strSQL, cnn, adOpenKeyset, adLockOptimistic, adCmdText

که روش دوم از خوانایی بیشتری برخوردار است . این مثال­ها رکوردستی حاوی دو فیلد strName و strFamily تشکیل میدهند .
یک مثال دیگر

Dim strSQL As String
strSQL = "SELECT * FROM tblPerson WHERE Age=20
rst.Open strSQL, cnn, adOpenKeyset, adLockOptimistic, adCmdText

در این مثال رکوردستی حاوی مشخصات همه افرادیکه سن آنها 20 سال است تشکیل داده­ایم که همه فیلدهای جدول با استفاده از * در این رکوردست انتخاب شده­اند .
اگر فرض کنیم که در برنامه­ای بخواهیم اطلاعات مثال قبل را بدست آوریم اما سن مورد نظر را از کاربر بپرسیم از طریق زیر عمل میکنیم .

Dim strSQL As String
rst.Open strSQL, cnn, adOpenKeyset, adLockOptimistic, adCmdText

اگر دقت کرده باشید در این مثال­ها فرض بر این بوده است که فیلدی که در قسمت شرط در WHERE بکار رفته است از نوع عددی است . اما اگر بخواهیم از فیلدهای رشته­ای استفاده کنیم بازهم باید تغییر کوچکی در آن بدهیم و از کدهای زیر استفاده کنیم :

strSQL = "SELECT * FROM tblPerson WHERE strName=' " & txtName.Text & " ' "

دراستفاده از دستورات SQL باید به این نکته توجه کرد که در قسمت شرط Where باید مقدار بعد از تساوی را بین علامتهای محصور کنید بنابراین از روش بالا برای این کار استفاده کرده­ایم . البته برای اینکه این علامت کوچک به راحتی دیده شود دو طرف آن را علامت فاصله قرار داده­ایم که این کار را شما نباید انجام دهید .

TKNC
30-08-2010, 13:51
بخش پایانی

ویرایش رکورد :
ما درباره حذف و اضافه کردن رکوردها در بخش گذشته بحث کردیم و حالا میخواهیم ویرایش رکورد را بررسی کنیم . برای ویرایش رکورد کافی است ابتدا رکوردست مورد نظر را تشکیل دهیم و سپس رکورد را در آن جستجو کنیم و پس از پیدا کردن رکورد فیلدهای آن را به مقدار جدید ست و در آخر رکوردست را Update کنیم . به مثال زیر بدون توجه به منطق آن توجه کنید :

Dim cnn As ADODB.Connection
Dim rst As New ADODB.Recordset
.
.
.
Do While Not rst.EOF
If rst!strName = txtName.Text Then
rst!Family = txtFamily.Text
rst!No = txtNo.Text
rst.Update
Exit Do
End If
rst.MoveNext
Loop
rst.Close
Set rst = Nothing
روال های ذخیره شده ( StoredProcedure ) :
روال­های ذخیره شده در حقیقت دستورات SQL هستند که در قالب Query در بانک اطلاعاتی ذخیره شده­اند . یعنی در این روش ما Query های موجود در بانک اطلاعاتی را اجرا میکنیم . این روش نسبت به روش استفاده از رشته SQL در متد Open چندین مزیت دارد :
1-برای ساختن روال­های ذخیره شده میتوانید از ابزار ویزارد بانک اطلاعاتی استفاده کنید . بدین ترتیب میتوانید دستورات SQL پیچیده را ظرف مدت زمان کوتاهی ایجاد کنید .
2-سرعت اجرای روال­های ذخیره شده بیشتر است زیرااین روال­ها به صورت داخلی اجرا شده و نتیجه آن به عنوان رکوردست برگردانده میشود . در صورتیکه روش قبلی در حقیقت فیلتر گذاشتن روی خروجی یک رکوردست میباشد .
3- خوانایی سهولت استفاده از دستورات SQL پارامتریک که این امر باعث کاهش حجم کد شما خواهد شد .
4- خوانایی برنامه که از نظر مهندسی نرم افزار امر بسیار مهمی است بسیار بیشتر خواهد بود .
برای اجرای روال­های ذخیره معمولی باید از شی Command و نوع پارامتریک آنها از اشیای Command و Parameter استفاده کرد . بهتر است روش استفاده از شی Command را با استفاده از یک مثال توضیح دهیم .
پس به مثال زیر توجه کنید :

Dim cnn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim rst As New ADODB.Recordset
cnn.Open "Provider=Microsoft.jet.oledb.3.51;Data source=" & App.Path & "\Site.mdb"
cmd.ActiveConnection = cnn
cmd.CommandText = "qryInDatabase"
cmd.CommandType = adCmdStoredProc
Set rst = cmd.Execute
Do While Not rst.EOF
Print rst!AddressName
rst.MoveNext
Loop
rst.Close
cnn.Close
Set rst = Nothing
Set cmd = Nothing
Set cnn = Nothing
در این مثال همه چیز گویاست به جز CommandType و CommandText و Execute . خاصیت CommandType نوع دستور را تعیین میکند که در اینجا قصد استفاده از روال ذخیره شده را داریم .
خاصیت CommandText را وقتی مه مقدار خاصیت قبلی را برای استفاده از روال ذخیره شده تعیین کنیم باید برابر نام Query در بانک اطلاعاتی قرار گیرد . متد Execute برای اجرای دستور مورد نظر بکار میرود .
خروجی متد Execute یک شی رکوردست است که با استفاده از دستور Set به یک شی رکوردست نسبت میدهیم . این مثال برای یک Query بدون پارامتر میباشد . برای استفاده از Query های پارامتریک باید از شی Parameter استفاده کنیم .
استفاده از شی Parameter :
با یک مثال استفاده از شی parameter را بررسی میکنیم .

Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim cmd As New ADODB.Command
Dim prm As New ADODB.Parameter
Dim strCon As String
strCon = "Provider=Microsoft.Jet.Oledb.3.51;Data Source=" + App.Path + "\db1.mdb"
'Debug.Print strCon
cnn.Open strCon
cmd.ActiveConnection = cnn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "qryFamily"
prm.Name = "Family"
prm.Type = adBSTR
prm.Value = "safdel"
cmd.Parameters.Append prm
Set rst = cmd.Execute
Do While Not rst.EOF
lstTest.AddItem rst!Name
rst.MoveNext
Loop
rst.Close
cnn.Close
در این مثال فقط قسمت­های مربوط به شی prn جدید میباشند . خاصیت Name از شی prm نام فیلدی است که بصورت پارامتریک میباشد . Type نوع فیلد را تعیین میکند . خاصیت Value مقدار ارسالی به پارامتر مورد نظر میباشد .
پس از تنظیم خواص لازم از شی Prm بااستفاده از متد Append از شی Command این پارامتر را به شی Command متصل میکنیم و در نهایت با فراخوانی متد Excute از شی Command رکوردست را تحویل میگیریم .
بدست آوردن اطلاعات از ساختار بانک اطلاعاتی :
با استفاده از متد OpenSchema از شی Connection میتوانیم لیستی از جداول موجود در یک بانک اطلاعاتی را به صورت یک رکوردست بدست آوریم .

Public Function OpenSchemaX() As String
Dim Cnxn As ADODB.Connection
Dim rstSchema As ADODB.Recordset
Dim strCnxn As String
Dim strStruct As String
Set Cnxn = New ADODB.Connection
strCnxn = "Provider=Microsoft.Jet.Oledb.3.51;Data Source=" + App.Path + "\db1.mdb"
Cnxn.Open strCnxn
Set rstSchema = Cnxn.OpenSchema(adSchemaTables)
Do Until rstSchema.EOF
strStruct = strStruct + "Table name: " & rstSchema!TABLE_NAME & "Table type: " &
rstSchema!TABLE_TYPE + vbCrLf
List1.AddItem strStruct
rstSchema.MoveNext
Loop
OpenSchemaX = strStruct
rstSchema.Close
Cnxn.Close
Set rstSchema = Nothing
Set Cnxn = Nothing
End Function
Private Sub Form_Load()
Text1.Text = OpenSchemaX
End Sub
تابع OpenSchemaX لیستی از اجزای بانک اطلاعاتی را به صورت یک رشته برای شما بر میگرداند . شما میتوانید با استفاده از متد Save از شی رکوردست یک رکوردست را در فایل ذخیره کنید .
مباحث ADO را همینجا تمام میکنیم . منتظر نظرات شما هستم .

باتشکر Tknc