PDA

View Full Version : مشکل در کوییری برای RESTORE کردن بکاپ



hojjat_gh
دوشنبه 18 شهریور 1387, 23:46 عصر
با سلام
من این کییری رو برای ریستور کردن بکاپم نوشتم وچون شاید زمان ریستور کردن بانک من به برنامه متصل باشه از MASTER استفاده کردم ولی زمان کامپال به مستر گیر میده ایا این کوییری مشکل داره ؟
اگه مشکل داره میخواستم بدونم شکل صحیحش چیه؟


CREATE PROC RESTOREBACKUP
@BACKUPPATH nvarchar(50)
AS
USE [master]
IF EXISTS (SELECT name FROM sys.databases WHERE name = N'DB')
DROP DATABASE [DB]
RESTORE DATABASE [DB] FROM DISK = @BACKUPPATH
GO

AminSobati
سه شنبه 19 شهریور 1387, 00:39 صبح
سلام،
پیغام خطایی که دریافت میکنید؟

sekhavat
سه شنبه 19 شهریور 1387, 01:16 صبح
سلام
اينم كدها :
Back up

Try
Dim str As String
Dim dir As New SaveFileDialog
dir.Filter = "All File|*.bak"
dir.Title = " ... ê«ی©ی ©ں ¤ى¢ ¨¦ی©ى هںیé پ¬¢ی ںë ں뢦ں کëی§"
If dir.ShowDialog = Windows.Forms.DialogResult.OK Then
str = dir.FileName
MsgBox("Save Backup = " + str, MsgBoxStyle.OkOnly, "¨¦ی•••••©ى ¬•••••••ي§؟ ê«ï© هںïé پ¬¢ï ںë")
Else
Exit Sub
End If
Dim cmdBackup As New SqlCommand("BACKUP DATABASE @name TO DISK = N'" + str + "' WITH NOFORMAT, NOINIT,SKIP, NOREWIND, NOUNLOAD, STATS = 10", Connection)
cmdBackup.Parameters.Clear()
cmdBackup.Parameters.AddWithValue("@name", My.Application.Info.DirectoryPath + "\DataBase.mdf")
If Connection.State = ConnectionState.Closed Then
Connection.Open()
End If
cmdBackup.ExecuteNonQuery()
Connection.Close()
Catch ex As Exception
MsgBox("¦لں §© ىëگںê پ¬¢ï ںë گï©ï *********** ----> " + ex.ToString, MsgBoxStyle.OkOnly, "¢ي¤ى")
End Try

2-Restor

Try
Dim str As String
Dim dir As New OpenFileDialog
dir.Filter = "All File|*.bak"
dir.Title = " *** هںیé پ¬¢ی ںë ©ں ں뢦ں کëی§ ***"
If dir.ShowDialog = Windows.Forms.DialogResult.OK Then
str = dir.FileName
'MsgBox("Restor Backup = " + str)
Else
Exit Sub
End If
Dim cmdRestor As New SqlCommand("use master RESTORE DATABASE @name FROM DISK = N'" + str + "'", Connection)
cmdRestor.Parameters.Clear()
cmdRestor.Parameters.AddWithValue("@name", My.Application.Info.DirectoryPath + "\DataBase.mdf")
If Connection.State = ConnectionState.Closed Then
Connection.Open()
End If
cmdRestor.ExecuteNonQuery()
Connection.Close()
'Call FillData() '-----> چè ¬ي§
'Call Bind()
Catch ex As Exception
MsgBox(" ¦لں §© ىëگںê ©گ¬¢ پ¬¢ï ںë ******* ----> " + ex.ToString, MsgBoxStyle.OkOnly, "¢ي¤ى")
End Try

موفق باشين سخاوت

hojjat_gh
سه شنبه 19 شهریور 1387, 06:23 صبح
سلام،
پیغام خطایی که دریافت میکنید؟


Msg 154, Level 15, State 1, Procedure RESTOREBACKUP, Line 4
a USE database statement is not allowed in a procedure, function or trigger.

hojjat_gh
سه شنبه 19 شهریور 1387, 11:57 صبح
جناب ثباتی من همچنان منتظرم!

AminSobati
سه شنبه 19 شهریور 1387, 12:20 عصر
پیغامش مشخصه، USE نمیشه استفاده کرد داخل SP. شما قبل از اجرای این SP از طریق ADO باید USE کنین، خارج از SP

mannai29
سه شنبه 19 شهریور 1387, 13:50 عصر
با اجازه از آقای ثباتی یک روش دیگه هم هست . میتونین کل این کد
USE [master]
IFEXISTS(SELECTnameFROMsys.databasesWHEREname= N'DB')
DROPDATABASE [DB]
RESTOREDATABASE [DB] FROMDISK= @BACKUPPATH
رو در SP، داخل یک رشته بگذارید و اون رشته رو با sp_executesql اجرا کنید . یعنی SP تون رو به این روش بنویسید و از اون استفاده کنید.
در این صورت از USE می شه استفاده کرد داخل SP.
پیروز باشید.

AminSobati
سه شنبه 19 شهریور 1387, 14:19 عصر
مسئله اینجاست که خود این SP نمیتونه در دیتابیسی باشه که دارین Restore میکنین. پس اساسا SP کردنش هم شاید الزامی نداشته باشه. مگر اینکه در Master ساخته بشه

hojjat_gh
سه شنبه 19 شهریور 1387, 14:40 عصر
من sp زیر رو داخل دیتابیس master نوشتم :

CREATE PROC RestoreBackups
@BACKUPPATH nvarchar(50)
AS
RESTORE DATABASE [db] FROM DISK= @BACKUPPATH
GO

و کدهای برنامم به این شکله:


public void RestoreBackups(string BACKUPPATH)
{
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "RestoreBackups";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@BACKUPPATH", BACKUPPATH);
mycnrestore=new SqlConnection("server=(local);database=master;integrated security=true;");
cmd.Connection = mycnrestore;
if (mycnrestore.State == ConnectionState.Closed)
{
mycnrestore.Open();
}
cmd.ExecuteNonQuery();
mycnrestore.Close();
mycnrestore.Dispose();

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

hojjat_gh
سه شنبه 19 شهریور 1387, 14:43 عصر
ودر واقع public void RestoreBackups کلاسمه که تو برنامه ازش استفاده میکنم

hamidprogramer
چهارشنبه 20 شهریور 1387, 00:48 صبح
سلام يه نيگاه به اينك تاپيك بنداز مشكلت شايد حل بشه. http://barnamenevis.org/forum/showthread.php?t=113950

hojjat_gh
پنج شنبه 21 شهریور 1387, 12:49 عصر
با سلام وتشکر
ایا به نظر دوستان این کدها برای ریستور مشکل دارند؟

privatevoid btn_restore_backup_Click(object sender, EventArgs e)
{
try
{
SqlConnection mycn = newSqlConnection("server=(local);database=master;integrated security=true;");
mycn.Open();
SqlCommand cmd = newSqlCommand();
cmd.CommandText =
"ALTER DATABASE test1 SET SINGLE_USER WITH ROLLBACK IMMEDIATE" +
"USE master;RESTORE DATABASE test1 FROM DISK ='D:\\test1' WITH NORECOVERY,REPLACE";
cmd.Connection = mycn;
cmd.ExecuteNonQuery();
mycn.Close();
//*******************//
mycn.Open();
cmd.CommandText =
"ALTER DATABASE test1 SET MULTI_USER";
cmd.Connection = mycn;
cmd.ExecuteNonQuery();
mycn.Close();
}
catch { }
}

AminSobati
جمعه 22 شهریور 1387, 01:45 صبح
دوست عزیز در ظاهر دستورات SQL من مشکلی به نظرم نمیرسه اما شما چه خطایی دریافت میکنید؟

hojjat_gh
جمعه 22 شهریور 1387, 11:12 صبح
ممنونم جناب ثباتی
خطای زیر رو میده:
ALTER DATABASE is not permitted while a database is in the Restoring state.
ALTER DATABASE statement failed.

AminSobati
جمعه 22 شهریور 1387, 23:29 عصر
ظاهرا دیتابیس تحت Restore قرار داره و نمیشه الان ALTER کنین. باید Restore کامل بشه

hojjat_gh
شنبه 23 شهریور 1387, 06:24 صبح
چطور میتونم بفهمم که ریستور تموم شده؟
ودسترات صحیحش به چه شکلی میشه و التر رو کجا باید بنویسم؟