PDA

View Full Version : سوال: مشکل در detach کردن sql express



morika
جمعه 24 آذر 1391, 11:03 صبح
سلام
الان دو روزه دارم تمام سایت رو میگردم واسه اینکه چجوری میشه بانک رو detach کرد واسه کپی کردن فایلش. همه راهایی که تو سایت بود و تست کردم ولی نشد که نشد. این پیغام و میده.
System databases master, model, msdb, and tempdb cannot be detached.
چیکارش کنم؟
ممنون

veniz2008
جمعه 24 آذر 1391, 11:59 صبح
سلام. عزیز شما میخوای فایل های اصلی و پایه ای sql server رو detach کنی ( از دور خارج کنی). sql هم اجازه چنین کاری رو به شما نمیده. شما باید دیتابیس خودتو دیتچ کنی. عکس ها رو ببین (sql دقیقا داره به شما میگه این 4 تا مال منه، باهاش کاری نداشته باش!):

96645

96644

morika
جمعه 24 آذر 1391, 12:09 عصر
البته منظور من detach کردن بانکی هست که واسه برناهم خودم تو #C ساختم. می خوام اونو از برنامم جدا کنم تا بتونم فایل mdf. و ldf. رو کپی کنم. با SQL Management Studio کاری ندارم. تمام کارایی که تو سایت بود رو انجام دادم ولی نشد که نشد. یا این پیغام رو میده یا اصلا پیغام نمیده ولی وقتی به کد کپی کردن فایلهای می رسه پیغام میده که فایل توسط یه پروسه دیگه اشغال شده.

morika
جمعه 24 آذر 1391, 16:14 عصر
دوستان کسی نظری نداره؟

morika
جمعه 24 آذر 1391, 17:41 عصر
دوستان عزیز من می خوام از دوتا فایل تو #C کپی بگیرم

morika
جمعه 24 آذر 1391, 18:16 عصر
می خوام از بانکم بکاپ بگیرم ولی حتما لازمه که خود فایلهای بانک رو کپی کنم تو یه فولدر دیگه نمی شه از متدهای بکاپ گیری خود sql مثل SMO استفاده کنم. ولی حالا هرکاری که می کنم اتصال بانک از برنامه قطع نمیشه که نمیشه که نمیشه

danialafshari
جمعه 24 آذر 1391, 18:22 عصر
اینجا بستگی به طراحی هم داره اگر دکمه کپی رو در فرم نمایش اطلاعات باشه باید ObjectName.dispose(); رو هم انجام بدی

morika
جمعه 24 آذر 1391, 18:27 عصر
الان دیگه هرچی از هرجا دستم میاد مینویسم ولی بازم نمیشه
SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\MSDB.mdf;Integrated Security=True;User Instance = True");
SqlConnection.ClearAllPools();
SqlConnection.ClearPool(con);
con.Dispose();
File.Copy(Application.StartupPath + "\\msdb.mdf", "e:\\msdb.mdf");

alias136790
جمعه 24 آذر 1391, 19:38 عصر
برای detach کردن کافیه از کانکت استرینگ زیر استفاده کنی:
'use master; EXECUTE sp_detach_db @dbname = N'MSDB

siedmohsen
جمعه 24 آذر 1391, 21:46 عصر
برای detach کردن کافیه از کانکت استرینگ زیر استفاده کنی:
'use master; EXECUTE sp_detach_db @dbname = N'MSDB

آخه دوست عزیز وقتی برنامه داره از اون استفاده می کنه چه جوری detach کنه!!!!!:گیج:

AliSaeedi_v
جمعه 24 آذر 1391, 21:53 عصر
سلام من یه بار تو این تالار درباره بکاپ گیری سوال کردم و مشکلم حل شد.توی زان اس کیو ال یه دستور هست که این کارو انجام میده و یه فایل .bak میسازه و بایه دستوره دیگه هم بازگردانیش میکنه...بگرد پیداش میکنی..

morika
جمعه 24 آذر 1391, 23:07 عصر
همون یک خط SqlConnection.ClearAllPools(); قبل از کپی جواب میده. برای شما چه خطایی میده؟

زمانی که می رسه به خط کپی میگه که یه پروسه دیگه داره از فایل استفاده می کنه

morika
جمعه 24 آذر 1391, 23:09 عصر
سلام من یه بار تو این تالار درباره بکاپ گیری سوال کردم و مشکلم حل شد.توی زان اس کیو ال یه دستور هست که این کارو انجام میده و یه فایل .bak میسازه و بایه دستوره دیگه هم بازگردانیش میکنه...بگرد پیداش میکنی..

آره می دونم. ولی شرایط من یه جوری شده که باید خود فایل بانک رو برای بکاپ گیری استفاده کنم. یعنی بکاپ فایل رو نمی خوام اصل فایل رو می خوام

ali_habibi1384
جمعه 24 آذر 1391, 23:51 عصر
دوست عزيز لازم نيست حتما deatach كنيد سرويس sql رو يكبار stop كنيد تا همه فايلهاتون آزاد بشه بعد براحتي از اون كپي بگيريد.واسه اينكار كافيه روي گزينه database كليك راست كرده stop رو بزنيد.

morika
شنبه 25 آذر 1391, 00:51 صبح
دوست عزيز لازم نيست حتما deatach كنيد سرويس sql رو يكبار stop كنيد تا همه فايلهاتون آزاد بشه بعد براحتي از اون كپي بگيريد.واسه اينكار كافيه روي گزينه database كليك راست كرده stop رو بزنيد.

دوست عزیز ممنون از توجهتون ولی شما موضوع بحث تاپیک رو اصلا متوجه شدی؟ من می خوام با یه دکمه تو برنامه #C این اتقاف بیفته. با Management Studio که کار نمی کنم

morika
شنبه 25 آذر 1391, 19:19 عصر
سلام من یه بار تو این تالار درباره بکاپ گیری سوال کردم و مشکلم حل شد.توی زان اس کیو ال یه دستور هست که این کارو انجام میده و یه فایل .bak میسازه و بایه دستوره دیگه هم بازگردانیش میکنه...بگرد پیداش میکنی..

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

morika
سه شنبه 28 آذر 1391, 17:33 عصر
پس بالاخره چجوری باید ارتباط فایل بانک با برنامه رو قطع کرد؟؟؟؟؟؟؟؟؟

alias136790
سه شنبه 28 آذر 1391, 21:52 عصر
سلام دوست عزیز ،
برای اینکه دیتابیس detach بشه، راه حلش اینه که بعد از هربار استفاده از دیتابیس،کانکشن اون رو ببندین، مثلا بعد از اینکه یه رکورد به جدول دیتابیستون اضافه کردین، کانکشن اون
رو ببندین.

بعد از اینکار ، دیگه دیتابیس آزاد هست و میتونین، اون رو Detach کنین:

static void detachdb()
{
try
{
SqlConnection sqlConn;
sqlConn = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=master;Integrated Security=True;");
sqlConn.Open();
// for detach just write: use master; EXECUTE sp_detach_db @dbname = N'acount_db'
string str = "use master;" +
"EXECUTE sp_detach_db @dbname = N'Azmoongir_Data'";
SqlCommand cmd = new SqlCommand(str, sqlConn);
cmd.ExecuteNonQuery();
sqlConn.Close();
MessageBox.Show(" شد dettach دیتابیس با موفقیت");
}
catch (Exception x)
{
MessageBox.Show(x.Message, "خطا");
}
}

morika
پنج شنبه 30 آذر 1391, 11:18 صبح
ممنون از جوابتون. من همه کانکشن هارو تو برنامه چک کردم و همشون رو بعداز استفاده بستم. ولی الان با این کد شما این پیغام رو به من میده:
System databases master, model, msdb, and tempdb cannot be detached.
Changed database context to 'master'.
اینم کد خودم تو برنامم:
SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\MSDB.mdf;Integrated Security=True;User Instance = True");
con.Open();
SqlCommand cmd = new SqlCommand("use master;EXECUTE sp_detach_db @dbname = N'MSDB'", con);
cmd.ExecuteNonQuery();
con.Close();

mbza11
جمعه 01 دی 1391, 03:37 صبح
سلام.
یه بار اینو امتحان کن:

SqlConnection con = new SqlConnection();
con.ConnectionString = "Data Source=.\SQLEXPRESS;Initial Catalog=YOUR_DATA_BASE_NAME;Integrated Security=True";
SqlCommand cmd = new SqlCommand();
string query;

try
{
con.Open();
query = "USE master;EXEC sp_detach_db @dbname = N'YOUR_DATA_BASE_NAME';";
cmd.CommandText = query;
cmd.Connection = con;
cmd.ExecuteNonQuery();
con.Close();
}
catch { con.Close(); }

YOUR_DATA_BASE_NAME: رو با اسم دیتابیست جایگزین کن.
موفق باشید.

morika
جمعه 01 دی 1391, 18:40 عصر
ممنون از جوابتون دوست عزیز. ولی نمی دونم الان چرا این اینجوری شده. راستش دفعه اول که کد شمارو کپی کردم و کار کردم جواب داد و خیلی قشنگ از قایل بانک کپی گرفت. ولی وقتی یه بار دیگه اجراش کردم باز همون مشکل قبلی و گرفت که فایل بانک توسط یه پروسه دیگه اشغال شده. عجب گیری کردیم از دست این sql زبون نفهم. حالا چیکار باید کرد؟
این دقیقا کدیه که من تو برنامه نوشتم و تو اولین اجرا جواب داد ولی دیگه جواب نمی ده:
SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=|Data Directory|\MSDB.mdf;Integrated Security=True");
con.Open();
SqlCommand cmd = new SqlCommand("USE master;EXEC sp_detach_db @dbname = N'MSDB';", con);
cmd.ExecuteNonQuery();
con.Close();

morika
جمعه 01 دی 1391, 18:43 عصر
الان داره این پیغام رو از تیکه con.open() می گیره که قبلا اصلا نمی گرفت:

Cannot open database "|Data Directory|\MSDB.mdf" requested by the login. The login failed.
Login failed for user 'Home-PC\Morteza'.

alias136790
جمعه 01 دی 1391, 19:18 عصر
سلام یجای کار شما اشتباه هست:
شما تو کانکت استرینگ اولی بجای master ،آدرس دیتابیستون رو دادین.
درستش اینه:

SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=master;Integrated Security=True");con.Open();SqlCommand cmd = new SqlCommand("USE master;EXEC sp_detach_db @dbname = N'MSDB';", con);cmd.ExecuteNonQuery();con.Close();

morika
جمعه 01 دی 1391, 19:21 عصر
من کدم رو طبق گفته دوست قبلی نوشتم. ولی الان تو این کد شما کلا اسم دیتابیس کجا رفت؟ کانکشن به چی کانکت شه؟

alias136790
جمعه 01 دی 1391, 19:36 عصر
به دیتابیس مستر(master)

morika
جمعه 01 دی 1391, 19:44 عصر
خب الان با کد شما این مشکل رو می گیره:
System databases master, model, msdb, and tempdb cannot be detached.
Changed database context to 'master'.

alias136790
شنبه 02 دی 1391, 23:27 عصر
سلام،
بلاخره مشکل رو تو کد شما پیدا کردم، شما اسم دیتابیستون رو گذاشتین MSDB، در حالی که خوده msdb، یکی از دیتابیس های اصلی اس کیو ال هست که نمیشه detach اش کرد. پس اگه اسم دیتابیس تون رو
چیز دیگه ای بذارین مشکل حل میشه.

morika
یک شنبه 03 دی 1391, 12:07 عصر
اگه اینجوری باشه که خیلی مشکل باحالی شده. همین الان تستش می کنم. ممنون

morika
یک شنبه 03 دی 1391, 12:27 عصر
حالا بانک تو برنامه کار می کنه ولی وقتی می خواد detach کنه کلا وجود بانک رو منکر میشه. رسما قاطی کرد دیگه
اسم دیتابیس رو عوض کردم گذاشتم MobinDB
The database 'MobinDB' does not exist. Supply a valid database name. To see available databases, use sys.databases.
Changed database context to 'master'.

morika
یک شنبه 03 دی 1391, 15:50 عصر
من الا کلا یه دیتابیس دیگه ساختم به اسم MobinDB کلا از اول دوباره ساختمش التبه جداولش مثل همون قبلیه. حالا تو خود برنامه باهاش راحت کار می کنم ولی این دستورات بکاپ و قطع ارتباط دیگه روش کار نمی کنه. پیغام میده که بانکی به اسم MobinDB اصلا وجود نداره. چش شد این؟

alias136790
یک شنبه 03 دی 1391, 21:48 عصر
چون شما همیشه برای استفاده از دیتابیس از آدرس دیتابیس استفاده کردین، فکر کنم برای Detach کردن هم باید بجای دیتابیس از آدرس دیتابیس استفاده کنی:

string str = "use master;" +
@"EXECUTE sp_detach_db @dbname = N'D:\C SHARP\LEARN C#\ABZAR\ABZAR\BANK\ABZAR_DATA.MDF'";


اگه دیتابیست رو یه بار درست Attach کنی دیگه نیازی نیست برای هر بار استفاده از دیتابیس ، آدرس دیتابیس رو بدی، بعدش راحت میتونی برای هر بار
استفاده از دیتابیس، فقط اسمش رو بنویسی و فکر کنم دیگه با Detach هم مشکل پیدا نکنی.
برای اینکار ابتدا باید دیتابیس تون رو Detach کنین . و بعد
برای Attach کردن دیتابیست از این استفاده کن:
try
{
SqlConnection sqlConn;
sqlConn = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=master;Integrated Security=True;");
sqlConn.Open();
// for detach just write: use master; EXECUTE sp_detach_db @dbname = N'acount_db'
string str = "use master;" +
"EXECUTE sp_attach_db @dbname = N'Azmoongir_Data' , " +
" @filename1 = N'" + System.Environment.CurrentDirectory + "\\data\\Azmoongir_Data.mdf' (file://\\data\\Azmoongir_Data.mdf')," +
"@filename2 = N'" + System.Environment.CurrentDirectory + "\\data\\Azmoongir_Log.ldf' (file://\\data\\Azmoongir_Log.ldf')," +
"@filename3 = N'" + System.Environment.CurrentDirectory + "\\data\\Azmoongir_Data_log.ldf' (file://\\data\\Azmoongir_Data_log.ldf')";
SqlCommand cmd = new SqlCommand(str, sqlConn);
cmd.ExecuteNonQuery();
sqlConn.Close();
MessageBox.Show(" شد Attach دیتابیس با موفقیت");
}
catch (Exception x)
{
if (x.Message.IndexOf("already exists") >= 0)
MessageBox.Show(" دیتابیس موجود است");
else
MessageBox.Show(x.Message, "خطا");
}
با این روش اتصال میتونی به همون روشی که قبلا گفتم دیتابیس رو Detach کنی فقط با آوردن اسم دیتابیس بدون نیاز به آدرس دیتابیس.

morika
دوشنبه 04 دی 1391, 10:27 صبح
خب من الان کدم رو دقیقا تغییر دادم به چیزی که شما گفته بودین. ولی حالا در زمان execute این مشکل رو می گیره:
Database 'MobinDB' already exists. Choose a different database name.
Changed database context to 'master'.

این کدم که تو برنامه نوشتم:
SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=master;Integrated Security=True");
con.Open();
string str = "USE MASTER;" +
"EXECUTE sp_attach_db @dbname = N'MobinDB', " +
"@filename1 = N'" + System.Environment.CurrentDirectory + "\\MobinDB.mdf', " +
"@filename2 = N'" + System.Environment.CurrentDirectory + "\\MobinDB_log.ldf'";
SqlCommand cmd = new SqlCommand(str, con);
cmd.ExecuteNonQuery();
con.Close();

alias136790
دوشنبه 04 دی 1391, 13:18 عصر
گفتم که اول باید دیتابیس رو Detach کنی.
برای Detach از کامنت قبلی استفاده کن.

morika
دوشنبه 04 دی 1391, 17:04 عصر
خوب دوست عزیز آلیاس نظر شما کاملا درست بود. دستور detach تو همه این مدت فقط بخاطر همون آدرس اجرا نمی شده. الان که آدرس رو کامل می زنم براش فایل بانک کاملا قابل کپی کردن میشه. خیلی خیلی ممنون از وقتی که گذاشتی. من مشکلم الان کاملا حل شد. دست شما درد نکنه. بی نهایت ممنون