PDA

View Full Version : کار با پایگاه داده خارجی بوسیله DAO



id1385
دوشنبه 13 بهمن 1393, 22:27 عصر
با سلام
یکی از دوستان یه آموزش میخواست برای کار با یک پایگاه داده خارج از خود برنامه، که یه نمونه براش برنامه درست کردم که با کتابخانه dao هستش، اتچ می کنم شاید مورد استفاده دوستان قرار بگیره.

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

محتویات کلاس:

Public Function conectToDB(dbPath As String, Optional dbPassword As String) As Boolean


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

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

Dim dB As New dBA


که dBA همون نام کلاس هستش

رمزدار

dB.conectToDB CurrentProject.Path & "\dB\data1.mdB", "123456789"


بدون رمز

dB.conectToDB CurrentProject.Path & "\dB\data1.mdB", ""
' or
dB.conectToDB CurrentProject.Path & "\dB\data1.mdB"



فانکشن بعدی

Public Function setSql(StrSql As String) As Boolean


همونطور که از اسمش پیداست sql رو میگیره
به این صورت:

dB.setSql "SELECT MAX(userId) AS highest FROM tbl_a"
' or
dB.setSql "tbl_a"
' or
dB.setSql "SELECT * FROM tbl_a WHERE userId ='" & newUserId & "'"

برای این فانکشن یا متد هر نوع sql ای که قابلیت اجرا داشته باشه را میشه ارجاع داد


متد بعدی

Public Function isValidProcess() As Boolean

این متد چک میکنه که آیا پردازش قابل اجرا هست یا نه، به این صورت که وقتی یک sql ارجاع داده میشه اگر recordset با خطا مواجه باشه و ست نشده باشه false رو بر میگردونه

متد آخر این کلاس

Public Function gRecordCount() As String

اینم تعداد رکوردهای سلکت شده رو برمیگردونه هر چند اینو توی پردازش هم میشه گرفت


بعد از اینکه رکوردست ایجاد شد میتوان بقیه پردازش رو اعم از select, add,delete,update بوسیله dB.rst. پیگیری کرد
مانند کد زیر که وظیفه اففزودن یک مورد را بعهده میگیره:

'add new item
If (dB.isValidProcess) Then
dB.rst.AddNew
dB.rst.Fields("userId") = "sampleID"
dB.rst.Fields("name") = "That's User "
dB.rst.Fields("date") = Now
dB.rst.Update

'close database
dB.cloesDB
Else
'Process not valid
MsgBox "invalid"
End If



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

Option Compare Database


Private Sub Command0_Click()
'create instance of class
Dim dB As New dBA
Dim newUserId As String
newUserId = 0


'connect to database using custom params
dB.conectToDB CurrentProject.Path & "\dB\data.mdB", "8661645875"


'get highest value in userid field and sum +1
dB.setSql "SELECT MAX(userId) AS highest FROM tbl_a"
If IsNull(dB.rst.Fields("highest")) = False Then
newUserId = dB.rst.Fields("highest")
End If
newUserId = CInt(newUserId) + 1


'select a table
dB.setSql "tbl_a"

'add new item
If (dB.isValidProcess) Then
dB.rst.AddNew
dB.rst.Fields("userId") = newUserId
dB.rst.Fields("name") = "Tha's User " & newUserId
dB.rst.Fields("date") = Now
dB.rst.Update


'select last inserted data
dB.setSql "SELECT * FROM tbl_a WHERE userId ='" & newUserId & "'"
If (dB.gRecordCount > 0) Then
MsgBox "new row:" & vbNewLine & "name: " & dB.rst.Fields("name") & vbTab & "date: " & dB.rst.Fields("date"), vbInformation, "test"
End If


'close database
dB.cloesDB
Else
'Process not valid
MsgBox "invalid"
End If
End Sub






امیدوارم مورد استفاده دوستان قرار گرفته باشه.

id1385
یک شنبه 19 بهمن 1393, 00:52 صبح
با سلام
فرمی برای برنامه اضافه شده که به صورت پیشرفته تری اطلاعات رو ثبت میکنه، فایل مربوطه نیز اتچ شده.


موفق باشید
تصویر فرم :

abdoreza57
سه شنبه 21 بهمن 1393, 22:59 عصر
سلام

برنامه خوبی ارایه نمودید ققط نمیدونم چرا سرعت عملیات کند میشه تو این روش !

هم موقع باز شدن برنامه هم با زیاد شدن حجم جدولها سرعت جستجو پایین میاد !

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

خدا نگهدار

id1385
چهارشنبه 22 بهمن 1393, 00:17 صبح
خوبی این روش این است که شما فرمها و پایگاه داده رو از هم جدا میکنید و اینکه بوسیله کانکشن استرینگ به پایگاه داده متصل میشید همونطور که عرض کردم این نمونه هست و اگه کسی بخواد بنویسه میتونه استاندارتر بنویسه
سرعت لود فکر نمیکنم تفاوت آنچنانی داشته باشه و تنها در ایجاد کانکشن شاید کمی تاخیر احساس بشه ولی اونم بیشتر بخاطر اینه که پایگاه داده رمز داره

در مورد لینک هم، نمیدونم شاید من با کدنویی راحت ترم، در کدنویسی دستم بازتره و به نظرم برنامه منعطف تر میشه تا اینکه از خاصیت bound یا link خود اکسس استفاده کنم هرچند قبلاً از هر دو روش استفاده کردم
اینم بگم که من با اکسس دیگه کار نمیکنم.

برنامه قبلی: http://barnamenevis.org/showthread.php?221938-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%A7%D9%86%D8%A8%D8%A7%D8%B1%D8%AF%D8%A7%D8%B1%D B%8C-%DA%A9%D8%A7%D9%85%D9%84&p=2160842&viewfull=1#post2160842

موفق باشید