PDA

View Full Version : مشکل با VS2005 در موقع بکاپ گرفتن از دیتابیس



mohsen_metn
یک شنبه 15 دی 1387, 16:16 عصر
سلام
من در C# کدی برای بکاپ گرفتن از دیتا بیس نوشتم که ایراد می گیره کد رو در SQL SERVER چک کردم درست بود فکر می کنم مشکل از VS است. لطفا کمک کنید
در ضمن جستجو کردم و لی جوابی نگرفتم
کد در C#


SqlConnection connection = new SqlConnection(@"Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=club;Data Source=.\SQLEXPRESS");
connection.Open();
SqlCommand backup = new SqlCommand("BACKUP DATABASE club TO DISK = N'c:\\vb.bak'", connection);
backup.ExecuteNonQuery();
متن خطا



Cannot open backup device 'c:\vb.bk'. Operating system error 5(Access is denied.).

iranrose63
دوشنبه 16 دی 1387, 13:45 عصر
شما بدون ايجاد device پشتيبان تهيه كرديد.به همين خاطرهم بهتون خطا مي ده
ابتدا با دستور sp_addumpdevice يك دستگاه پشتيبان در مسير دلخواه ايجاد كنيد و بعد با دستور
backup database و دستگاه پشتيبان ايجاد شده نسخه پشتيبان را تهيه كنيد

mohsen_metn
دوشنبه 16 دی 1387, 15:18 عصر
شما بدون ايجاد device پشتيبان تهيه كرديد.به همين خاطرهم بهتون خطا مي ده
ابتدا با دستور sp_addumpdevice يك دستگاه پشتيبان در مسير دلخواه ايجاد كنيد و بعد با دستور
backup database و دستگاه پشتيبان ايجاد شده نسخه پشتيبان را تهيه كنيد
میشه بیشتر توضیح بدین

saied_genius
دوشنبه 16 دی 1387, 16:34 عصر
با سلام،

در هنگام Backup و Restore شما به بانك مورد نظر متصل هستيد.

معمولاً پس از Backup در آينده مي خواهيد از آن استفاده كنيد و Restore نماييد...

شايد بشود روش شما را اصلاح كرد ولي اگر بخواهيد به همان صورتي كه Backup گرفته ايد Restore نماييد ، به هيچ عنوان موفق نخواهيد شد.

زيرا ديتابيسي كه در حال استفاده است و اتصال شما به SQLServer از طريق آن است اجازه نمي دهد آنرا Restore نماييد. (حداقل در همه حالات جواب نمي دهد؛ و يك برنامه نويس بايد تمام حالت ها را در نظر بگيرد.)

شما مي توانيد براي اين كار ديتابيس در حال استفاده را از ديتابيس خود به "master" تغيير دهيد و پس از اتمام Backup و يا Restore به حالت اول بازگردانيد.

ولي من براي اين كار (چون خودم يك دور سر همين پدرم درآمده) يك Script نوشته ام كه ميتوانيد در برنامه خود به صورت Script فراخواني كنيد و يا آنرا به صورت Stored Procedure درآوريد. (كه بهتر است و راحت تر است)

اسكريپت Backup كه يك Stored Procedure براي Backup مي سازد.




USE [نام ديتابيس]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[BackupDB]


@BackupPath varchar(max)


AS


backup database [نام ديتابيس] to disk =@BackupPath with INIT, SKIP, NOUNLOAD, STATS = 10


RETURN



و

اسكريپت Restore كه يك Stored Procedure براي Restore مي سازد.





use [master]
GO


SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[RestoreDB]


@BackupPath varchar(max)


AS


RESTORE DATABASE [نام ديتابيس]
FROM DISK = " + "'" + RestorePath + "'" + " WITH RECOVERY, REPLACE


RETURN



در صورت هرگونه سوال در خدمتم.

موفق باشيد.

pars.engineer
دوشنبه 16 دی 1387, 23:13 عصر
سلام،
به تاپيك زير هم نگاهي بياندازيد.
http://www.barnamenevis.org/forum/showthread.php?t=120434

موفق باشيد.

majidsoft
جمعه 01 آبان 1388, 01:06 صبح
با سلام،

در هنگام Backup و Restore شما به بانك مورد نظر متصل هستيد.

معمولاً پس از Backup در آينده مي خواهيد از آن استفاده كنيد و Restore نماييد...

شايد بشود روش شما را اصلاح كرد ولي اگر بخواهيد به همان صورتي كه Backup گرفته ايد Restore نماييد ، به هيچ عنوان موفق نخواهيد شد.

زيرا ديتابيسي كه در حال استفاده است و اتصال شما به SQLServer از طريق آن است اجازه نمي دهد آنرا Restore نماييد. (حداقل در همه حالات جواب نمي دهد؛ و يك برنامه نويس بايد تمام حالت ها را در نظر بگيرد.)

شما مي توانيد براي اين كار ديتابيس در حال استفاده را از ديتابيس خود به "master" تغيير دهيد و پس از اتمام Backup و يا Restore به حالت اول بازگردانيد.

ولي من براي اين كار (چون خودم يك دور سر همين پدرم درآمده) يك Script نوشته ام كه ميتوانيد در برنامه خود به صورت Script فراخواني كنيد و يا آنرا به صورت Stored Procedure درآوريد. (كه بهتر است و راحت تر است)

اسكريپت Backup كه يك Stored Procedure براي Backup مي سازد.




USE [نام ديتابيس]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[BackupDB]


@BackupPath varchar(max)


AS


backup database [نام ديتابيس] to disk =@BackupPath with INIT, SKIP, NOUNLOAD, STATS = 10


RETURN



و

اسكريپت Restore كه يك Stored Procedure براي Restore مي سازد.





use [master]
GO


SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[RestoreDB]


@BackupPath varchar(max)


AS


RESTORE DATABASE [نام ديتابيس]
FROM DISK = " + "'" + RestorePath + "'" + " WITH RECOVERY, REPLACE


RETURN



در صورت هرگونه سوال در خدمتم.

موفق باشيد.



با سلام
دوست عزیز با تشکر از شما انگار SCRIPT مربوط به بازیابی ایراد دارد برای BACKUP جواب می دهد ولی برای RESTORE در خود SQL ایراد می گیرد
با تشکر

saied_genius
جمعه 01 آبان 1388, 12:56 عصر
سلام

حق با شماست.

اينجوري تغييرش بدهيد.


use [master]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[RestoreDB]

@restorePath varchar(max)

AS

RESTORE DATABASE [db] FROM DISK =@RestorePath WITH RECOVERY, REPLACE

RETURN

يا اينکه اينجوري بنويسيد


use [master]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[RestoreDB]

@restorePath varchar(max)

AS

SET SINGLE_USER With ROLLBACK IMMEDIATE
RESTORE DATABASE [ديتابيس] FROM DISK =@RestorePath WITH RECOVERY, REPLACE

RETURN

موفق باشيد.

majidsoft
جمعه 01 آبان 1388, 21:34 عصر
با سلام و تشکر از شما دوست عزیز باید بگم من از sql2005 استفاده می کنم و با with این ایراد رو می گیره

Msg 156, Level 15, State 1, Procedure RestoreDB, Line 7
Incorrect syntax near the keyword 'With'.
Msg 319, Level 15, State 1, Procedure RestoreDB, Line 7
Incorrect syntax near the keyword 'with'. If this statement is a common table expression or an xmlnamespaces clause, the previous statement must be terminated with a semicolon.
Msg 102, Level 15, State 1, Procedure RestoreDB, Line 7
Incorrect syntax near 'IMMEDIATE'.

saied_genius
جمعه 01 آبان 1388, 21:58 عصر
بازهم معذرت مي خواهم.

اين را امتحان کنيد.

من امتحان کردم مشکلي نداشت.


CREATE PROCEDURE [dbo].[RestoreDB]

@restorePath varchar(max)

AS

ALTER DATABASE [نام ديتابيس]
SET SINGLE_USER With ROLLBACK IMMEDIATE
RESTORE DATABASE [نام ديتابيس] FROM DISK =@RestorePath WITH RECOVERY, REPLACE

RETURN

موفق باشيد.

majidsoft
جمعه 01 آبان 1388, 22:23 عصر
با تشکراز شما دوست عزیز کد درست بود
موفق باشی

saied_genius
جمعه 01 آبان 1388, 22:28 عصر
خواهش مي کنم.

در خدمتتان هستم.


موفق باشيد.