PDA

View Full Version : مشکل با restore کردن



851166303
دوشنبه 31 فروردین 1388, 20:04 عصر
سلام دوستان
من یه برنامه ای با C# و sql 2000 نوشتم من از بانکم Backup می گیرم و هیچ مشکلی هم نداره این هم کدش:

private void button1_Click(object sender, EventArgs e)
{
string strFileName = string.Empty;
saveFileDialog1.DefaultExt = "BAK";
saveFileDialog1.FileName = "BackFile";
saveFileDialog1.Filter = @"SQL Backup Files (*.BAK) |*.BAK | All Files (*.*) |*.*";
saveFileDialog1.FilterIndex = 1;
saveFileDialog1.OverwritePrompt = true;
saveFileDialog1.Title = "Backup SQL File";
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
strFileName = saveFileDialog1.FileName;
back(strFileName);
}
}

private void back(string strFileName)
{
try
{
string command = @"BACKUP DATABASE parsian TO DISK='" + strFileName + "'";
this.Cursor = Cursors.WaitCursor;
SqlCommand oCommand = null;
SqlConnection oConnection = null;
oConnection = new SqlConnection("Data Source=Computer1; initial catalog=parsian ;integrated security=true;");
if (oConnection.State != ConnectionState.Open)
oConnection.Open();
oCommand = new SqlCommand(command,oConnection);
oCommand.ExecuteNonQuery();
this.Cursor = Cursors.Default;
MessageBox.Show("پشتيباني با موفقيت انجام شد");
}
catch (Exception ex)
{
MessageBox.Show("ERROR Occurd: " + ex.Message);
}
}



ام مشکل من در restore کردن آن می باشد یعنی برای بار اول که می خوام restore کنم این پیغام (پیوست کردم) را می دهد و بار بعدی یه پیغام دیگه و بار سوم می نویسه که کاربری از این بانک در حال استفاده می باشد و واردsql2000 هم می شود جلوی بانک مربوطه نوشته
(single user) این هم کد restore

private void button1_Click(object sender, EventArgs e)
{
string strFileName = string.Empty;
openFileDialog1.FileName = " ";
openFileDialog1.Filter = @"SQL Backup Files (*.BAK) |*.BAK | All Files (*.*) |*.*";
openFileDialog1.FilterIndex = 1;
openFileDialog1.Title = "Restor SQL File";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
strFileName = saveFileDialog1.FileName;
rest(strFileName);
}
}
private void rest(string strFileName)
{
try
{
string command = "ALTER DATABASE parsian SET SINGLE_USER with ROLLBACK IMMEDIATE " +
"use master " +
" RESTORE DATABASE parsian FROM DISK='" + strFileName + "'";
this.Cursor = Cursors.WaitCursor;
SqlCommand oCommand = null;
SqlConnection oConnection = null;
oConnection = new SqlConnection("Data Source=Computer1; initial catalog=parsian ;integrated security=true;");
if (oConnection.State != ConnectionState.Open)
oConnection.Open();
oCommand = new SqlCommand(command, oConnection);
oCommand.ExecuteNonQuery();
this.Cursor = Cursors.Default;
MessageBox.Show("پشتيباني با موفقيت انجام شد");
}
catch (Exception ex)
{
MessageBox.Show("ERROR Occurd: " + ex.Message);
}
}


لینک تصویر error (http://mohammadpourabedin.googlepages.com/errorrestore.jpg)

با تشکر

omidandyass1360
سه شنبه 01 اردیبهشت 1388, 09:53 صبح
احتما دارد که شما قبل از restoreکردن connection را در جایی باز کرده باشید وآن را close نکرده باشید؟ به نظر می آیید که شما باید حتما همه connection ها را باید ببندید

esmaeily-hosein
سه شنبه 01 اردیبهشت 1388, 10:35 صبح
در sql به خصوص در سیستم های شبکه ای اگر اتصالی برقرار باشد این اجازه را به شما نمیدهد .برای این کار شما میتوانید با sp_who لیست افراد متصل به sql خود را ببینید و اگر خواستید به force connection کنید .

851166303
سه شنبه 01 اردیبهشت 1388, 10:42 صبح
دوست عزیز تمام connection را close کردم باز هم همون error را می ده

دوست عزیز این برنامه من تحت شبکه نیست فقط روی یک pc می خواهد کار کند

mohsen_csharp
سه شنبه 01 اردیبهشت 1388, 10:57 صبح
دوست عزیز به برنامه ای که در این پست گذاشته ام مراجعه کن
http://barnamenevis.org/forum/showthread.php?t=153480

851166303
سه شنبه 01 اردیبهشت 1388, 11:24 صبح
دوست عزیز این برنامه قبلا دیدم برنامه قشنگی ولی فکر کنم مثل این برنامه در CodeProject یا msdn دیده بودم ولی من می خواهم همون مشکل خودم حل بشه

با تشکر

esmaeily-hosein
سه شنبه 01 اردیبهشت 1388, 12:40 عصر
عزیزم همونطور که گفتم sp_who رو اجرا کن ، از لیست به دست اومده با دستور kill تک تک spid را ببند .
در ضمن کسی اینجا موظف به پاسخ دادن نیست .

851166303
سه شنبه 01 اردیبهشت 1388, 13:09 عصر
دوست عزیز میشه یه کم بیشتر توضیح بدی یا کدی در این مورد بذاری

mohsen_csharp
سه شنبه 01 اردیبهشت 1388, 18:24 عصر
دوست عزیز این برنامه قبلا دیدم برنامه قشنگی ولی فکر کنم مثل این برنامه در CodeProject یا msdn دیده بودم
من خودم قبل از اینکه این برنامه رو بنویسم کلی اینترنت رو گشتم ولی تمام برنامه هایی که پیدا کردم اشکالاتی داشتند بنابراین مجبور شدم خودم یه چیز کامل بنویسم.
90% برنامه های اینترنتی هنگام Restore اگه مسیر جدید با مسیر قبلی پایگاه داده متفاوت بود با مشکل مواجه می شدند همچنین اگر از قبل پایگاه داده موجود نبود عمل رستور با شکست همراه می شد. برنامه ای که من نوشتم می تونه یک پایگاه داده خالی رو در مسیر دلخواه ایجاد کنه و بعد عمل رستور را انجام بده و علاوه براین می تونه فایل های سرایند فایل بکاپ رو بخونه و اون رو در مسیر دلخواه رستور کنه.
ممکنه یکی از این موارد مشکل برنامه شما باشه.

ولی من می خواهم همون مشکل خودم حل بشه
تا وقتی تکنولوژی جدید و با قدرتی مثل smo هست چرا اصرار به کدنویسی اونم از این نوع.
هرچند کد نویسی خوبه ولی بهتره از کلاس های کپسوله شده استفاده بشه به شرطی که سر از کار کلاس درآریم.

esmaeily-hosein
چهارشنبه 02 اردیبهشت 1388, 10:34 صبح
من با smo هم تست کردم همین مشکل اونجا هم هست .اصلا خود sql هم همین کارو فکر میکنم چون همه رو بیرون میکنه .دست خط جفتشم برا خودمه کپی جایی نیست !
نمونه کد با C#



DataTable dt = new DataTable();
using (SqlConnection connection = new SqlConnection("User ID=sa;pwd=11;Initial Catalog=tempdb;Data Source=tfidb2"))
{
using (SqlCommand command = new SqlCommand("SP_Who", connection))
{
connection.Open();

dt.Load(command.ExecuteReader());

string stCommand = "KILL {0}";
foreach (DataRow dr in dt.Rows)
{
command.CommandText = string.Format(stCommand, (Int16)dr["spid"]);
try
{
command.ExecuteNonQuery();
}
catch (SqlException) { }
}
}
}
//Write Restore Commmand

سمت sql


--Members
DECLARE @iCounter int,@iLen int,@spId int
DECLARE @stCommand varchar(50)

DECLARE @sp_who Table(
spid smallint,
ecid smallint,
status nchar(30),
loginame nchar(128),
hostname nchar(128),
blk char(5),
dbname nchar(128),
cmd nchar(16),
request_id smallint,
Id int identity(1,1))

--Initialzing
INSERT INTO @sp_who EXEC sp_who

SET @iCounter=1;
SELECT @iLen=COUNT(Id) FROM @sp_who

--Body
WHILE (@iCounter<=@iLen)
BEGIN
BEGIN TRY
SET @spId=(SELECT spid FROM @sp_who WHERE ID=@iCounter)
SET @stCommand='KILL QUERY NOTIFICATION SUBSCRIPTION ' + CAST(@spId as varchar(5))

EXECUTE @stCommand
END TRY
BEGIN CATCH
END CATCH
SET @iCounter=@iCounter+1
END

mohsen_csharp
چهارشنبه 02 اردیبهشت 1388, 12:10 عصر
فکر کنم تو روشی که شما نوشتی نام فایل باید همنام پایگاه داده قبلی باشد یا شاید هم در مسیرهای خاص مانند desktop عمل Restore را انجام میدی که منجر به خطا میشه.
آیا اون برنامه ای که من با smo نوشته بودم رو تست کردی؟
اگه ارور میده ارورش چیه؟

esmaeily-hosein
چهارشنبه 02 اردیبهشت 1388, 13:03 عصر
فرق میکنه چه خطایی میده ! معمولا خطا به دلیل database در حال استفاده میباشد هست .