PDA

View Full Version : سوال: چک کردن نصب بودن Sql server روی سیستم



تبسم ساینا
دوشنبه 20 بهمن 1393, 20:56 عصر
سلام.. تووی سی شارپ ّا چه دستوری میشه فهمید که sql server روی سیستم نصب هست یا نه ؟
فک میکنم باید از دستورات رجیستری استفاده کرد.ممنون میشم راهنمایی کنید.

plus
دوشنبه 20 بهمن 1393, 22:59 عصر
یکی از راه ها که نرم افزارهای deployment هم از اون استفاده میکنند. بررسی رجستری در این شاخه هست:


HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server

برای مثال، برای بررسی SQL Server Express 2005 SP2 باید مقدار Version در شاخه

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\SQLEXPRESS\MSSQLServer\CurrentVersion
برابر با 9.00.3042.00 باشه.

ghasem110deh
سه شنبه 21 بهمن 1393, 00:44 صبح
سلام
کدی رو که لطف کردین گذاشتین باید توی program.cs چک بشه با فرم اول برنامه ؟

plus
سه شنبه 21 بهمن 1393, 01:06 صبح
کدی نگذاشتم که فقط محل ذخیره کلید مربوط به Version رو گذاشتم D: .هر جا لازم به بررسی باشه باید کد مروبط به خوندن مقدار رجیستری اجرا بشه. معمولا اگه در Setup ی که ساخته شده مشخص شده باشه که پیشنیاز نرم افزار چی هست، Setup این بررسی رو انجام میده. اگه نیاز چیز دیگه ای هست، بستگی به اون باید بررسی رو انجام داد و جای مشخصی نداره.

SabaSabouhi
سه شنبه 21 بهمن 1393, 09:13 صبح
سلام.. تووی سی شارپ ّا چه دستوری میشه فهمید که sql server روی سیستم نصب هست یا نه ؟
فک میکنم باید از دستورات رجیستری استفاده کرد.ممنون میشم راهنمایی کنید.

سلام
پیش‌نهاد می‌کنم دنبال این راه نری. اگه بخوای این کار رو بکنی باید در نظر بگیری که ممکنه یه نفر
روی دستگاهش SQL Server یا Express Edition یا LocalDb رو نصب کرده باشه که هرکدوم یه جور تنظیمات داره.
ضمن این که هر کدوم هم نسخه‌های متنوع داره. تازه ممکنه Sql Server نصب باشه، اما سرویس‌اش غیر فعال
باشه. به علاوه ممکنه کاربر شما Sql Server دیگری رو تو شبکه استفاده کنه.

صبا صبوحی

ghasem110deh
سه شنبه 21 بهمن 1393, 12:59 عصر
سلام



معمولا اگه در Setup ی که ساخته شده مشخص شده باشه که پیشنیاز نرم افزار چی هست، Setup این بررسی رو انجام میده.


چطوری و از کجا اینو اعمال کنم ؟ (که اگه sql نصب نبود نصب انجام نشه)
با اینستال شیلد کار میکنم !



پیش‌نهاد می‌کنم دنبال این راه نری.


پیشنهاد شما چیه ؟
مثلا من الان بعد از ستاپ سازی و غیره ، روی سیستمی که اس کیو ال نصب نیست برنامه رو نصب میکنم و اجرا میکنم حدود 10 تا 12 ثانیه هنگ میکنه !
بعد پیغام "عدم خواندن اطلاعات از بانک" رو میده که تو catch نوشتم ؛
--------------------------------------------------------------------------
یه سوال دیگه این که راهی هست که بعد از نصب (sql رو کلاینت نصب باشه) دیتابیس خودش اتچ بشه ؟

SabaSabouhi
سه شنبه 21 بهمن 1393, 15:08 عصر
سلام



چطوری و از کجا اینو اعمال کنم ؟ (که اگه sql نصب نبود نصب انجام نشه)
با اینستال شیلد کار میکنم !



سلام
فکر کنم این قسمت رو اشتباه از قول من نقل کردی، چون من مطلبی راجع به Setup ننوشته بودم :لبخندساده:




پیشنهاد شما چیه ؟
مثلا من الان بعد از ستاپ سازی و غیره ، روی سیستمی که اس کیو ال نصب نیست برنامه رو نصب میکنم و اجرا میکنم حدود 10 تا 12 ثانیه هنگ میکنه !
بعد پیغام "عدم خواندن اطلاعات از بانک" رو میده که تو catch نوشتم ؛
--------------------------------------------------------------------------
یه سوال دیگه این که راهی هست که بعد از نصب (sql رو کلاینت نصب باشه) دیتابیس خودش اتچ بشه ؟

پیشنهاد من اینه که همون روش عادی رو انجام بدی، connection string توی config برنامه.
اون هنگ کردنی که شما می‌گی، در واقع connection timeout هست که می‌تونی زمانش رو کمتر کنی.
زمان پیش‌فرض یک دقیقه هست که خیلی زیاده، برای کامپیوتر خودت یا حتا شبکه‌های امروزی 5 ثانیه هم کافی هست.
اما کار دیگه‌ای که می‌تونی انجام بدی که ببینی خطا می‌گیری یا نه، اینه که تو یه thread دیگه ارتباط با sql رو تست کنی تا
کاربر مجبور نشه منتظر timeout بمونه.

و برای پرسش بعدی شما
پیش‌نهاد می‌دم که برنامه‌ی نصب شما، script دیتابیس رو داشته باشه و دیتابیس رو خودش بسازه.
من مدت‌هاست که این کار رو می‌کنم و از مشکلات و «شر» عدم سازگاری نسخه‌های مختلف sql راحت شدم.
یا باید با نسخه‌ی پایین کار کنی که بتونی رو نسخه‌های مساوی یا بالاتر attach یا restore کنی، و یا این که
باید مطمئن باشی که روی دستگاه مشتری حداقل نسخه‌ای مثل نسخه‌ی خودت نصب هست که گاهی عملی نیست.
من با نسخه‌ی 2014 کار می‌کنم که روی ویندوز xp نصب نمی‌شه.
کافیه script رو مناسب با حداقل نسخه‌ی قابل پشتیبانی ( انتخاب من نسخه‌ی 2008 هست ) تولید کنی و
اون رو اجرا کنی.

صبا صبوحی

ghasem110deh
سه شنبه 21 بهمن 1393, 15:45 عصر
فکر کنم این قسمت رو اشتباه از قول من نقل کردی، چون من مطلبی راجع به Setup ننوشته بودم :لبخندساده:


ببخشید ، نقل قول از plus (http://barnamenevis.org/member.php?8256-plus) بود !
و اینجاست که میگن آدما (خودمو میگم) هر چی بیشتر میرن جلو ، متوجه میشن که هیچی بلد نیستن :)



اون هنگ کردنی که شما می‌گی، در واقع connection timeout هست که می‌تونی زمانش رو کمتر کنی.
زمان پیش‌فرض یک دقیقه هست که خیلی زیاده، برای کامپیوتر خودت یا حتا شبکه‌های امروزی 5 ثانیه هم کافی هست.


چطور یا از کجا باید زمان رو کم کرد ؟



کافیه script رو مناسب با حداقل نسخه‌ی قابل پشتیبانی ( انتخاب من نسخه‌ی 2008 هست ) تولید کنی و
اون رو اجرا کنی.


اول اینکه از اسکریپت نویسی هیچی نمیدونم :) --- :(
دوم اینکه یعنی نباید دیتابیس رو مثل روال الانم (که توی پوشه دیباگ میریزم) باشه و خود ستاپ یه دیتابیس با جدولها و فیلدها و ... ایجاد کنه ؟

plus
سه شنبه 21 بهمن 1393, 17:26 عصر
چطوری و از کجا اینو اعمال کنم ؟ (که اگه sql نصب نبود نصب انجام نشه)
با اینستال شیلد کار میکنم !
در InstallShield بخشی به اسم Prerequsites هست که در اونجا شما میتونید پیش نیاز های برنامه رو از یک لیست تعیین کنید. بقیه کار رو خود InstallSheild انجام میده. یعنی بررسی میکنه که اگه پیش نیاز مورد نظر نصب نباشه نصبش میکنه.

ghasem110deh
سه شنبه 21 بهمن 1393, 19:35 عصر
ممنون ...
یعنی خودش یه پیغام میده دیگه ! (به en)
راهی هست فارسیش کرد ؟
------------------------------
البته ببخشید اگه از بحث اصلی یکم منحرف شدم ...

plus
سه شنبه 21 بهمن 1393, 22:57 عصر
تقریبا همه بخش های InstallShield قابلیت تغییر زبان داره. فارسی سازیش بحث مفصلی داره. در بخش General Information یا در بخش Release میتونید زبان رو تعیین کنید. البته زبان فارسی به صورت پیشفرض نصب شده. باید یا خودتون فارسی کنید یا جستجو کنید نمونه هایی از فایل های فارسیش موجود هست.

SabaSabouhi
سه شنبه 21 بهمن 1393, 23:07 عصر
چطور یا از کجا باید زمان رو کم کرد ؟


سلام
تو ConnectionString باید بنویسی ConnectionTimeout=10 مثلاً برای 10 ثانیه
پیش‌فرض 60 ثانیه هست.



اول اینکه از اسکریپت نویسی هیچی نمیدونم :) --- :(
دوم اینکه یعنی نباید دیتابیس رو مثل روال الانم (که توی پوشه دیباگ میریزم) باشه و خود ستاپ یه دیتابیس با جدولها و فیلدها و ... ایجاد کنه ؟

اول: لازم نیست سکریپت نویسی بدونی، خود Sql Server امکانش رو برات گذاشته. روی دیتابیس کلید راست رو بزن و منوی Task و زیر منوی GenerateScript می‌تونی
این کار رو انجام بدی ( تو Management Studio ) تنظیمات خوبی هم داره. مثلاً می‌تونی بگی که داده‌ها رو بیاره یا نه، یا این که برای کدوم نسخه‌ی Sql سکریپت بسازه.

دوم: بله دقیقاً منظورم همینه. این کار بهترین کاره.

صبا صبوحی

golbafan
دوشنبه 27 بهمن 1393, 14:33 عصر
براحتی با چک کردن سرویس های ویندوز میتونید از نصب بودن آن باخبر بشید حتی اگر سرویس ران نباشد :چشمک:



public static bool IsServiceInstalled(string serviceName)
{
// get list of Windows services
ServiceController[] services = ServiceController.GetServices();
// try to find service name
foreach (ServiceController service in services)
{
if (service.ServiceName == serviceName)
return true;
}
return false;
}

SabaSabouhi
دوشنبه 27 بهمن 1393, 16:11 عصر
سلام
دوست عزیز، این روش برای LocalDb جواب نخواهد داد.

صبا صبوحی

تبسم ساینا
دوشنبه 27 بهمن 1393, 17:29 عصر
سلام
دوست عزیز، این روش برای LocalDb جواب نخواهد داد.

صبا صبوحی
اصلا" راهی نیس که قبل از باز کردن کانکشن بشه چک کرد کاربر به پایگاه داده از نوع Sql حالا چه Localdb چه غیر از اون دسترسی داره یانه؟

golbafan
دوشنبه 27 بهمن 1393, 18:55 عصر
سلام
دوست عزیز، این روش برای LocalDb جواب نخواهد داد.

صبا صبوحی

اوه بله درست گفتید
چون بهر حال بعد از نصب هر نسخه ای از sqlserver سرویس اون هم نصب میشه
در مورد حالت لوکال سرویس نصب نمیشه آیا؟

تبسم ساینا
دوشنبه 27 بهمن 1393, 22:17 عصر
من با این کد تست کردم شد.فک میکنم روی لوکال هم جواب بده:
DataTable dt = SqlDataSourceEnumerator.Instance.GetDataSources();
if (dt.Rows.Count == 0)
return false;
else
return true;
کد بالا برای تست کردن نصب بود و این کد هم برا بدست آوردن نام ها :
foreach (DataRow dr in dt.Rows){
ddlInstances.Items.Add(string.Concat(dr["ServerName"], "\\", dr["InstanceName"]));
}
منبــــــع (http://www.aspsnippets.com/Articles/List-Installed-SQL-Server-Instances-on-machine-and-LAN-using-C-and-VB.Net.aspx)

SabaSabouhi
سه شنبه 28 بهمن 1393, 08:12 صبح
اوه بله درست گفتید
چون بهر حال بعد از نصب هر نسخه ای از sqlserver سرویس اون هم نصب میشه
در مورد حالت لوکال سرویس نصب نمیشه آیا؟

سلام
نه دوست من، دلیلش هم اینه که LocalDb طوری طراحی شده که با اولین تلاش برای استفاده Load می‌شه.
به همین دلیل هم، همیشه اولین اجرا یه کم کندتر هست.

صبا صبوحی

SabaSabouhi
سه شنبه 28 بهمن 1393, 08:15 صبح
من با این کد تست کردم شد.فک میکنم روی لوکال هم جواب بده:
DataTable dt = SqlDataSourceEnumerator.Instance.GetDataSources();
if (dt.Rows.Count == 0)
return false;
else
return true;
کد بالا برای تست کردن نصب بود و این کد هم برا بدست آوردن نام ها :
foreach (DataRow dr in dt.Rows){
ddlInstances.Items.Add(string.Concat(dr["ServerName"], "\\", dr["InstanceName"]));
}
منبــــــع (http://www.aspsnippets.com/Articles/List-Installed-SQL-Server-Instances-on-machine-and-LAN-using-C-and-VB.Net.aspx)

سلام
دوست عزیز، به نظر من خوب نیست ما فرض کنیم که SQL به صورت Local وجود داره. یعنی اینطوری خودمون
برای نرم‌افزار خودمون محدودیت بی‌ثمری رو قائل شدیم. همیشه این امکان وجود داره که من از یه Sql Server
در محیط شبکه استفاده کنم. به همین دلیل بهترین کار تست ارتباط به شکل ایجاد یک SqlConnection و باز و
بسته کردن اون هست.

صبا صبوحی

تبسم ساینا
سه شنبه 28 بهمن 1393, 11:27 صبح
به همین دلیل بهترین کار تست ارتباط به شکل ایجاد یک SqlConnection و باز و
بسته کردن اون هست.

خب االان اینم لوکال رو شناسایی میکنه دیگه.تووی مثال منبعی که گذاشتم هستش.دستور GetDataSources این کارو نمیکنه ؟!
یا من اشتباه میکنم ؟!

golbafan
سه شنبه 28 بهمن 1393, 12:20 عصر
راستش من برای نرم افزارهای خودم با بررسی کانکشن این تست رو انجام میدم و بعد با بررسی وجود دیتابیسم که اگر نبود بسازمش
فوقش 5 ثانیه معطل میشی...

ولی چون شما راه دیگه ای رو میخوای دوستان جوابهای متفاوتی میدن