ورود

View Full Version : سوال: مشكل در تهيه فايل پشتيبان از بانك اطلاعاتي اي كه باز است



abas1388
دوشنبه 18 آذر 1392, 11:42 صبح
سلام
برنامه من داراي بانك اطلاعاتي اكسس است كه اين بانك در حالت share است .در مواقعي در طول روز ضرورت دارد از بانك اطلاعاتي فوق پشتيبان تهيه نمايم . اما وقتي كاربر يا كاربرهاي ديگر وارد برنامه خود شده اند در هنگام تهيه فايل پشتيبان خطاي باز بودن ديتابيس و مشغول بودن كاربر ديگر صادر ميشود.
آيا راهي وجود دارد كه در هنگام اجراي برنامه و اتصال ديگر كاربران به بانك اطلاعاتي از آن پشتيبان تهيه نمود؟
با تشكر

majid12376
سه شنبه 08 بهمن 1392, 18:23 عصر
تهیه فایل پشتیبان

On Error GoTo L1
Dim d
CommonDialog1.FileName = ""
CommonDialog1.Filter = ("*.Backup|*.Backup")
CommonDialog1.ShowSave

If CommonDialog1.FileName <> "" Then
d = MsgBox("ÂíÇ ãÇíá Èå ÔÊíÈÇä íÑí åÓÊíÏ¿", vbYesNo, "ÈÇÒíÇÈí")
If d = vbYes Then
a = CopyFile(App.Path & "\dbase.mdb", CommonDialog1.FileName, 0)
If a > 0 Then
MsgBox " ÚãáíÇÊ ÔÊíÈÇä íÑí ÈÇ ãæÝÞíÊ ÇäÌÇã ÔÏ ", vbInformation, ""
Else
MsgBox " ÚãáíÇÊ ÔÊíÈÇä íÑí ÈÇ ãÔ˜á ãæÇÌå ÔÏå ÇÓÊ ", vbExclamation, ""
End If
Else
End If
End If

Exit Sub
L1:

majid12376
سه شنبه 08 بهمن 1392, 18:27 عصر
بازیابی فایل پشتیبان
On Error GoTo L1
Dim d
CommonDialog1.FileName = ""
CommonDialog1.Filter = ("*.Backup|*.Backup")
CommonDialog1.ShowOpen
If CommonDialog1.FileName <> "" Then
d = MsgBox("ÂíÇ ãÇíá Èå ÈÇÒíÇÈí ÝÇíá ÇäÊÎÇÈí åÓÊíÏ¿", vbYesNo, "ÈÇÒíÇÈí")
If d = vbYes Then
a = CopyFile(CommonDialog1.FileName, App.Path & "\dbase.mdb", 0)
If a > 0 Then
MainForm.Adodc1.Refresh
MsgBox " ÚãáíÇÊ ÈÇÒíÇÈí ÝÇíá ÔÊíÈÇä ÈÇ ãæÝÞíÊ ÇäÌÇã ÔÏ ", vbInformation, ""
dbPath = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\dbase.mdb;"
Set Cnn = New ADODB.Connection
Cnn.CursorLocation = adUseClient
Cnn.ConnectionString = dbPath
Cnn.Open
Call Form_Load
Else
MsgBox " ÚãáíÇÊ ÈÇÒíÇÈí ÝÇíá ÔÊíÈÇä ÈÇ ãÔ˜á ãæÇÌå ÔÏå ÇÓÊ ", vbExclamation, ""
End If
Else
End If
End If
Exit Sub
L1:

vbhamed
جمعه 11 بهمن 1392, 12:36 عصر
سلام

چون فايل باز است تنها راه استفاده از دستورات SQL جهت كپي محتويات جداول به يك بانك ديگر است
فرض كنيد اسم فايل بانك شما db.mdb هست، فقط يكبار به صورت دستي يك كپي از بانكتون به نام dbtemp.mdb در جايي بگيريد و اطلاعات كليه جداول اون رو حذف كنيد

موقع پشتيبان گيري از فايل dbtemp.mdb يك كپي ديگه به نام دلخواه بگيريد مثلا dbbackup.mdb
دستور Sql رو با كد زير رو اجرا كنيد
Dim cn As New ADODB.Connection

cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\db.mdb;Persist Security Info=False"
cn.Execute "INSERT INTO Table1 IN 'd:\dbbackup.mdb' SELECT * FROM table1"
'...
'...
'...
cn.Close
با اينكار محتويات جدول Table1 از بانك db.mdb در همين جدول در بانك dbbackup.mdb كپي ميشه، مسير فايل بكاپ هم كه مشخصه
براي همه جدولها بايد اين دستورات رو اجرا كنيد

فقط يادتون باشه، هر بار كه قراره بكاپ بگيريد حتما بايد از فايل dbtemp.mdb كپي بگيريد تا جداول خالي داشته باشيد

Is Null
جمعه 11 بهمن 1392, 23:37 عصر
من از این روش استفاده میکنم.
فقط کافیه برای اولین بار که برنامه نصب میشه فایل خالی cmprs.mdb داخل درایو C یا هر جا که دوست دارید قرار بگیره. هر بار که کاربر قصد تهیه پشتیبان داشته باشه علاوه بر ساخت فایل پشتیبان اون فایل ساخته شده رو فشرده هم میکنه و در مسیر دلخواه کاربر قرار میده. قدیما که فلاپی بود، روی دیسک مستقیم ذخیره می کردیم :چشمک:


Dim Destination, SystemName, mydate As String
SystemName = ""
mydate = ""
Destination = ""

Path_ = App.Path + "\DataBase.mdb"
Kill "c:\cmprs.mdb"

Set db = CreateDatabase("c:\cmprs.mdb", dbLangGeneral, 32)
db.Close

Set wrkJet = CreateWorkspace("", "admin", "", dbUseJet)
Set dbcur = wrkJet.OpenDatabase("c:\cmprs.mdb", False, gnreadonly, "")
dbcur.Execute "select * into " & "Table1" & " from " & "[;database=" & Path_ + "]." & "Table1"
dbcur.Execute "select * into " & "Table2" & " from " & "[;database=" & Path_ + "]." & "Table2"
dbcur.Execute "select * into " & "Table3" & " from " & "[;database=" & Path_ + "]." & "Table3"
dbcur.Close

X = Shell("x:\database\WinRAR.exe a " & Destination + "" & SystemName + "" & mydate + ".rar c:\cmprs.mdb", vbNormalFocus)
Kill "c:\cmprs.mdb"

AbbasVB
چهارشنبه 16 بهمن 1392, 19:34 عصر
سلام
جناب vbhamed (http://barnamenevis.org/member.php?10624-vbhamed) روش خوبی ارائه کردند که سرعتش هم از روشی که خواهم گفت به احتمال زیاد بیشتر خواهد بود
ولی من هم یک روش دیگه می گم شاید به درد بقیه دوستان هم خورد
توی این روش کافیه شما یک فایل بانک اطلاعاتی خالی با همون جداول داشته باشید و اون رو توی مسیر مورد نظر کپی کنید
بعد دوتا کانکشن ایجاد می کنید
پس از باز کردن هر دو بانک با یه حلقه تا زمانی که بانک اصلی به پایان نرسیده رکورد ها رو یک به یک بخونه و توی بانک پشتیبان بریزه
توی این روش نیازی به بستن همه کانکشن های مرتبط با بانک اصلی نیست
همچنین با این روش می توانید یک Progressbar هم برای زیبایی اضافه کنید
شاید این روش یک مقدار کد نویسیش بیشتر باشه ولی خیلی مواقع می تونه بسیار کار آمد باشه
اگه دوستان متوجه نشدند یک نمونه خواهم گذاشت

موفق باشید