PDA

View Full Version : سوال: مشکل خیلی عجیب در ریستور کردن بانک sql



farboodj1375
پنج شنبه 06 شهریور 1393, 23:34 عصر
با سلام خدمت همه.
من قبلا ازین کد برای restore کردن بانک استفاده میکردم ، به این صورت که این کد رو به صورت Stored Procedure تو محیط اس کیو ال منیجمنت استادیو مینوشتم و از سی شارپ اونو فراخونی میکردم . قلا درست کار میکرد. ولی الان که خواستم استفاده کنم ارور میده میگه این دیتابیس احتمالا آفلاینه و پیداش نمیکنیم! ولی خب این کد آفلاین کردن دیتابیس لازمه! تا ارتباطات با بانک قطع شه! قبلا هم آخه با همین روش کار میکردم و مشکلی نبود.. خواهشا راهنمایی کنید...
ممنون.
کد من :


Create proc MyRestore
@patchFile nvarchar(400)
as
Alter Database DataBaseName Set Offline with rollback immediate
restore database DataBaseName From Disk = @patchFile With Replace
Alter Database DataBaseName Set Online
go

veniz2008
پنج شنبه 06 شهریور 1393, 23:52 عصر
سلام.
آیا از اتچ بودن دیتابیس به sql server مورد نظر، اطمینان دارید؟
برای راهنمایی بهتر یا یه عکس از خطا بذارید یا متن انگلیسی خطا رو قرار بدید.

farboodj1375
جمعه 07 شهریور 1393, 00:41 صبح
سلام.ممنون از جوابتون.بله دیتابیس اتچ هستو جالبه من دقیقا همین روش رو قبلا استفاده میکردم.
این متن ارور هست که تو برنامه با دستور try و catch متن ارور رو بصورت مسیج باکس گرفتم.
پیشاپیش ممنون از همکاریتون.

erfan_urchin
جمعه 07 شهریور 1393, 01:12 صبح
شما آفلاین نکن دیتابیسو، single user بکن. از این کد استفاده کن
ALTER DATABASE DBname SET SINGLE_USER with ROLLBACK IMMEDIATE

veniz2008
جمعه 07 شهریور 1393, 02:56 صبح
سلام.ممنون از جوابتون.بله دیتابیس اتچ هستو جالبه من دقیقا همین روش رو قبلا استفاده میکردم.
این متن ارور هست که تو برنامه با دستور try و catch متن ارور رو بصورت مسیج باکس گرفتم.
پیشاپیش ممنون از همکاریتون.
ظاهرا این یه باگ هست که در نسخه های sql 2008 و sql 2008 R2 برای بعضی از کاربران مشاهده شده و دلیل مشخصی هم ندیدم که جایی براش ذکر بشه :
https://connect.microsoft.com/SQLServer/feedback/details/694675/could-not-find-database-id-0-name-dbname-the-database-may-be-offline-wait-a-few-minutes-and-try-again
شما یه سری کار رو انجام بده :
ابتدا درون sql جهت بررسی وضعیت دیتابیس مورد نظر کد زیر رو درون یک New Query اجرا کن. این کد مشخصات کاملی از تمام دیتابیس های sql server رو بهتون نمایش میده. در خروجی نمایش داده شده یه ستون دارید به نام status که وضعیت جاری دیتابیس ها رو نشون میده. دیتابیس هایی که در وضعیت online قرار دارند شماره کدشون 65536 هستش. اگر کد دیتابیس شما چیزی غیر از این هستش سعی کنید با دستوری که در ادامه میذارم دیتابیس رو به حالت online ببرید.
پس ابتدا این کد رو اجرا کنید و ستون status رو برای دیتابیس مورد نظر ملاحظه کنید :

select * from master.dbo.sysdatabases
در صورتیکه کد status برای دیتابیس مورد نظر 65536 نیست از کد زیر برای online کردن دیتابیس استفاده کنید :

ALTER DATABASE DbHotel SET ONLINE
بعد از اجرای دستور بالا، دوباره کوئری اولی رو که گذاشتم اجرا کنید و ستون status رو مشاهده کنید. اگر دیتابیس ONLINE شد، برنامه سی شارپ خودتون رو اجرا و تست کنید.
اگر مشکلتون با این روش حل بشه، در سمت برنامه کاربردی و برای اطمینان خاطر از تکرار مجدد چنین مشکلی می تونید قبل از اجرای کوئری Restore، ابتدا از همین کوئری اولی که گذاشتم استفاده کنید و اول وضعیت status دیتابیس رو چک کنید که اگر برابر با 65536 بود اونوقت اقدام به Restore کردن کنید و اگر نبود با کوئری دومی که گذاشتم اول اونو ONLINE کنید و در ادامه کدهای Restore رو قرار بدید.

farboodj1375
جمعه 07 شهریور 1393, 09:52 صبح
شما آفلاین نکن دیتابیسو، single user بکن. از این کد استفاده کن
ALTER DATABASE DBname SET SINGLE_USER with ROLLBACK IMMEDIATE

ممنون.ولی از این روش استفاده کردم قبلا با جستجوهایی که کردم.جواب نداد متاسفانه.........

farboodj1375
جمعه 07 شهریور 1393, 09:56 صبح
ظاهرا این یه باگ هست که در نسخه های sql 2008 و sql 2008 R2 برای بعضی از کاربران مشاهده شده و دلیل مشخصی هم ندیدم که جایی براش ذکر بشه :
https://connect.microsoft.com/SQLServer/feedback/details/694675/could-not-find-database-id-0-name-dbname-the-database-may-be-offline-wait-a-few-minutes-and-try-again
شما یه سری کار رو انجام بده :
ابتدا درون sql جهت بررسی وضعیت دیتابیس مورد نظر کد زیر رو درون یک New Query اجرا کن. این کد مشخصات کاملی از تمام دیتابیس های sql server رو بهتون نمایش میده. در خروجی نمایش داده شده یه ستون دارید به نام status که وضعیت جاری دیتابیس ها رو نشون میده. دیتابیس هایی که در وضعیت online قرار دارند شماره کدشون 65536 هستش. اگر کد دیتابیس شما چیزی غیر از این هستش سعی کنید با دستوری که در ادامه میذارم دیتابیس رو به حالت online ببرید.
پس ابتدا این کد رو اجرا کنید و ستون status رو برای دیتابیس مورد نظر ملاحظه کنید :

select * from master.dbo.sysdatabases
در صورتیکه کد status برای دیتابیس مورد نظر 65536 نیست از کد زیر برای online کردن دیتابیس استفاده کنید :

ALTER DATABASE DbHotel SET ONLINE
بعد از اجرای دستور بالا، دوباره کوئری اولی رو که گذاشتم اجرا کنید و ستون status رو مشاهده کنید. اگر دیتابیس ONLINE شد، برنامه سی شارپ خودتون رو اجرا و تست کنید.
اگر مشکلتون با این روش حل بشه، در سمت برنامه کاربردی و برای اطمینان خاطر از تکرار مجدد چنین مشکلی می تونید قبل از اجرای کوئری Restore، ابتدا از همین کوئری اولی که گذاشتم استفاده کنید و اول وضعیت status دیتابیس رو چک کنید که اگر برابر با 65536 بود اونوقت اقدام به Restore کردن کنید و اگر نبود با کوئری دومی که گذاشتم اول اونو ONLINE کنید و در ادامه کدهای Restore رو قرار بدید.


خیلی ممنو ازینکه وقت میذارید و با حوصله توضیح میدید.متشکرم....
با اون کوئری که گفتید چک کردم همه دیتابیسام 65544 بود وضعیتشون. ولی این دیتابیس که من دارم باهاش کار میکنم و مشکل دارم ، وضعیتش 1073807369 بود . بعد همون کوئری که برای آنلاین کردن گفته بودید رو اجرا کردم ولی بازم وضعیتش همین بود و تغییری نکرد.دیتابیس آنلاینه . مشکل از جای دیگست که شماره وضعیتش فرق داره گویا...

متشکر میشم راهنمایی کنید...

veniz2008
جمعه 07 شهریور 1393, 10:44 صبح
با اون کوئری که گفتید چک کردم همه دیتابیسام 65544 بود وضعیتشون. ولی این دیتابیس که من دارم باهاش کار میکنم و مشکل دارم ، وضعیتش 1073807369 بود . بعد همون کوئری که برای آنلاین کردن گفته بودید رو اجرا کردم ولی بازم وضعیتش همین بود و تغییری نکرد.دیتابیس آنلاینه . مشکل از جای دیگست که شماره وضعیتش فرق داره گویا...

کد 65544 وضعیت online رو برای دیتابیس های سیستمی مثل master و tempdb و ... نشون میده.
کد 1073807369 که برای دیتابیس شما وجود داره نشان دهنده حالت offline دیتابیس هست که بخاطر همون مشکلی هست که در پست قبل توضیح دادم.
یه دیتابیس دیگه رو هم اتچ کنید و ببیند همین مشکل رو دارید یا نه. این کارها رو انجام بدید ببینید مشکلتون حل میشه :
از طریق دیتابیس سیستمی master اقدام به online کردن دیتابیس کنید. برای این کار از کد زیر استفاده کنید :

use master
ALTER DATABASE DbHotel SET ONLINE
حالا دوباره وضعیت دیتابیس رو چک کنید.
اگر مشکلتون حل نشد، با دستور drop، اقدام به حذف دیتابیس از ساختار Sql Server Managment Studio کنید (این دستور باعث حذف دیتابیس از روی هارد دیسک می شود پس یک پشتیبان ازش تهیه کنید.). بعد از حذف دوباره دیتابیس رو Attach کنید و وضعیت دیتابیس رو چک کنید.
دستور drop برای دیتابیس :

use master
DROP DATABASE DbHotel
نتیجه رو لطفا اعلام کنید تا بعدا برای دوستانی که این مشکل براشون پیش میاد، بتونیم یه جواب و راه حل مناسب در اختیار داشته باشیم.

farboodj1375
جمعه 07 شهریور 1393, 10:57 صبح
سلام. ممنون از پاسختون. با کد

use master

ALTER DATABASE DbHotel SET ONLINE








وضعیت دیتابس درست شد و همون 65536 شد . اما وقتی کدم رو از تو سی شارپ اجرا کردم و دستور ریستور رو از اون استورد پروسیجری که گفتم صدا زدم برنامه همون ارور قبلی رو داد و وضعیت دیتابیس هم دوباره همون 1073807369 شد .......

veniz2008
جمعه 07 شهریور 1393, 11:02 صبح
سلام. ممنون از پاسختون. با کد

use master

ALTER DATABASE DbHotel SET ONLINE








وضعیت دیتابس درست شد و همون 65536 شد . اما وقتی کدم رو از تو سی شارپ اجرا کردم و دستور ریستور رو از اون استورد پروسیجری که گفتم صدا زدم برنامه همون ارور قبلی رو داد و وضعیت دیتابیس هم دوباره همون 1073807369 شد .......



مراحل قبل رو یک بار دیگه انجام بدید تا دیتابیس به حالت online برگرده. در گام بعدی بصورت زیر عمل کنید :
درون Stored Procedure از use master در بالای دستور restore استفاده کنید تا عملیات restore از طریق دیتابیس master انجام بشه.

farboodj1375
جمعه 07 شهریور 1393, 11:08 صبح
ممنون . ولی تو استورد پروسیجر اجازه استفاده از کلمه Use رو نداریم و ارور میده . تست کردید شما؟!

farboodj1375
جمعه 07 شهریور 1393, 11:26 صبح
یه مسئله دیگه .. من وضعیت همه دیتابیسام 65545 هست. همه دیتابیسام همین هستن.شما گفته بودید 65536 باید باشن؟! مفهوم این تفاوت چیه؟!
اینو الان متوجه شدم.

و یه مسئله دیگه هم اینکه لطفا نحوه استفاده از Use Master رو تو استورد پروسیجر بگید . ممنوون..

veniz2008
جمعه 07 شهریور 1393, 11:52 صبح
ممنون . ولی تو استورد پروسیجر اجازه استفاده از کلمه Use رو نداریم و ارور میده . تست کردید شما؟!
65545 یا 65544 ؟؟
دیتابیس های سیستمی که همراه خود sql نصب میشن براشون کد 65544 بعنوان کد online بودن در نظر گرفته شده ولی دیتابیس هایی که کاربران می سازن باید کد 65536 رو داشته باشن.
درون Stored Procedure می تونید از master استفاده کنید، فقط این نکته رو مد نظر داشته باشید که sp شما داخل دیتابیس master و در همون بخش stored procedure ها ایجاد میشه.
در حالت عادی که sp ها رو درون دیتابیس خودتون می سازید، اگر بعد از ایجاد شدن در حالت Modify دوباره sp رو باز کنید می بینید که بالاش از use DbHotel استفاده شده اما با این کار sp شما درون master ساخته میشه و از همونجا هم اجرا میشه.

use master
GO
create proc MyRestore
@pathfile nvarchar(400)
as
ALTER DATABASE DbHotel SET OFFLINE WITH ROLLBACK IMMEDIATE
RESTORE DATABASE DbHotel FROM DISK = @pathfile WITH REPLACE
ALTER DATABASE DbHotel SET ONLINE
GO

farboodj1375
جمعه 07 شهریور 1393, 11:59 صبح
آها ... ممنون.

فقط یه سوال ، ببخشید سوالام زیاد شدن. اینکه میگید این استورد پروسیجر توی دیتابیس مستر ایجاد میشه ، مگه ما فقط دیتابیس خودمونو به سیستم مشتری انتقال نمیدیم ؟ خب پس اون پروسیجر که تو دیتابیس مستر ایجاد شده تو سیستم خودمون میمونه؟! خب پس تکلیف اجرای این پروسیجر تو سیستم مشتری چی میشه!؟
یا من اشتباه میکنم؟! ا

و در ضمن نتیجه استفاده از این Master رو هم اعلام میکنم الان.

farboodj1375
جمعه 07 شهریور 1393, 11:59 صبح
یه مسئله دیگه .. من وضعیت همه دیتابیسام 65545 هست. همه دیتابیسام همین هستن.شما گفته بودید 65536 باید باشن؟! مفهوم این تفاوت چیه؟!
اینو الان متوجه شدم.

farboodj1375
جمعه 07 شهریور 1393, 12:05 عصر
65545 یا 65544 ؟؟
دیتابیس های سیستمی که همراه خود sql نصب میشن براشون کد 65544 بعنوان کد online بودن در نظر گرفته شده ولی دیتابیس هایی که کاربران می سازن باید کد 65536 رو داشته باشن.
درون Stored Procedure می تونید از master استفاده کنید، فقط این نکته رو مد نظر داشته باشید که sp شما داخل دیتابیس master و در همون بخش stored procedure ها ایجاد میشه.
در حالت عادی که sp ها رو درون دیتابیس خودتون می سازید، اگر بعد از ایجاد شدن در حالت Modify دوباره sp رو باز کنید می بینید که بالاش از use DbHotel استفاده شده اما با این کار sp شما درون master ساخته میشه و از همونجا هم اجرا میشه.

use master
GO
create proc MyRestore
@pathfile nvarchar(400)
as
ALTER DATABASE DbHotel SET OFFLINE WITH ROLLBACK IMMEDIATE
RESTORE DATABASE DbHotel FROM DISK = @pathfile WITH REPLACE
ALTER DATABASE DbHotel SET ONLINE
GO

ممنون . با این روش که گفتید جواب داد و عمل ریستور به درستی انجام شد . فقط مشکلی که هست همونیه که گفتم و اینه که با توجه به اینکه این پروسیجر توی دیتابیس master ذخیره میشه و توی برنامه هم تو کانکشن استرینگ بگیم این پروسیجرو از دیتابس master بخون ، تکلیف استفاده از این کد توی سیستمای دیگه چی میشه!؟ ماکه فقط دیتابیس خودمونو انتقال میدیم به سیستم مشتری....؟!

پیشاپیش ممنون از پاسخاتون.

farboodj1375
جمعه 07 شهریور 1393, 12:09 عصر
نه برای من برای همه دیتابیسام وضعیت 65544 ه ....

جالبه بعد از اینکه یک بار این کد ریستور رو با use master اجرا کردم تو سی شارپ و به درستی انجام شد ، دوباره وضعیت اون دیتابیس 1073807369 شد . ولی بازم دفعه بعد با همین وضعیت 1073807369 از تو برنامه سی شارپم دوباره عمل ریستور رو انجام دادم و بازم عمل ریستور به درستی انجام شد . گویا دیتابیس آنلاین هست و این وضعیت ها چیز دیگه ای رو نشون میدن...

veniz2008
جمعه 07 شهریور 1393, 13:10 عصر
آها ... ممنون.

اینکه میگید این استورد پروسیجر توی دیتابیس مستر ایجاد میشه ، مگه ما فقط دیتابیس خودمونو به سیستم مشتری انتقال نمیدیم ؟ خب پس اون پروسیجر که تو دیتابیس مستر ایجاد شده تو سیستم خودمون میمونه؟! خب پس تکلیف اجرای این پروسیجر تو سیستم مشتری چی میشه!؟
یا من اشتباه میکنم؟! ا

بله حرفتون درسته، ما فقط دیتابیس خودمون رو منتقل می کنیم و قاعدتا sp هایی منتقل میشن که توی دیتابیس خودمون باشه. من خودم همیشه از همون روش نرمال و همیشگی برای مشتری استفاده می کنم و هیچ مشکلی هم نبوده ولی چون مشکل شما خاص هست و در واقع یه باگ محسوب میشه بنابراین برای رفع این مشکل، ساخت SP رو درون کدهای سی شارپ مدیریت کنید تا در زمان اجرای عملیات Restore اول sp درون master ساخته بشه و بعد عملیات Restore انجام بشه (شما روی سیستم مشتری sqlنصب می کنید که همراه نصبش دیتابیس master هم نصب میشه).
برای این کار و قبل از ایجاد sp ابتدا باید چک کنید که sp از قبل ایجاد نشده باشه (برای بار اول ایت مورد پیش نمیاد چون sp وجود نداره ولی در مراحل بعدی این مشکل اگر چک نکنید براتون بوجود میاد).
کد زیر وجود یک sp با نام MyRestore رو درون دیتابیس master بررسی میکنه (به کانکشن استرینگ دقت کنید که از دیتابیس master داره استفاده میکنه).

SqlConnection con = new SqlConnection("server = .\\md2012;DataBase = master; Integrated Security = true");
SqlDataAdapter da = new SqlDataAdapter("select * from sysobjects where type='P' and name='MyRestore'", con);
DataTable dt = new DataTable();
da.Fill(dt);
if (dt.Rows.Count > 0)
{
MessageBox.Show("این استورد پروسیجر قبلا ایجاد شده است");
}
اگر sp موجود بود کافیه دستور restore رو درون شرط if و به جای پیغام قرار داده شده بذارید. اگر هم وجود نداشت درون بخش else باید sp رو ایجاد کنید. در کد زیر هر جایی که کاراکتر کنترلی r\n\ می بینید فقط جنبه ظاهر سازی sp رو داره و واسه اینه که هر عبارت در یک سطر درون sp تولید بشه :

SqlConnection con = new SqlConnection("server=.\\md2012;database=master;integrated security=true");
SqlCommand cmd = new SqlCommand("create proc MyRestore \r\n@pathfile nvarchar(400) \r\nAS \r\nALTER DATABASE DbHotel SET OFFLINE WITH ROLLBACK IMMEDIATE \r\nRESTORE DATABASE DbHotel FROM DISK = @pathfile WITH REPLACE \r\nALTER DATABASE DbHotel SET ONLINE", con);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
MessageBox.Show("استورد پروسیجر با موفقیت ایجاد گردید");

حالا sp شما آماده است و می تونید مثل سابق از این sp استفاده کنید (کانکشن استرینگ رو دقت کنید که از دیتابیس master استفاده کنید).
خلاصه مطلب :
شما در if چک می کنید که اگر sp وجود داشت، داخل همین if ، باید sp رو صدا بزنید و آدرس فایل backup رو بهش بدید تا Restore انجام بشه.
اگر هم وجود نداشت باید در بخش else، ابتدا sp رو ایجاد و در ادامه همون کدها sp رو صدا بزنید و آدرس فایل backup رو بهش بدید تا Restore انجام بشه.

نه برای من برای همه دیتابیسام وضعیت 65544 ه ....
جالبه بعد از اینکه یک بار این کد ریستور رو با use master اجرا کردم تو سی شارپ و به درستی انجام شد ، دوباره وضعیت اون دیتابیس 1073807369 شد . ولی بازم دفعه بعد با همین وضعیت 1073807369 از تو برنامه سی شارپم دوباره عمل ریستور رو انجام دادم و بازم عمل ریستور به درستی انجام شد . گویا دیتابیس آنلاین هست و این وضعیت ها چیز دیگه ای رو نشون میدن...
کد 65544 همونطور که در پست های قبلی هم توضیح دادم مربوط به دیتابیس های سیستمی هست. شما باید ستون status مربوط به دیتابیس خودتون رو چک کنید.
بعد از عمل restore، یک بار sql رو ببندید و دوباره اجرا کنید، احتمالا وضعیت رو درست نشون خواهد داد.
موفق باشید.

farboodj1375
جمعه 07 شهریور 1393, 13:39 عصر
ممنون از راهنماییتون.
درست با این روش مشکل برطرف میشه.

متشکر.


و یه سوال دیگه ،پیشنهادی برای رفع این اشکال ندارید؟مثلا sqlsever رو پاک کنم و دوباره نصب کنم .. یا .........؟خیلی بده اینطوری که....من از sql server 2008 استفاده میکنم/.
جالبه من تو پروژه قبلیم از همون روش معمولی استفاده کردم و هیچ مشکلی نبود . اون موقع نسخه 2008 r2 اس کیو ال نصب بود.

راستی من همه دیتابیسام حتی اونایی که خودم ساختم وضعیتشون همون 65544 ه.تو تصویر میبینید. دو تا دیتابیس آخر که خودم ساختم رو میبینید وضعیتشون رو . البته اون DBHotel فرق داره .. که البته آنلاین هست و این شماره وضعیتش مربوط به چیز دیگه ای هست. اون DbCloob هم خودم ساختم که 65544 ه وضعیتش.

veniz2008
جمعه 07 شهریور 1393, 16:17 عصر
و یه سوال دیگه ،پیشنهادی برای رفع این اشکال ندارید؟مثلا sqlsever رو پاک کنم و دوباره نصب کنم .. یا .........؟خیلی بده اینطوری که....من از sql server 2008 استفاده میکنم/.
جالبه من تو پروژه قبلیم از همون روش معمولی استفاده کردم و هیچ مشکلی نبود . اون موقع نسخه 2008 r2 اس کیو ال نصب بود.

راستی من همه دیتابیسام حتی اونایی که خودم ساختم وضعیتشون همون 65544 ه.تو تصویر میبینید. دو تا دیتابیس آخر که خودم ساختم رو میبینید وضعیتشون رو . البته اون DBHotel فرق داره .. که البته آنلاین هست و این شماره وضعیتش مربوط به چیز دیگه ای هست. اون DbCloob هم خودم ساختم که 65544 ه وضعیتش.

پیشنهادی برای رفع این اشکال ندارید؟مثلا sqlsever رو پاک کنم و دوباره نصب کنم .. یا .........؟خیلی بده اینطوری که....من از sql server 2008 استفاده میکنم/.
جالبه من تو پروژه قبلیم از همون روش معمولی استفاده کردم و هیچ مشکلی نبود . اون موقع نسخه 2008 r2 اس کیو ال نصب بود.

راستی من همه دیتابیسام حتی اونایی که خودم ساختم وضعیتشون همون 65544 ه.تو تصویر میبینید. دو تا دیتابیس آخر که خودم ساختم رو میبینید وضعیتشون رو . البته اون DBHotel فرق داره .. که البته آنلاین هست و این شماره وضعیتش مربوط به چیز دیگه ای هست. اون DbCloob هم خودم ساختم که 65544 ه وضعیتش.
بهترین کار اینه این مشکل رو در انجمن SQL همین سایت یا انجمن SQL سایت نیک آموز (www.nikamooz.com) مطرح کنید. شاید بدون نیاز به نصب نسخه جدید، بتونید مشکلتون رو حل کنید ولی پیشنهاد کلی که میشه کرد اینه که به نسخه های 2012 یا 2014 مهاجرت کنید.
در مورد کدی هم که مربوط به status هست بهتره همونجا سوالتون رو مطرح کنید تا جواب دقیق تری رو بدست بیارید ولی چندتا سایت که من دیدم فقط دیتابیس های سیستمی 65544 بودن.
تو لینک زیر، مایکروسافت یه لیست از اعداد برای status ارائه کرده که می تونید مطالعه کنید.
http://msdn.microsoft.com/en-us/library/ms179900.aspx
موفق باشید.

farboodj1375
جمعه 07 شهریور 1393, 16:25 عصر
بهترین کار اینه این مشکل رو در انجمن SQL همین سایت یا انجمن SQL سایت نیک آموز (www.nikamooz.com (http://www.nikamooz.com)) مطرح کنید. شاید بدون نیاز به نصب نسخه جدید، بتونید مشکلتون رو حل کنید ولی پیشنهاد کلی که میشه کرد اینه که به نسخه های 2012 یا 2014 مهاجرت کنید.
در مورد کدی هم که مربوط به status هست بهتره همونجا سوالتون رو مطرح کنید تا جواب دقیق تری رو بدست بیارید ولی چندتا سایت که من دیدم فقط دیتابیس های سیستمی 65544 بودن.
تو لینک زیر، مایکروسافت یه لیست از اعداد برای status ارائه کرده که می تونید مطالعه کنید.
http://msdn.microsoft.com/en-us/library/ms179900.aspx
موفق باشید.

ممنون . فقط آخرین سوال :‌از نسخه ۲۰۱۲ اس کیو ال سرور که استفاده کنم برای ساخت پکیج باید چیکار کنم؟! چون اس کیو ال سرور ۲۰۰۸ تو پکیج ساز خود ویژوال استادیو ۲۰۱۰ وجود داره.
ممنون

veniz2008
شنبه 08 شهریور 1393, 17:41 عصر
از نسخه ۲۰۱۲ اس کیو ال سرور که استفاده کنم برای ساخت پکیج باید چیکار کنم؟! چون اس کیو ال سرور ۲۰۰۸ تو پکیج ساز خود ویژوال استادیو ۲۰۱۰ وجود داره.
ممنون
می تونید بعد از کامل شدن پروژه ازش یک script تهیه کنید که با sql 2008 سازگار باشه. نحوه گرفتن script بسیار ساده هست :
مراحل رو به همراه شکل ها توضیح میدم تا مشکلی پیش نیاد :
در محیط management studio روی دیتابیس مورد نظر کلیک راست کنید و از گزینه Task، گزینه Generate Scripts رو انتخاب کنید :

http://barnamenevis.org/attachment.php?attachmentid=111890&d=1381830592

اگر پنجره ای ظاهر شد کلید Next رو بزنید تا به پنجره زیر برسید. در این پنجره، کلیه مواردی که در دیتابیس استفاده کردید از جمله جدوال، stored procedure ها،view ها و ... انتخاب کنید تا به اسکریپت اضافه بشن.

http://barnamenevis.org/attachment.php?attachmentid=111889&d=1381830588

در گام بعدی، ابتدا دکمه Advanced رو کلیک کنید.

http://barnamenevis.org/attachment.php?attachmentid=111892&d=1381830601

حال در پنجره باز شده، گزینه های کلیدی زیر رو لحاظ کنید :
الف) Script for Server Version : در اینجا بایستی ورژن SQL Server سیستم مقصد رو انتخاب کنید. من اسکریپت رو از SQL Server 2012 تهیه و نسخه مقصد من SQL Server 2008 R2 هست (شما باید هر نسخه ای از Sql رو که به پکیج تون اضافه می کنید در اینجا هم لحاظ کنید).
ب) Types of data to scrip : اگر مایلید داده های جداول شما هم به سیستم مقصد منتقل بشه این گزینه رو بر روی Schema and data تنطیم کنید.
توجه : گزینه های Script Foreign Keys و Script Primary Keys بصورت پیش فرض True هستن. اگر نبودن اونها رو بر روی True قرار بدید.

http://barnamenevis.org/attachment.php?attachmentid=111891&d=1381830596

بر روی Next کلیک و در انتها دکمه Finish رو کلیک کنید تا Script شما تهیه بشه.
http://barnamenevis.org/attachment.php?attachmentid=111888&d=1381830582

بعد از ساخت script، اونو با notepade باز کنید و دو خط کد زیر رو در ابتدای اون قرار بدید (تاکید میکنم دو خط ابتدای فایل script باید این کدها باشه). فرض میگیریم دیتابیس شما که ازش script گرفتی اسمش DbHotel باشه :


Create Database DbHotel
GO

حالا script شما آماده است و می تونید درون پکیج قرارش بدید.
در اولین اجرای برنامه، باید این script رو اجرا کنید تا دیتابیس و جداول شما ساخته بشه. برای این کار نیاز هست که در محیط ویژوال استودیو رفرنس های زیر رو اضافه کنید :
برای اضافه کردن یک Reference بر روی پوشه Reference پروژتون کلیک راست کنید و از گزینه Add Reference استفاده کنید :
Microsoft.SqlServer.ConnectionInfo ،
Microsoft.SqlServer.Smo،
Microsoft.SqlServer.Management.Sdk.Sfc
حالا در بالای فرمتون، فضای نام های زیر رو اضافه کنید :

using System.IO;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
و درون فرم لود یا سازنده یا هر جای دیگه ای که می خواید دیتابیس رو اتچ کنید (در اینجا در واقع اتچ ندارید، دیتابیس و جداول خودکار ساخته میشن) کدهای زیر رو قرار بدید.
در کد زیر فرض بر این است که شما server سیستم مشتری رو بدست آوردید (اگر در این زمینه مشکل دارید بارها تو سایت دربارش بحث شده، که با جستجو می تونید مطالب مفیدی پیدا کنید).
همچنین فرض بر این هست که فایل script درون همان درایوی هست که برنامه شما(فایل exe) از اونجا اجرا میشه (مهم نیست فایل script کنار فایل exe باشه یا نه، مهم اینه فایل exe برنامه و فایل script درون یک درایو باشن).

SqlConnection con = new SqlConnection("server = .\\sqlexpress;database = master;integrated security = true");
FileInfo file = new FileInfo(string.Format("{0}:\\script.sql",System.IO.Directory.GetCurrentDirectory().Substri ng(0,1)));
string script = file.OpenText().ReadToEnd();
file.OpenText().Close();
Server myserver = new Server(new ServerConnection(con));
myserver.ConnectionContext.ExecuteNonQuery(script) ;
MessageBox.Show("دیتابیس با موفقیت ساخته شد");
موفق باشید.

farboodj1375
شنبه 08 شهریور 1393, 23:40 عصر
واقعا ممنونم از راهنماییتون . خیلی خوب بود . ممنون . تشکر زدن خالی کافی نبود!