# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > دسترسی به داده ها (ADO.Net و LINQ و ...) >  حل مشکل پشتیبان گیری و بازیابی برای همیشه

## mohammad-gh

با سلام ، ابتدا باید عرض کنم که این تاپیک بعد از جستجوی کامل سایت ایجاد شده

من در برنامه ام می خواهم بدون اینکه تنظیماتی روی *Sql 2000* انجام شود از بانکم پشتیبان گیری کنم.
راههای زیادی در سایت پیشنهاد شده که عملی ترین آنها نیاز به این داره که یک نفر کاربلد و آشنا به sql تنظیماتی را در آن ایجاد کند .تازه اگر قرار است برنامه از طریق *install* و بدون دسترسی به *entrprice Maneger*  انجام شود نمی دانم چه طوری عملی است.

به هر حال من این نوع پشتیبان گیری را در برنامه *حسابداری هلو* دیدم که شامل امکانات زیر است :
1- وقتی دکمه پشتیبان گیری زده میشه از کاربر سوال می کنه کجا ذخیره کنم و کاربر با مشخص کردن جا شروع به پشتیبان گیری می شود.
2- این فایلها به صورت زیپ یا کددار هستند.
3- موقع بازگرداندن هم با انتخاب همان فایل کا تمام میشود.
---------------------------------------------------
*برنامه من در VS2005 و بانکم با sql2000 است.*
امیدوارم در پایان این بحث کلمه *حل شده* را مقابل تاپیک ببینیم.

----------


## rezaei manesh

سلام دوست عزیز
برای پشتیبان گیری می تونی یه پروسیجر بنویسی و مسیر رو بهش پاس بدی و از کامپوننت ها هم برای فشرده سازی استفاده کنی و.. 
اما برای بازیابی اطلاعات میتونی فایل پشتیبان را از حالت زیب خارج کنی(با همان کامپوننتی که استفاده کردی) و بعد مسیر فایل رو به یه پروسیجر دیگه که برای بازیابی هست بفرستی 
اما مشکلبیشتر زمانی هست که می خوای بازیابی کنی و بهت پیغام می ده که یک کاربر داره از بانک استفاده می کنه و.. که اونم باید use master  رو اول sp بنویسی و بعد همه کاربرای بانکی رو که می خوای برگردانی رو از بین ببری و بعد پشتیبان بگیری که من موقع بازیابی کمی مشکل دارم (همین بانک داره استفاده می شه و..)
برای دیدن پروسیجر ها هم کلمه backup رو در قسمت sql همین سایت جستجو کن
موفق باشی

----------


## mohammad-gh

ابتدا از توجه شما متشکرم
اما:
 من در بخش sql کدی که بشود از داخل  vs2005 برای پشتیبان گیری استفاده کرد و بدون نیاز به دستکاری در sql باشد پیدا نکردم.
اگر ممکن است بیشتر توضیح بدید

----------


## Sub Zero

سلام دوست عزیز کارهایی که بهشون اشاره کردی (برنامه حسابداری هلو) کد نویسی بسیار ساده ای داره . در واقع یکی از ویژگیهای جدید .Net این اجازه رو به برنامه نویس میده که بدون استفاده از توابع Sql و تنها با اضافه کردن چند رفرنس و اجرای فانکشهای از پیش تعریف شده اونها ، اعمال مورد نظر رو انجام بده .
مراحل انجام کار رو برات توضیح میدم . 
ابتدا رفرنس های زیر رو به برنامتون اضافه کنید :
*Microsoft.SqlServer.Smo*
*Microsoft.SqlServer.ConnectionInfo*
 بعد *nameSpace* های زیر رو به صورت زیر به کلاستون Import کنید :
Imports System.Data.SqlClient
Imports Microsoft.SqlServer.Management.Smo
Imports Microsoft.SqlServer.Management.Common
کد زیر رو برای گرفتن پشتیبان از دیتابیس استفاده کنید.
 Public Shared Sub BackupDatabase(ByVal ConnectionStr As String, ByVal DevicePath As String)
Dim DataName As String="DataBaseName.bak"
        Using cnn As New SqlConnection(ConnectionStr)
            cnn.Open()
            Dim Srvcon As New ServerConnection(cnn)
            Dim Srv As New Server(Srvcon)
            ' Create backup device item for the backup
                    Dim bdi As New BackupDeviceItem(DevicePath & DataName, DeviceType.File)
            ' Create the backup informaton
            Dim Backup As New Backup
            Backup.Devices.Add(bdi)

            With Backup
                'Type Of Backup
                .Action = BackupActionType.Database
                .BackupSetDescription = "Backup DataBase"
                .BackupSetName = "DB"
                .Database = cnn.Database.ToString()
                .LogTruncation = BackupTruncateLogType.Truncate
                'Backup.ExpirationDate = New DateTime(2007, 5, 1) 
                ' Run the backup
                .SqlBackup(Srv)
            End With
        End Using
End Sub
پارامترهای این رویه شامل کانکشن استرینگ که رشته مربوط به اتصال به دیتابیس رو مشخص میکنه و *Device Path* که مسیر ذخیره بانک اطلاعاتی رو مشخص میکنه هست . شما میتونید با استفاده از یک *SaveFileDialog* این مسیر رو از کاربر دریافت کنید .
متغییر *DataName* نام فایل پشتیبان رو مشخص میکنه که پسوند اون *bak* است.
تا اینجا مربوط به پشتیبان گیری بود. برای انجام عمل restore از رویه زیر استفاده کنید.:
Public Shared Sub RestoreBackup(ByVal ConnectionStr As String, ByVal DevicePath As String)
        Using cnn As New SqlConnection(ConnectionStr)
            cnn.Open()
            Dim DBName As String = cnn.Database
            cnn.ChangeDatabase("master")
            Dim Srvcon As New ServerConnection(cnn)
            Dim Srv As New Server(Srvcon)
            ' Create backup device item for the backup
            Dim bdi As New BackupDeviceItem(DevicePath, DeviceType.File)
            ' Create the restore object
            Dim Restore As New Restore()
            'cnn.Close()
            With Restore
                .Devices.Add(bdi)
                .NoRecovery = False
                .ReplaceDatabase = True
                .Database = DataBaseName.bak
                ' Restore the database
                Srv.KillAllProcesses(DBName) 'Important Code For Remove All Processes
                .SqlRestore(Srv)
            End With
        End Using
End Sub

پارامترها مانند قبلند با این تفاوت که *Device Path* در اینجا شامل مسیر ونام بانک اطلاعاتی است که میتوان با استفاده از *OpenFileDialog* آن را از کاربر دریافت نمود . متد *ChangeDatabase* نیز باعث میشه مشکلی که جناب rezaei manesh بهش اشاره کردن پیش نیاد . برای اطمینان بیشتر متد  *KillAllProcesses* رو هم استفاده کنید . 
لازم به ذکر است که این روش رو خودم بارها پیاده سازی کردم وکاملا هم جواب داده . اگه جایی مشکل پیدا کردی مطرح کن .

----------


## rezaei manesh

سلام جناب sub zero 
دست تان درد نکنه من از این روش استفاده نمی کردم من از پروسیجر هایی که تو دات نت می سازم استفاده می کنم و.. اما روش شما رو هم دست می کنم فکر کنم بهتر و کم دردسر تر باشه
حالا اگه می شه راهنمایی کنید که اگه بخوایم این پشتیبان گیری رو از سمت کلاینت انجام بدیم 
چه مواردی رو باید رعایت کنیم 
1.دادن مسیر شبکه ای
2. دادن سطوح دسترسی مورد نیاز
3.و...

----------


## Sub Zero

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


تنها چیز عجیبی که در این مورد باهاش مواجه شدم این بود که اگر مسیر ماشین پشتیبان گیری (*BackupDeviceItem*)  یه کم طولانی میشد پیغام *Failed Backup* یا *Failed Restore* میداد . البته این مشکل فقط در کامپیوتر شرکت که به شبکه وصل بود پیش می یومد . توی کامپیوتر خونه همچین مشکلی نبود . شما هم تست کنید و نتیجه رو به من اطلاع بدید .

----------


## mohammad-gh

می خواهم قبل ار هر چیز از *sub zero* عزیز تشکر کنم ، کد شما بسیار کارآمد و زیبا بود.

اما حیفم می آید حالا که بحث به این خوبی پیش رفته این رو نپرسم.

به نظر شما بهترین روش *zip*  کردن یا کد دار کردن فایل Backup در vs20005 چیه؟
البته من شنیده ام که vb.net  یه ابزار برای این کار داره که فقط هم با خود این ابزار فایل از حالت فشرده در می اید، که البته این خود یک مزیت هم است.

----------


## linux

> می خواهم قبل ار هر چیز از *sub zero* عزیز تشکر کنم ، کد شما بسیار کارآمد و زیبا بود.
> 
> اما حیفم می آید حالا که بحث به این خوبی پیش رفته این رو نپرسم.
> 
> به نظر شما بهترین روش *zip* کردن یا کد دار کردن فایل Backup در vs20005 چیه؟
> البته من شنیده ام که vb.net یه ابزار برای این کار داره که فقط هم با خود این ابزار فایل از حالت فشرده در می اید، که البته این خود یک مزیت هم است.


کلاس های موجود در این فضا به شما کمک خواهند کرد،فایل ها فشرده شده ، این کلاس ها از استاندارهای تعریف شده در RFC 1951  http://www.faqs.org/rfcs/rfc1951.html
استفاده می کنند و تقریبا نرم افزارهای فشرده سازی با این فایلها کار می کنند ادامه توضیحات MSDN 

The System.IO.Compression namespace contains classes that provide basic compression and decompression services for streams. 
Classes 
   Class Description 
  DeflateStream  Provides methods and properties for compressing and decompressing streams using the Deflate algorithm. 
  GZipStream  Provides methods and properties used to compress and decompress streams. 
Enumerations 
   Enumeration Description 
  CompressionMode  Specifies whether to compress or decompress the underlying stream.

----------


## Sub Zero

> به نظر شما بهترین روش zip کردن یا کد دار کردن فایل Backup در vs20005 چیه؟


بهترین روش از نظر هر کسی یه چیزیه .روشی که من ازش استفاده میکنم به این شکله :
اگه برنامه WinRar رو نصب کرده باشید در محل نصب برنامه فایلی با نام Rar.exe وجود داره این فایل دارای قابلیتهای زیادیه . من این فایل رو در کنار برنامم کپی میکنم و با استفاده از سویچهای این فایل عمل فشرده سازی رو انجام میدم . مثال :
Using Prs As New Process
            Dim SynName As String = Path.GetFileNameWithoutExtension(DataName)
            With Prs
                .StartInfo.WorkingDirectory = "Synch"
                .StartInfo.Arguments = String.Format("a SynDB_{0}.syn -df", DataName)
                .StartInfo.FileName = "Rar.exe"
                .StartInfo.WindowStyle = ProcessWindowStyle.Hidden
            End With
            Prs.Start()
End Using
این کد باعث میشه فایل Rar.exe که در پوشه Synch در کنار فایل EXE برنامم قرار داره اجرا بشه .
دستور *a* برای ایجاد آرشیو استفاده میشه 
سوئیچ *df*  باعث میشه بعد از ایجاد ارشیو (عمل فشرده سازی) فایل اصلی پاک بشه 
این فایل برای Encrypt کردن فایلهای دیگه قابلیتهای زیادی داره مثلا با *Switch -HP* میتونید دیتا رو انکریپت کنید یا با *Switch -P* برای دیتا رمز بزارید . 
جهت اطلاعات بیشتر به راهنمای برنامه قسمت command Line Mode مراجعه کنید .

----------


## mohammad-gh

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

'-----------------compress file and code -----------
Dim filename AsString
filename = sfd.FileName + ".bak"
Try
_ZipUtility.CompressFile(filename, sfd.FileName)

Catch ex As Exception
MessageBox.Show("There was an error compressing the file" & vbCrLf & ex.Message, "Compression Sample", MessageBoxButtons.OK, MessageBoxIcon.Error)
EndTry

که در آن sfd نام فایل بک آپ است که از savefiledialog خوانده می شود.
البته در ادامه با این کد فایل اصلی را نیز حذف می کنیم.

File.Delete(filename)

این هم برای خارج گردن از حالت فشرده

Dim filename AsString
filename = ofd.FileName + ".bak"
Try
_ZipUtility.DecompressFile(ofd.FileName, filename)
Catch ex As Exception
MessageBox.Show("There was an error compressing the file" & vbCrLf & ex.Message, "Compression Sample", MessageBoxButtons.OK, MessageBoxIcon.Error)
EndTry
که اینبار ofd نام فایل است که از openfiledialog خوانده می شود.
فایل کلاس را هم ضمیمه کردم

----------


## elmira_63

این رفرنس هایی که گفته بودید به برنامه اضافه کنم رو توی قسمت add refrence رفتم ولی نداشتم ؟؟؟؟؟
sql هم درست نصب کردم !!!!!
این رفرنس هارو از کجا باید بیارم؟؟

----------


## touraj

> این رفرنس هایی که گفته بودید به برنامه اضافه کنم رو توی قسمت add refrence رفتم ولی نداشتم ؟؟؟؟؟
> sql هم درست نصب کردم !!!!!
> این رفرنس هارو از کجا باید بیارم؟؟


برو به این فولدر:
C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies folder 

dll های زیر رو به برنامه اضافه کن:

Microsoft.SqlServer.ConnectionInfo.dll
Microsoft.SqlServer.Smo.dll
Microsoft.SqlServer.SqlEnum.dll
Microsoft.SqlServer.SmoEnum.dll

----------


## elmira_63

ممنون از راهنماییتون ولی توی این آدرسی که گفتید من فولدر assembelies folder رو ندارم ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
یعنی sql رو درست نصب نکردم ؟؟؟

----------


## Dariuosh

> ممنون از راهنماییتون ولی توی این آدرسی که گفتید من فولدر assembelies folder رو ندارم ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
> یعنی sql رو درست نصب نکردم ؟؟؟


C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies

folder آخرش نيست

----------


## elmira_63

خب همون assembelies هم نیست توی فلدر sdk یه فلدر به نام include و یه فلدر به نام lib

----------


## touraj

> خب همون assembelies هم نیست توی فلدر sdk یه فلدر به نام include و یه فلدر به نام lib


از کدوم ورژن SQL استفاده می کنی؟

----------


## hamed-p

> تنها چیز عجیبی که در این مورد باهاش مواجه شدم این بود که اگر مسیر ماشین پشتیبان گیری (*BackupDeviceItem*) یه کم طولانی میشد پیغام *Failed Backup* یا *Failed Restore* میداد . البته این مشکل فقط در کامپیوتر شرکت که به شبکه وصل بود پیش می یومد . توی کامپیوتر خونه همچین مشکلی نبود . شما هم تست کنید و نتیجه رو به من اطلاع بدید .


درسته...
این پیغامشه:
Restore failed for Server '...'.

----------


## reza6384

سلام. ببخشید من نتونستم Microsoft.SqlServer.Management.Common رو Add کنم ، توی لیست NET.  و Common پنجره Add Reference هم نبود . چیکار کنم؟؟

----------


## reza6384

سلام جناب SubZero 
من پروسه Backup و Restore شما رو توی VS2005 اجرا کردم و مشکلم حل شد، اما یه نرم افزار هم روی VS2003 دارم که می خوام این کد ها رو به اون هم اضافه کنم ، اما موقع Add Reference فایل های DLL ای که گفتین ، این Error  رو نمایش میده و میگه نمی شه Add کنم. چرا؟

----------


## reza6384

کسی نیست این سوال من رو جواب بده؟

----------


## Sub Zero

نمی تونم جواب قطعی بدم اما احتمال میدم به این خاطر باشه که رفرنسهایی که میخواید اضافه کنید تنها با .Net Framwork 2 به بالا سازگاری داره . مثل این میمونه که شما بخواید یه برنامه که با 2005 نوشتید رو با 2003 باز کنید .
پیشنهاد : *متن کامل خطا رو در گوگل سرچ کنید.*

----------


## parsavb

ببخشید فضولی من گل کرده ، چرا از این dll استفاده نمی کنید هم راحت تره و هم اینکه با نسخه های مختلف مشکلی نداره 
Microsoft SQLDMO Object Library 8.5
یه نمونه از کار با اون رو تو اینجا گذاشتم
https://barnamenevis.org/showthread.php?t=110043

----------


## rezaei manesh

> بهترین روش از نظر هر کسی یه چیزیه .روشی که من ازش استفاده میکنم به این شکله :
> اگه برنامه WinRar رو نصب کرده باشید در محل نصب برنامه فایلی با نام Rar.exe وجود داره این فایل دارای قابلیتهای زیادیه . من این فایل رو در کنار برنامم کپی میکنم و با استفاده از سویچهای این فایل عمل فشرده سازی رو انجام میدم . مثال :
> Using Prs As New Process
>             Dim SynName As String = Path.GetFileNameWithoutExtension(DataName)
>             With Prs
>                 .StartInfo.WorkingDirectory = "Synch"
>                 .StartInfo.Arguments = String.Format("a SynDB_{0}.syn -df", DataName)
>                 .StartInfo.FileName = "Rar.exe"
>                 .StartInfo.WindowStyle = ProcessWindowStyle.Hidden
> ...


سلام
آقا این کد شما درست کار نمی کنه خطا هم نمی ده؟!
چند تا مشکل :
آدرس مبدا و منبا رو قید نکردی نام فایل رو در یک متغیر ریختی اما ازش استفاده نکردی؟!
در کل کد بالا کامل نیست؟
help رو هم خوندم اما دقیقا سر در نیاوردم
ببینید من فشرده سازی را با متد های دات نت انجام داددم از 1.6m اورد به 224k و همونو با winrar در ویندوز انجام دادم اومد 127k بخاطر همین می خوام با winrar فشرده کنم و...

----------


## Sub Zero

Shared Sub Compress()
        Using Prs As New Process
            Dim SynName As String = Path.GetFileNameWithoutExtension(DataName)
            With Prs
                .StartInfo.WorkingDirectory = "Synch"
                .StartInfo.Arguments = String.Format("a SynDB_{0}.syn {1} -df", SynName, DataName)
                .StartInfo.FileName = "Compress.exe"
                .StartInfo.WindowStyle = ProcessWindowStyle.Hidden
            End With
            Prs.Start()
        End Using
    End Sub

اینم کد درستش .
منظور از *SynDB_{0}.syn* نام فایلی که در مقصد ایجاد میشه که من به دلخواه خودم پسوند اونو Syn گذاشتم تا توسط ویندوز شناخته نشه *DataName* هم نام و مسیر فایل مبدا هست .

----------


## rezaei manesh

ممنون
 این فکر کنم که مشکل رو حل کنه

----------


## rezaei manesh

با سلام
من از کد شما استفاده کردم و کمی با تغییر اون همونی شد که من می خواستم و کلا حالا برای فشرده کردن هر کاری بخوام با این کد ها می کنم  که خیلی عالی هستش 
اما حالا می مونه خارج کردن فایل ها از حالت فشرده توسط کد یعنی می خوام وقتی طرف فایلی رو انتخاب می کنه اگه فشرده باشه خودم از اون حالت خارج کنم و بعد بازیابی رو انجام بدم
نتونسم سوئیچ هایی رو که مربوط به unzip هست رو پیدا کنم؟
ممنون می شم که راهنمایی کنید

----------


## Sub Zero

با عرض معذرت به خاطر تاخیر چند روزه .
از کد زیر برای UnZip استفاده کردم .:
Using Prs As New Process
            Dim SynName As String = Path.GetFileName(PathZip)
            With Prs
                .StartInfo.WorkingDirectory = Path.GetDirectoryName(PathZip)
                .StartInfo.Arguments = String.Format("X {0}  *.bak Dest", SynName)
                .StartInfo.WindowStyle = ProcessWindowStyle.Hidden
                .StartInfo.FileName = String.Format("{0}\Synch\Compress.exe", My.Application.Info.DirectoryPath)
            End With
            Prs.Start()
End Using
فکر کنم همه چی مشخص باشه فقط PathDB كه مسير فايل فشرده رو مشخص میکنه . و اینکه *bak.** مشخص ميكنه فقط فایلهای با این پسوند ازفایل استخراج بشن

----------


## rezaei manesh

سلام
آقا دستت درد نکنه
فقیط یه سوال Compress.exe چیه که قبلا هم نوشته بودی که من winrar.exeنوشتم چرا از این استفاده می کنی شما؟

----------


## Sub Zero

> فقیط یه سوال Compress.exe چیه که قبلا هم نوشته بودی که من winrar.exeنوشتم چرا از این استفاده می کنی شما؟


فايليه كه در محل نصب برنامه  Winrar با نام Rar.exe وجود داره و فقط به صورت CommandLine میشه باهاش کار کرد.

----------


## محسن بابائی

> درسته...
> این پیغامشه:
> Restore failed for Server '...'.


من هم این مشکل را دارم (توی کامپیوتر خونه) . راه حل ؟

----------


## rezaei manesh

سلام
آقا مصطفی من هنوز نتونستم unzipکنم
کد شما خطا داد و جای Compress من rar.exe نوشتم اما دیگه خطا نداد اما هیچ کاری هم انجام نمی شه؟
چرا فکر می کنید مشکل از کجاست 
شما این کد رو تست کردید؟
اگه می شه کد  بالا رو با ادرس دهی مستقیم بنویسید تا من ببینم مشکل از پارامترهای ورودی من نباشه
ممنون

----------


## Sub Zero

من که گفتم از این کد بارها استفاده کردم .راهنماش هم اینو نوشته :
---------------------
Command X - extract files from an archive with full paths


--------------------------------------------------------------------------------


Extract files and folder with full paths. The folder structure, saved in the archive, is completely restored. This is the command line equivalent of the archive management command Extract.

In a similar manner as *command e* this command can extract files both to the current folder and to a specified folder.

For example, command:

WinRAR x Fonts *.ttf

will extract *.ttf files from the archive Fonts to the current folder, but the command:

WinRAR x Fonts *.ttf NewFonts\

will extract *.ttf files from the archive Fonts to the folder NewFonts

You need to use the trailing backslash as in the example above for denoting the destination folder

----------


## محسن بابائی

سلام
تمام مشکلات Restore سر این یه خطه کده :

SqlConnection.ClearAllPools()


اینم نمونه کد 

Dim strSourcePath As String = Txt_SourcePath.Text + "\myDbBackUp.bak"
        Dim strData As String = txt_desPath.Text.Trim + "\myDb_Data.mdf"
        Dim strLog As String = txt_desPath.Text.Trim + "\myDb_Data.ldf"
        Dim strsql As String = "RESTORE DATABASE TaxiService FROM DISK = '" & strSourcePath & "' " & _
        " With Move 'myDbData_Data' TO '" & strData & "', " & _
        " Move'myDBData_log' TO '" & strLog & "'"
       
        'Exit Sub
        Dim servername As String = "."
        Dim db_UserName As String = "sa"
        Dim db_Userpass As String = "123456"

        Dim StrConn As String = "Server=" & servername & ";Database=Master;User ID=" & db_UserName & " ; Password=" & db_Userpass & ";"
        Dim cnn As New SqlConnection(StrConn)

        Dim cmdDetach As New SqlCommand("EXEC sp_detach_db 'myDb', 'true'", cnn)
        Dim cmdRestore As New SqlCommand(strsql, cnn)

        Try
            SqlConnection.ClearAllPools()

            cnn.Open()

            cmdDetach.ExecuteNonQuery()
            cmdRestore.ExecuteNonQuery()


        Catch ex As Exception


            MsgBox(ex.Message)

        Finally
            If (Not cmdRestore Is Nothing) Then cmdRestore.Dispose()
            If (Not cmdDetach Is Nothing) Then cmdDetach.Dispose()
            If cnn.State <> ConnectionState.Closed Then cnn.Dispose()
        End Try


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

موفق باشید

----------


## rezaei manesh

> درسته...
> این پیغامشه:
> Restore failed for Server '...'.


سلام دوستان یه چیز جالب ربطی به طولانی بودن مسیر نداره مشکل باید جایه دیگه باشه 
من همین کد رو در یک برنامه با sql2000 تست کردم مشکلی نبود اما همون کد رو با اس کیو ال2005 تست کردم در بعضی از مسیر ها همین خطا رو می داد مثل مسیر دسکتاپ من (C:\Documents and Settings\Hamed\Desktop\)  ویا مسیر ریشه یک درایو مثل(c:/) هم همین مشکل رو دارد اما در مسیر زیر کار می کند c:\bk 
فکر کنم یک اشکالی در sql2005 باشه نسخه 2005 من استاندارد ادیشن هست

----------


## jas1387

سلام

من یک فرم دارم که بر روی آن یک datagridview قرار دارد که در رویداد فرم لود از دیتابیس مقدار می 

گیرد

قسمت Backup گیری نیز در این فرم قرار دارد که وقتی می خواهم backup بگیرم پیغام می دهد که 

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

datagridview را پاک می کنم جواب می دهد )



 
 

   Dim server As New SQLDMO.SQLServer2

  Dim database As SQLDMO.Database2

  Dim backup As New SQLDMO.Backup2

  Dim restor As New SQLDMO.Restore2  Private Sub restore_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles restore.Click

     Dim openfiledialog1 As New OpenFileDialog

  Dim path As String

  server = New SQLDMO.SQLServer2

  server.LoginSecure = True

  openfiledialog1.Filter = "(*.bak)|*.bak"

  openfiledialog1.Title = "تعیین فایل برای بازیابی"  If openfiledialog1.ShowDialog = Windows.Forms.DialogResult.OK Then

  server.Connect(My.Computer.Name)

       database = server.Databases.Item("phone")

       restor.Database = database.Name

       path = openfiledialog1.FileName

       restor.Files = path

       restor.ReplaceDatabase = True

       restor.SQLRestore(server)

       server.DisConnect()

       restor = Nothing

       server = Nothing

       MsgBox("restor  انجام شد")

  End IfEnd Sub 
     
لطفا به من کمک کنید متشکرم :لبخند:

----------


## shanfamous

سلام
مشکلی که بعضی ها گفته بودن پیام Restore failed for Server '...'. میده علتش یه بخش اشتباه در کد restore که sub zero نوشته. 
باید به جای .Database = DataBaseName.bak بنویسیم .Database = DBName

----------


## elmira_63

سلام 
من تو برتامم هم backup می گیرم هم restore انجام میدم 
حالا میخوام یه قسمتی بهش اضافه کنم با عنوان backup گیری اتوماتیک که بشه فاصله زمانی و ساعت backup گیری رو اپراتور مشخص کنه 
البته میدونم که توی اسکیوال به راحتی میشه اینکارو انجام داد ولی من نمی تونم به کاربرم بگم باید حتما اسکیوال رو بلد باشی و میخوام توی برنامه این کارو انجام بدم اگه امکانش باشه 
به نظر خودم گفتم شاید بشه اینکارو توی اسکیوال انجام داد بعد کدش رو از اسکیوال استخراج کرد و تو وی بی ازش استفاده کرد

----------


## mohammad-gh

با سلام 
وقتی از برنامه و روی شبکه می خواهم پشتیبان بگیرم پیغام خطا رو میده.
بانک در روی یک کامپیوتر دیگر است و من از طریق شبکه این کار را می کنم.
Backup failed for Server
تمامی موارد بالا را هم چک کردم.
sql  من 2000 است.

----------


## Sub Zero

> سلام دوستان یه چیز جالب ربطی به طولانی بودن مسیر نداره مشکل باید جایه دیگه باشه 
> من همین کد رو در یک برنامه با sql2000 تست کردم مشکلی نبود اما همون کد رو با اس کیو ال2005 تست کردم در بعضی از مسیر ها همین خطا رو می داد مثل مسیر دسکتاپ من (C:\Documents and Settings\Hamed\Desktop\)  ویا مسیر ریشه یک درایو مثل(c:/) هم همین مشکل رو دارد اما در مسیر زیر کار می کند c:\bk 
> فکر کنم یک اشکالی در sql2005 باشه نسخه 2005 من استاندارد ادیشن هست


جناب رضایی منش بالاخره فهمیدم منشا این مشکل کجاست . ببینید در حالت پیش فرض Logon Type  سرور به صورت Network Services ست شده برای همین وقتی میخواد به درایو ویندوز دسترسی داشته باشه این خطا رو میده ( فقط درایو ویندوز) برای حل این مشکل باید  Logon Type  رو روی Local System  ست کنید مشکل حل میشه .(از طریق برنامه SQL Server Configuration Manager )
اگر هم قصد دارید تحت شبکه پشتبان گیری و بازگردانی رو انجام بدید سعی کنید برنامه رو توی درایوی غیر از درایو ویندوز نصب کنید چرا که دسترسی به درایو ویندوز ، تحت شبکه یه سری محدودیتها داره  
 برای اینکه دقیقا متوجه شید چه چیزی باعث بروز مشکل میشه از کد زیر در قسمت Catch  استفاده کنید.:
Catch ex As Exception
  MsgBox( *ex.InnerException.InnerException.Message*, 48, "پیغام")
 End Try

----------


## rezaei manesh

سلام
خیلی خوب می شه اگه حل بشه من امشب تست می کنم بهت می گم
ممنون از اینکه گیر و گور کار رو در می یاری حقیقتش من خیلی گشتم نشد

----------


## rezaei manesh

> جناب رضایی منش بالاخره فهمیدم منشا این مشکل کجاست . ببینید در حالت پیش فرض Logon Type  سرور به صورت Network Services ست شده برای همین وقتی میخواد به درایو ویندوز دسترسی داشته باشه این خطا رو میده ( فقط درایو ویندوز) برای حل این مشکل باید  Logon Type  رو روی Local System  ست کنید مشکل حل میشه .(از طریق برنامه SQL Server Configuration Manager )
> اگر هم قصد دارید تحت شبکه پشتبان گیری و بازگردانی رو انجام بدید سعی کنید برنامه رو توی درایوی غیر از درایو ویندوز نصب کنید چرا که دسترسی به درایو ویندوز ، تحت شبکه یه سری محدودیتها داره  
>  برای اینکه دقیقا متوجه شید چه چیزی باعث بروز مشکل میشه از کد زیر در قسمت Catch  استفاده کنید.:
> Catch ex As Exception
>   MsgBox( *ex.InnerException.InnerException.Message*, 48, "پیغام")
>  End Try


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

----------


## Sub Zero

اینم عکسش :

----------


## rezaei manesh

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

  'FilePath :"E:\VS2005\HomePrj\BongahPrgV2\BongahSadat_Rezvan  iMashhad\BongahPro870520\BongahPro\bin\Debug\BackU  p\"
            'FileName : "[1387_06_03].Zip"
            Using Prs As New Process
                Dim SynName As String = System.IO.Path.GetFileName(FileName)
                With Prs
                    .StartInfo.WorkingDirectory = System.IO.Path.GetDirectoryName(FilePath)
                    .StartInfo.Arguments = String.Format("X Src -hp141 *.bak Dest", SynName)
                    ' .StartInfo.Arguments = String.Format("a -ep -hp141 {1}{0}.Bak {1}{2} -df", SynName, FilePath, FileName)
                    .StartInfo.WindowStyle = ProcessWindowStyle.Hidden
                    .StartInfo.FileName = String.Format("{0}\System\Rar.exe", My.Application.Info.DirectoryPath)
                End With
                Prs.Start()
            End Using

----------


## Sub Zero

فکر کنم مشکلت تو این خط باشه :
.StartInfo.Arguments = String.Format("X Src -hp141 *.bak Dest", SynName)

به شکل زیر تغییرش بده :
.StartInfo.Arguments = String.Format("X *{0}* -hp141 *.bak Dest", SynName)

----------


## mohammad-gh

ببخشید آقای sub zero
من هنوز برای برنامه ام، *برنامه نصب* درست نکرده ام .
*1- حال اگر بخواهم انرا بر روی یک کامپیوتر دیگر که در آن بانک sql نصب نیست و از روی شبکه و از طریق ip به بانک متصل می شود ببرم این dll ها را در کجا بریزم تا پشتیبان گیری کار کند.*
*2- من بانکم را در سرور بر روی درایو C(درایو ویندوز) نصب کرده ام آیا به همین خاطر خطای "faield for server "را می دهد یا باید کار دیگری انجام دهم.*
*3- بانک من sql 2000 است.*
برنامه شما به صورت لوکال و در کامپیوتر خودم (vs2005 و sql2000 بر روی آن نصب است)کار می کرد.
منتظر راهنمایی شما و سایر اساتید هستم.

----------


## Sub Zero

> ببخشید آقای sub zero
> من هنوز برای برنامه ام، *برنامه نصب* درست نکرده ام .
> *1- حال اگر بخواهم انرا بر روی یک کامپیوتر دیگر که در آن بانک sql نصب نیست و از روی شبکه و از طریق ip به بانک متصل می شود ببرم این dll ها را در کجا بریزم تا پشتیبان گیری کار کند.*
> *2
> *


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




			
				- من بانکم را در سرور بر روی درایو C(درایو ویندوز) نصب کرده ام آیا به همین خاطر خطای "faield for server "را می دهد یا باید کار دیگری انجام دهم.
			
		

*


> *3- بانک من sql 2000 است.*
> برنامه شما به صورت لوکال و در کامپیوتر خودم (vs2005 و sql2000 بر روی آن نصب است)کار می کرد.


بله در چند پست قبل هم اشاره کردم که به دلیل محدودیتهایی که برای دسترسی به درایو ویندوز ، در شبکه وجود داره این مشکل پیش میاد پس سعی کنید برنامه و دیتابیس ها رو در درایوی غیر از درایو ویندوز نصب کنید . البته شاید راهی هم برای حل این مشکل باشه مثلا نوع *Authentication*  رو عوض کنیم اما من تا حالا امتحانش نکردم .

----------


## mohammad akbri

با سلام مراحل بکاپ گیری از بانک اطلاعاتی sqlserver2000 در vb.net به من بگوید با تشکر :لبخند گشاده!:

----------


## Sub Zero

> با سلام مراحل بکاپ گیری از بانک اطلاعاتی sqlserver2000 در vb.net به من بگوید با تشکر


به پست شماره 4 همین تاپیک مراجعه کنید

----------


## Mostafa_taheree

خیلی ممنون کاربر sub zero از بابت این کد backup

----------


## amir1385

با سلام
من همه مراحل بالا رو امتحان کردم ، فقط سرعت پشتیبان گیری (زمانیکه حجم بانک بالا میره ) داره پایین میاد . اما تو یه برنامه حسابداری دیدم در 2 ثانیه پشتیبان گیری می کرد هر چی هم حجم بانک بالا میرفت تاثیری در سرعت پشتیبان گیری نداشت . چطوری میشه سرعت رو بالا برد؟

----------


## araelectronic@ymail.com

با سلام

من براي بك آپ از كدهاي اينجا استفاده كردم ولي وقتي با سورس كار ميكنم مشكلي ندارم اما وقتي كه setup  تهيه ميكنم  backup failed to server ميده در صورت امكان دوستان راهنمايي بفرمايند. 
با تشكر

----------


## araelectronic@ymail.com

از دوستان كسي راهنمايي نميكنه؟

----------


## saeid_gobadi

سلام دوستان

فرمایش همه شما متین، اما مشکلی که هست اینه که sqlserver فایل رو در اختیار می گیره و نمی ذاره که باهاش کار کرد.

یعنی میگه که فایل توسط برنامه یا شخص دیگری داره استفاده می شه، مخصوصا زمانی که با SqlExpress کار می کنیم.

اگر لطف کنید راه حلی برای این مورد آخر ارائه بدین بی نهایت ممنون می شم.

----------


## HAMRAHSOFT.IR

> سلام دوست عزیز کارهایی که بهشون اشاره کردی (برنامه حسابداری هلو) کد نویسی بسیار ساده ای داره . در واقع یکی از ویژگیهای جدید .Net این اجازه رو به برنامه نویس میده که بدون استفاده از توابع Sql و تنها با اضافه کردن چند رفرنس و اجرای فانکشهای از پیش تعریف شده اونها ، اعمال مورد نظر رو انجام بده .
> مراحل انجام کار رو برات توضیح میدم . 
> ابتدا رفرنس های زیر رو به برنامتون اضافه کنید :
> *Microsoft.SqlServer.Smo*
> *Microsoft.SqlServer.ConnectionInfo*
>  بعد *nameSpace* های زیر رو به صورت زیر به کلاستون Import کنید :
> Imports System.Data.SqlClient
> Imports Microsoft.SqlServer.Management.Smo
> Imports Microsoft.SqlServer.Management.Commonکد زیر رو برای گرفتن پشتیبان از دیتابیس استفاده کنید.
> ...


ميشه يك نمونه قرا بديد

----------


## mohammad bayervand

دست دوستان درد نكنه مطالب بسيار جالب و مفيده

----------

