PDA

View Full Version : سوال: بستن دیتابیس مسیر برنامه



علی فتحی
جمعه 15 آبان 1394, 14:09 عصر
با عرض سلام:من میخواهم دیتابیس جاری را در داخل یک پوشه کپی کنم .
1-تازمانی که دیتابیس بسته است کد زیر بخوبی عمل میکنه ولی اگر با برنامه کارکنم و دیتابیس بصورت باز بمونه کپی انجام نمیشه .لطفا نحوه بستن کامل دیتابیس رو در کد زیر اصلاح فرمایید.
در ضمن من از entity برای پیوند با دیتابیس استفاده میکنم .

SqlConnection con = new SqlConnection();
con.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|" + textBoxX3.Text + "\\Datn.mdf;Integrated Security=True;User Instance=True";
if (con.State == ConnectionState.Open)
{
con.Close();
SqlConnection.ClearPool(con);
con.Dispose();
}
File.Copy(Application.StartupPath + "\\" + textBoxX3.Text + "\\Datn.mdf", Application.StartupPath + "\\" + textBoxX1.Text + "\\" + "Datn.mdf");
File.Copy(Application.StartupPath + "\\" + textBoxX3.Text + "\\Datn_log.ldf", Application.StartupPath + "\\" + textBoxX1.Text + "\\" + " Datn_log .ldf");

MessageBox.Show("سال مالی ایجاد شد", "سال مالی", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.Close();
}
catch(Exception)
{
MessageBox.Show("این سال ایجاد شده است");
}

این قسمت بخوبی عمل نمیکنه :

SqlConnection con = new SqlConnection();
con.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|" + textBoxX3.Text + "\\Datn.mdf;Integrated Security=True;User Instance=True";
if (con.State == ConnectionState.Open)
{
con.Close();
SqlConnection.ClearPool(con);
con.Dispose();
}

ژیار رحیمی
جمعه 15 آبان 1394, 15:14 عصر
1-ابتدا کویری زیر اجرا

"use master
ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE"

2--عملیات کپی دیتابیس

3-بعد از کپی دیتابیس کویری زیر اجرا شود
"ALTER DATABASE YourDatabase SET MULTI_USER"

علی فتحی
جمعه 15 آبان 1394, 15:18 عصر
اقای زاگروتی عزیز ممنون از جوابتون ولی من اصلا نمیتونم با کوری کار کتم.ساخت کوئری بلدم ولی با نحوه اجرا مشکل دارم خیلی هم پیگیر شدم به نتیجه نرسیدم .از تاپیکهای من معلومه .
میشه با کد نویسی دیتابیس رو بست؟ مثل قسمت اول کد خودم؟

ژیار رحیمی
جمعه 15 آبان 1394, 20:22 عصر
query هایی که برات گذاشتم مثل query های Insert و Update با sqlcommand اجرا کن اگه م از Entity Framework استفاده میکنی بصورت زیر

context.Database.ExecuteSqlCommand("use master ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE");


اگر مشکلت حل نشد دنبال Attach و Detach کردن دیتابیس با کد بگرد گدش هست تو اینترنت.شما وقتی دیتابیس Attach شده به Sql نمیتونی از دو فایل کپی یگیری.بهتره با کد ابتدا دیتابیس رو Detach کرده و بعد عملیات کپی مجدد دیتابیس رو Attach کنی

علی فتحی
جمعه 15 آبان 1394, 23:56 عصر
نشد انواع روش رو امتحان کردم بسته نمیشه

ژیار رحیمی
شنبه 16 آبان 1394, 09:38 صبح
SqlConnection conn = new SqlConnection("Server=(local); Data Source=;Integrated Security=SSPI");
SqlCommand cmd = new SqlCommand("", conn);
//برای detach کردن
//cmd.CommandText = "DROP DATABASE MyDatabase";
cmd.CommandText = "sys.sp_detach_db MyDatabase";


//برای Attach کردن هم کد زیر
cmd.CommandText ="EXEC sp_attach_db @dbname = N'MyDatabase',
@filename1 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\MyDatabase.mdf',
@filename2 = N'c:\Program Files\Microsoft SQL Server\MSSQL\Data\MyDatabase_log.ldf'"
//مسیر دو فابل یالا رو با مسیر دیتابیس خود اصلاح کن
conn.Open();


cmd.ExecuteNonQuery();


cmd.Dispose();
conn.Dispose();

arash21hhhh
شنبه 16 آبان 1394, 10:11 صبح
یک راه ساده تر اینه که سرور sql رو ری استارت کنید . بگردید نمونه کد واسه انجام این کار پیدا میشه .

علی فتحی
شنبه 16 آبان 1394, 22:15 عصر
تشکر که توجه کردین . از خیرش گذشتیم اومدم یک فرم دیگه خارج از برنامه اضافه کردم با باز شدن فرم کل برنامه بسته میشه و مشگل حل شد.

ولی یک سوال این کد با مال شما چه فرقی داره؟


//SqlConnection con = new SqlConnection(); //con.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\\" + textBoxX3.Text + "\\Datn.mdf;Integrated Security=True;User Instance=True";
//if (con.State == ConnectionState.Open)
//{
// SqlConnection.ClearPool(con);
// con.Dispose();
// con.Close();



//}