PDA

View Full Version : سوال: بک آپ اتوماتیک از دیتا بیس در زمان و مکان مشخص شده توسط کاربر



ashkan1234
یک شنبه 03 دی 1391, 10:31 صبح
با درود!
خیلی خلاصه یک فرمی داریم که 3 تا تکست باکس داره که کاربر تو اون مشخص میکنه که چند دقیقه یک بار و در چه مکانی از هارد و با چه نامی بک آپ اتوماتیک از دیتابیس گرفته شود!آیا راهی برای این وجود داره؟
دیتابیس access هستش!

حمید محمودی
یک شنبه 03 دی 1391, 22:41 عصر
بله؛ کافیه که یه شمارنده بزارید تا در فواصل زمانی مشخص فایل MDB رو بیاد در محل مورد نظر کپی بکنه. کد مربوط به بک اپ در فروم هست؛و بارها بحث شده. سرچ کنید پیدا میکنید.

ashkan1234
دوشنبه 04 دی 1391, 13:27 عصر
بله؛ کافیه که یه شمارنده بزارید تا در فواصل زمانی مشخص فایل MDB رو بیاد در محل مورد نظر کپی بکنه. کد مربوط به بک اپ در فروم هست؛و بارها بحث شده. سرچ کنید پیدا میکنید.

ممنون این روالی که فرمودید رو میدونم،منتهی میخوام بصورت دستی توسط کاربر تنظیمات این کار انجام بشه!
در این مورد بنده چیزی یافت نکردم!
اگر بحث شده لطفا لینک مربوط را قرار بدید!

حمید محمودی
دوشنبه 04 دی 1391, 14:59 عصر
این برنامه شما که تنظیمات خاصی نداره. کلا این تنظیماتشه :



مسیر کامل فایلی که میخواید بک اپ بگیرد ازش
مسیر نهایی بک اپ گیری
فاصله زمانی بک اپ گیری


گزینه اول رو با یک OpenDialog انتخاب میکنید و در Text1 قرار میدید؛
گزینه دوم رو هم فقط پوشهء مورد نظر رو برای مسیر بک اپ گیری انتخاب میکنید
میمونه گزینه اخر، که وقتی کافیه بگین مثلا هر 10 دقیقه یکبار این عمل بک اپ گیری رو انجام بده؛ خب در اینجا، یک شمارنده میزارید که وقتی زمان به اون لحظه مورد نظر رسید، اون عمل رو انجام بده.

تمام این تنظیمات رو میتونید توی ریجستری/فایل XML/فایل INI/خود دیتابیس یا .... ذخیره کنید.

کدی که نیاز دارید رو بصورت یکجا، ندیدم جایی. ولی کار بسیار ساده ای هست. با استفاده از تاپیک زیر و یک سورس Stopwatch / CountDown میتونید کار مورد نظرتون رو انجام بدید

http://www.vbforums.com/showthread.php?499872

ashkan1234
سه شنبه 05 دی 1391, 18:50 عصر
متاسفانه کارم راه نیفتاد!
اگه مقدور بود بیشتر راهنمایی کنید یا کدهای اتو بک آپ که به کار من میاد رو قرار بدید تا مابقی رو خودم بنویسم(فقط اگه مقدوره کدهای مربوطه رو قرار بدید...)

vbhamed
چهارشنبه 06 دی 1391, 09:32 صبح
سلام

گذاشتن يك فرم و چند تا تكست باكس براي تنظيمات كه كار خاصي نداره
ذخيره كردن تنظيمات هم مي‌تونه تو يك ديتابيس ديگه باشه يا فايل Ini يا رجيستري و ... كه نمونش تو سايت زياده

بعدش يك ماژول به برنامت اضافه كن و چند تا متغير عمومي كه تنظيمات رو تو خودشون نگه مي‌دارن تعريف كن و مواردي كه در اون فرم تنظيمات نوشتي رو تو اين متغيرها هم بريز، بعد يك تايمر مي‌زاري كه زمان رو نگه داره و در متد Timer1_Timer دستورات كپي از ديتابيس رو مي‌نويسي به عنوان نمونه يك ماژول تعريف شده و دستورات تايمر نوشته شده

1 - تنظيمات پيش فرض 300 ثانيه معادل 5 دقيقه و پشتيبان در مسير C:\MyProgram\Backup هست
2 - در متد Timer1_Timer نام ديتابيستون رو به جاي متغير MyDatabaseFile بزاريد
3 - مسير پشتيبان بدون علامت \ در آخرش باشه و در متغير BackupName هم فقط نام و پسوند فايل بكاپ رو بديد
4 - حتما از منوي Project گزينه References آيتم Microsoft Scripting Runtime رو تيك بزنيد
5 - چون تايمر در فرم تنظيمات گذاشته شده اول برنامه بايد اين فرم بارگزاري بشه و Unload هم نشه، البته مي‌تونيد خودتون جاي تايمر رو عوض كنيد و در فرمي ديگه قرار بدين

كد ماژول (تعريف متغيرهاي سراسري به اضافه متدي جهت ايجاد پوشه هاي تو در تو)
Global BackupStartTime As Date
Global BackupTime As Long
Global BackupPath As String
Global BackupName As String
Global fso As New FileSystemObject

Public Function Createdir(ByVal strDir As String) As Boolean

On Error Resume Next

Dim bytMax As Byte
Dim bytNdx As Byte
Dim strDirLevel As String

If Right$(strDir, 1) <> "\" Then

strDir = strDir & "\"

End If

bytMax = Len(strDir)

For bytNdx = 4 To bytMax

If (Mid$(strDir, bytNdx, 1) = "\") Then

strDirLevel = Left$(strDir, bytNdx - 1)

If Dir$(strDirLevel, vbDirectory) = "" Then

fso.CreateFolder strDirLevel

End If

End If

Next

If fso.FolderExists(strDir) Then

Createdir = True ' Succeeded creating directory

Else

Createdir = False ' Failed creating directory

End If

End Function

كد فرم
Private Sub cmdSave()

On Error Resume Next

BackupTime = text1
BackupPath = text2
BackupName = text3

'در اين قسمت كد ثبت تنظيمات در فايل يا ديتابيس نوشته شود

End Sub

Private Sub Form_Load()

On Error Resume Next

'در اين قسمت كد خواندن تنظيمات از فايل يا ديتابيس نوشته شود
'BackupTime = (load from database or File)
'BackupPath = (load from database or File)
'BackupName = (load from database or File)

If BackupTime = 0 Then BackupTime = 120 '300 second (5 Minute)
If BackupPath = "" Then BackupPath = "C:\MyProgram\Backup"
If BackupName = "" Then BackupName = "DatabaseBackup.mdb"

BackupStartTime = Now
Timer1.Interval = BackupTime

End Sub

Private Sub Timer1_Timer()

On Error Resume Next

Timer1.Enabled = False

If DateDiff("s", BackupStartTime, Now) < BackupTime Then Exit Sub

BackupStartTime = Now

Createdir BackupPath
fso.DeleteFile BackupPath & "\" & BackupName, True
fso.CopyFile MyDatabaseFile, BackupPath & "\" & BackupName, True

Timer1.Enabled = True

End Sub


فقط در مورد زمانگيري، در شروع برنامه دستور BackupStartTime = Now ساعت و تاريخ جاري رو در متغير BackupStartTime قرار ميده و در تايمر ساعت و تاريخ جاري با اين متغير مقايسه ميشه و اگر زمان مورد نظر رسيده بود عمل كپي انجام ميشه، دقت كنيد كه نمي‌تونيد براي اينتروال تايمر عدد خيلي بزرگي بزاريد براي همين از اين روش هم مطمئن تر هست استفاده شده
ضمنا شما زمان رو در فرم تنظيمات به ثانيه بدين و اگر دوست داشتين به دقيقه باشه فقط در متد Timer1_Timer به جاي "s" عبارت "m" رو قرار بديد

ashkan1234
چهارشنبه 06 دی 1391, 14:51 عصر
با سلام!
از اینکه وقت گذاشتید و پاسخ دادید ممنونم!
طبق فرمایشاتون عمل کردم ولی پاسخگو نبود!
خطا نمیده ولی عمل هم نمیکنه!
فایل را ضمیمه نمودم،اگه براتون مقدور بود بررسی نمایید!
برای نام فایل هم تصمیم گرفتم نام توسط کاربر قابل تغییر نباشد!به همین دلیل یک متغیر String با نام Name تعریف کردم و ساعت جاری سیستم رو تو اون قرار دادم!
با سپاس فراوان!تایمر هم در فرم اصلی قرار دادم(چون فرم تنظیمات نباید اجرا بشه!)
97299

vbhamed
پنج شنبه 07 دی 1391, 13:25 عصر
سلام

1 - در دستور زير نام ديتابيس به همراه مسير اون بايد داخل گيومه نوشته بشه، ضمنا متغيرهاي عمومي هم كه تعريف شدن بايد به همون صورت استفاده بشن چون وقتي شما فرم تنظيمات رو لود نكنيد مقدار ندارن
2 - به تايمر هم Interval ندادين يعني اصلا برنامه اجرا نميشه
3 - متغيري به نام Name نبايد داشته باشين چون اين كلمه جزء كلمات كليدي VB هست
4 - وقتي برنامه مي‌خواد كپي بگيره بايد ارتباط ADODC با ديتابيس قطع شده باشه وگرنه كپي انجام نميشه
5 - اون كدهايي كه تو Form_Load از فرم تنظيمات نوشته شده اول اجراي برنامه بايد اجرا بشن، حالا اگر شما از فرم ديگه اي استفاده مي‌كنيد بايد اون كدها رو تو اون فرم بزاريد

fso.CopyFile Dtb.mdb, frmsetting.Text1.Text & "\" & frmsetting.Name, True

اين اشكالات رو رفع كنيد اگر نشد دوباره پيام بدين

ashkan1234
پنج شنبه 07 دی 1391, 21:45 عصر
با درود و سپاس فراوان!
اگر زحمتی نیست یکبار دیگه فایل ضمیمه را بررسی نمایید!
تغییراتی که فرمودید را اعمال نمودم(البته اگر صحیح اعمال نموده باشم)!
برای Disconect شدن ADODC هم قبل از کپی چک کنید ببینید کدشو درست نوشتم!
Interval تایمر رو هم یک گذاشتم!
ممنونم...
97396

vbhamed
جمعه 08 دی 1391, 22:37 عصر
سلام

اين يك نمونه
Interval تايمر روي 1000 گذاشتم يعني هر 1000 ميلي ثانيه يا هر 1 ثانيه يكبار چك مي‌كنه ببينه زمان بكاپ گرفتن هست يا نه
براي زياد كردن زمان از فرم تنظيمات استفاده كنيد كه در اصل متغير BackupTime تنظيم ميشه

براي كم و زياد كردن زمان، Interval تايمر رو دست نزنيد و البته پيشنهاد من اينه كه Interval روي 5000 يا 10000 باشه يعني برنامه هر 5 يا 10 ثانيه يكبار چك كنه زمان پشتيبانگيري رسيده يا نه تا خيلي فشار به سي پي يو نياد

تنظيمات رو هم در شروع برنامه بارگزاري نكرده بوديد كه انجام شد
ضمنا تو پست قبلي گفتم نام ديتابيس داخل گيومه ( "" ) باشه نه پرانتز، البته اصلاح شد

متغير Name هم نياز نيست چون قبلا با نام BackupName تعريف شده، ضمنا اسم فايل نمي‌تونه برابر Time باشه چون در Time كاراكتر غير مجاز هست، من براتون تغييرش دادم و كاراكترهاي غير مجازش رو حذف كردم

برنامه نمونه هر 5 ثانيه يكبار پشتيبان مي‌گيره كه با تغيير همون "s" به "m" در متد Timer1_Timer مي‌تونيد به دقيقه تبديلش كنيد

ashkan1234
شنبه 09 دی 1391, 10:23 صبح
خیلی ممنون از لطف شما...
منتهی یه چندتایی سوال:
وقتی در متد تایمر1 "s" را به "m" تغییر میدم دیگه بک آپ نمیگیره(امتحان کنید،تو فرم تنظیمات تکست باکس مربوطه را 1 قرار دهید تا یک دقیقه یکبار بک آپ بگیرد!)
خودم وقتی عدد "0.1" قرار دادم هر یک ثانیه میگیره ولی عدد صحیح که میزارید دیگه بک آپ نمیگیره!
دوم اینکه اصول کار بک آپ گرفتن کدوم یک از موارد زیره:
1-هر بار که بک آپ اتوماتیک میگیره با یک نام جدید اینکارو بکنه؟(مثل الان)؟
2-هر بار که بک آپ اتوماتیک میگیره رو همون قبلیه جایگزین کنه؟!
کدوم اصولی تره؟
ممنون از پاسخگوییتون!
واسه پرانتز و گیومه هم حواسم جمع نبود اشتباه کردم،ممنون که تصحیح نمودید!

vbhamed
شنبه 09 دی 1391, 14:03 عصر
سلام

درست ميگين، اشتباه شد به جاي "s" از "n" استفاده كنيد
هر بار بكاپ نام جديد داشته باشه ولي چند دقيقه يكبار خيلي زياده چند ساعت يا روزي يكبار كافيه
مي‌تونيد هم كاري كنيد كه هر وقت تغييري در اطلاعات دادين بكاپ بگيره ولي خيلي زياد هم نشه
من خودم موقع خروج از برنامه پشتيبان اتوماتيك مي‌گيرم و معمولا كفايت مي‌كنه