PDA

View Full Version : اتچ و دیتچ دیتابیس از طریق کلاینت



sm_1366
چهارشنبه 05 شهریور 1393, 17:20 عصر
با سلام...
من میخواستم برای کاربر این امکان باشه که بتونه دیتابیس رو از طریق کلاینت اتچ و دیتچ کنه
این کار بیشتر برای جابجایی دیتابیسه
گفتم که کاربر با سال مالی مثلا 93 وارد بشه بعد تو فرمی اومدم کد دیتچ رو نوشتم که کاربر میاد تو این فرم و دیتچ میکنه و و بعد از عمل انجام کپی و غیره دوباره بیاد اتچش کنه
ضمنا هنگام ورود به برنامه اول فایل دیتابیس سال مالی رو جستجو میکنه اگر وجود داشت بازش میکنه حالا تو قسمت catch گفتم که اگر اتصال رو نتونست open کنه پیغام بده که اتچ نیست و
کاربر بره از طریق سیستم سرور اون فایل رو اتچ کنه
گفتند که این یه ضعفه و باید کلاینت هم بتونه اتچ دیتچ کنه


خلاصه با تمام توضیحات من به 2 مشکل برخورد کردم
1.تو کد دیتچ خطا بعضی وقتها بدون اینکه چیزی رو تغییر بدم میگه دیتابیس در حال استفاده است و امکان دیتچ وجود نداره اما دفعه بعد درست میشه و دیتچ میکنه نمیدونم چرا..
2.تو کد اتچ هم همش پیغام خطای Syantax near ' ' . رو میده واقعا کلافم کرده


این هم کد اتچ و دیتچ من



SqlConnection.ClearAllPools();
try

{
SqlConnection con = new SqlConnection();
SqlConnection con = new SqlConnection(@"Server=" + Properties.Settings.Default.strdatasource.ToString () + ";trusted_connection=yes;");
SqlCommand cmd2 = new SqlCommand();

cmd2.CommandText = "EXEC sp_attach_db "+database+",e:\\myfolder\\database.mdf,";
cmd2.CommandType = CommandType.Text;
con.Open();
cmd2.Connection = con;
cmd2.ExecuteNonQuery();
con.Close();
result = myproject.MsgBox.ShowMessage(0, "دیتابیس با موفقیت اتچ شد", "توجه", "تائید", "خير", "انصراف", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2, MessageBoxOptions.RightAlign);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "خطا در اتچ فایل دیتابیس", MessageBoxButtons.OK, MessageBoxIcon.Information);

}


و کد دیتچ

SqlConnection.ClearAllPools();

try
{
SqlConnection con = new SqlConnection(@"Server=" + Properties.Settings.Default.strdatasource.ToString () + ";trusted_connection=yes;");
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "EXEC sp_detach_db "+database;
cmd.CommandType = CommandType.Text;
con.Open();
cmd.Connection = con;
cmd.ExecuteNonQuery();
con.Close();
result = myproject.MsgBox.ShowMessage(0, "ارتباط برنامه با دیتابیس جاری قطع شد\n شما میتوانید عملیات انتقال را انجام دهید", "توجه", "تائید", "خير", "انصراف", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2, MessageBoxOptions.RightAlign);
//btndetach.Enabled = false;

}
catch (System.Exception ex)
{
MessageBox.Show(ex.ToString(), "خطا در دیتچ فایل دیتابیس", MessageBoxButtons.OK, MessageBoxIcon.Information);
}


ضمنا محتوای متغیر ستینگ Properties.Settings.Default.strdatasource.ToString () برابر . میباشد چون فعلا دارم رو سرور عمل اتچ دیتچ رو امتحان میکنم
اگر کلاینت باشه جاش آی پی سرورو میذارم
ممنون میشم اگر کسی کمکی بکنه

sm_1366
پنج شنبه 06 شهریور 1393, 15:30 عصر
خودم خطاشو گرفتم
مشکل حل شد سر فرصت حتما کد صحیح رو میذارم اینجا شاید به درد بنده خدایی خورد
کد اتچ اینطور اصلاح شد


SqlConnection.ClearAllPools();
try
{
SqlConnection con1 = new SqlConnection();
con1.ConnectionString = "Data Source=.;Initial Catalog=master;Integrated Security=True";
con1.Open();
string str = "use master;" + "EXECUTE sp_attach_db @dbname = N'" + database + "' , " +
" @filename1 = N'" + spath + "\\DataBase\\" + database + ".mdf'," +
"@filename2 = N'" + spath + "\\DataBase\\" +database + "_log.ldf'";

SqlCommand cmd = new SqlCommand(str, con1);
cmd.ExecuteNonQuery();
con1.Close();
result = myproject.MsgBox.ShowMessage(0, "عمل اتچ با موفقیت انجام شد ", "توجه", "تائید", "خير", "انصراف", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button2, MessageBoxOptions.RightAlign);

}

catch (Exception x)
{
if (x.Message.IndexOf("already exists") >= 0)
result = myproject.MsgBox.ShowMessage(0, "این دیتابیس قبلا اتچ شده ", "توجه", "تائید", "خير", "انصراف", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button2, MessageBoxOptions.RightAlign);

else
MessageBox.Show(x.Message);
}
}



و اما ایرادی که برای دیتچ میگیره ...
زمانی که موقع ورود به برنامه دیتابیس مورد نظر رو اتچ میکنه همون لحظه نمیتونه بازش کنه ... دلیلشو نفهمیدم کانکشن استرینگ رو بلافاصله بعده اتچ با نام همون دیتابیس ست میکنم اما باز خطا میده
و باید مجددا وارد بشیم که خطا نده ...