PDA

View Full Version : حرفه ای: تشخیص نصب بودن SQL در سیستم و نوع آن



Pedram_Parsian
جمعه 07 شهریور 1393, 20:30 عصر
با سلام ....


می خواستم ببینم چه جوری میشه تشخیص داد که SQL روی سیستم نصب هست یا نه و اگه نصب هست نوع اون چیه ؟ یعنی Express هست یا ...

در ضمن من می خوام این ها رو هر دفعه در صفحه Splash چک کنم :لبخند:

Pedram_Parsian
شنبه 08 شهریور 1393, 08:58 صبح
دوستان لطفا راهمایی کنید

rezaei_y
شنبه 08 شهریور 1393, 11:04 صبح
using Microsoft.Win32;
RegistryView registryView = Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32;
using (RegistryKey hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView))
{
RegistryKey instanceKey = hklm.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL", false);
if (instanceKey != null)
{
foreach (var instanceName in instanceKey.GetValueNames())
{
Console.WriteLine(Environment.MachineName + @"\" + instanceName);
}
}
}

veniz2008
شنبه 08 شهریور 1393, 11:28 صبح
با سلام ....


می خواستم ببینم چه جوری میشه تشخیص داد که SQL روی سیستم نصب هست یا نه و اگه نصب هست نوع اون چیه ؟ یعنی Express هست یا ...
ُسلام.
چندین راه برای این کارها وجود داره که در ادامه یکی از این راه ها رو براتون توضیح میدم.
برای تشخیص اینکه ایا SQL نصب هست و اطلاعاتی مثل ُServer Name و Instance Name رو بدست بیارید، می تونید از کد زیر استفاده کنید (توجه داشته باشید از همین کدها می تونید برای ساخت کانکشن استرینگ هم استفاده کنید) :
ابتدا فضای نام using System.Data.Sql; رو به بالای فرمتون اضافه کنید. حالا کدهای زیر رو در فرم لود یا سازنده یا هر جایی که مایل هستید قرار بدید :

SqlDataSourceEnumerator sqlenum = SqlDataSourceEnumerator.Instance;
DataTable dt = sqlenum.GetDataSources();
if (dt.Rows.Count > 0)
{
foreach (DataRow row in dt.Rows)
{
MessageBox.Show(string.Format("Server Name : {0}, Instance Name : {1}, Is Clustered : {2}, Version : {3}", row["ServerName"], row["Instancename"], row["IsClustered"], row["Version"]));
}
}
else
{
MessageBox.Show("نسخه ای از اس کیو ال روی این سیستم نصب نیست");
}
از روی بخش version می تونید نسخه sql رو تشخیص بدید (اینکه مثلا sql 2008 نصبه یا مثلا sql 2012 و ... . مثلا اگر عدد 10 بهتون بده میشه sql 2008 یا اگر عدد 11 بده میشه sql 2012 و ...).
برای بدست آوردن Edition (اینکه Express هست یا Standard یا Enterprise یا Developer ) می تونید از کوئری زیر استفاده کنید (علاوه بر تعیین نوع Edition براتون 32 یا 64 بیتی بودنش رو هم مشخص میکنه). توجه کنید این کد رو باید در ادامه کدهای قبلی قرار بدید یعنی زمانیکه مطمئن هستیم که SQL نصب هست. اینم مد نظر داشته باشید که در کانکشن استرینگ از دیتابیس master استفاده کردم که از دیتابیس های پیش فرض مایکروسافت هست و همراه خود sql روی سیستم مشتری نصب میشه.

SqlConnection con = new SqlConnection("server = .\\md2012;database = master;integrated security = true");
SqlDataAdapter da = new SqlDataAdapter("select serverproperty('edition') AS SQLEdition", con);
DataTable dt = new DataTable();
da.Fill(dt);
if (dt.Rows.Count > 0)
{
foreach (DataRow row in dt.Rows)
{
MessageBox.Show(string.Format("SQL Edition : {0}",row["SQLEdition"]));
}
}
توصیه کلی هم که می تونم براتون داشته باشم اینه که این کدها رو حتما داخل بلاک try و catch قرار بدید که اگر جایی مثل همین کانکشن استرینگ درست از آب در نیومد، سیستم با خطا مواجه نشه.
موفق باشید.

Pedram_Parsian
شنبه 08 شهریور 1393, 11:37 صبح
ُسلام.
چندین راه برای این کارها وجود داره که در ادامه یکی از این راه ها رو براتون توضیح میدم.
برای تشخیص اینکه ایا SQL نصب هست و اطلاعاتی مثل ُServer Name و Instance Name رو بدست بیارید، می تونید از کد زیر استفاده کنید (توجه داشته باشید از همین کدها می تونید برای ساخت کانکشن استرینگ هم استفاده کنید) :
ابتدا فضای نام using System.Data.Sql; رو به بالای فرمتون اضافه کنید. حالا کدهای زیر رو در فرم لود یا سازنده یا هر جایی که مایل هستید قرار بدید :

SqlDataSourceEnumerator sqlenum = SqlDataSourceEnumerator.Instance;
DataTable dt = sqlenum.GetDataSources();
if (dt.Rows.Count > 0)
{
foreach (DataRow row in dt.Rows)
{
MessageBox.Show(string.Format("Server Name : {0}, Instance Name : {1}, Is Clustered : {2}, Version : {3}", row["ServerName"], row["Instancename"], row["IsClustered"], row["Version"]));
}
}
else
{
MessageBox.Show("نسخه ای از اس کیو ال روی این سیستم نصب نیست");
}
از روی بخش version می تونید نسخه sql رو تشخیص بدید (اینکه مثلا sql 2008 نصبه یا مثلا sql 2012 و ... . مثلا اگر عدد 10 بهتون بده میشه sql 2008 یا اگر عدد 11 بده میشه sql 2012 و ...).
برای بدست آوردن Edition (اینکه Express هست یا Standard یا Enterprise یا Developer ) می تونید از کوئری زیر استفاده کنید (علاوه بر تعیین نوع Edition براتون 32 یا 64 بیتی بودنش رو هم مشخص میکنه). توجه کنید این کد رو باید در ادامه کدهای قبلی قرار بدید یعنی زمانیکه مطمئن هستیم که SQL نصب هست. اینم مد نظر داشته باشید که در کانکشن استرینگ از دیتابیس master استفاده کردم که از دیتابیس های پیش فرض مایکروسافت هست و همراه خود sql روی سیستم مشتری نصب میشه.

SqlConnection con = new SqlConnection("server = .\\md2012;database = master;integrated security = true");
SqlDataAdapter da = new SqlDataAdapter("select serverproperty('edition') AS SQLEdition", con);
DataTable dt = new DataTable();
da.Fill(dt);
if (dt.Rows.Count > 0)
{
foreach (DataRow row in dt.Rows)
{
MessageBox.Show(string.Format("SQL Edition : {0}",row["SQLEdition"]));
}
}
توصیه کلی هم که می تونم براتون داشته باشم اینه که این کدها رو حتما داخل بلاک try و catch قرار بدید که اگر جایی مثل همین کانکشن استرینگ درست از آب در نیومد، سیستم با خطا مواجه نشه.
موفق باشید.

دوست عزیز

این قطعه کد اول رو توی نرم افزار اجرا کردم .... (البته قبلا هم تست کرده بودم ) دو تا ایراد داره :
1. خیلی طول میکشه
2. برای سیستم خود من که SQL Enterprice 2012 رو دارم میگه هیچ نسخه نصب نیست !

Pedram_Parsian
شنبه 08 شهریور 1393, 11:40 صبح
using Microsoft.Win32;
RegistryView registryView = Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32;
using (RegistryKey hklm = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView))
{
RegistryKey instanceKey = hklm.OpenSubKey(@"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL", false);
if (instanceKey != null)
{
foreach (var instanceName in instanceKey.GetValueNames())
{
Console.WriteLine(Environment.MachineName + @"\" + instanceName);
}
}
}


ممنون از پاسختون

ولی چند تا سوال در مورد این قطعه کد :
1. این کد روی همه ی ویندوز ها عمل میکنه یا نه ؟ من خودم روی 8.1 تست کردم درست بود.
2. چه جوری میشه نوع اس کیو ال رو تشخیص داد ؟ یعنی enterprice یا ....
3. چه جوری میشه ورژن اس کیو ال رو مشخص کرد ؟

با تشکر فراوان

veniz2008
شنبه 08 شهریور 1393, 12:12 عصر
دوست عزیز

این قطعه کد اول رو توی نرم افزار اجرا کردم .... (البته قبلا هم تست کرده بودم ) دو تا ایراد داره :
1. خیلی طول میکشه
2. برای سیستم خود من که SQL Enterprice 2012 رو دارم میگه هیچ نسخه نصب نیست !
واقعیت اینه که یک قطعه کد همیشه روی همه سیستم ها جواب نمیده (فقط در این مورد نیست، مثلا برای ساخت قفل نرم افزاری هم که از سریال های سخت افزار استفاده می کنیم، یک روش واحد روی همه سیستم ها جواب نمیده، مثلا نوع مادربورد و نوع سیستم عامل، 32 یا 64 بیتی بودن و ... تاثیر گذار هستن). در اینجا هم مثلا قطعه کدی که دوستمون قرار دادن روی سیستم من جواب نمیده و هیچ Instance ای رو بر نمیگردونه با وجود اینکه SQL Server 2012 Enterprise روی سیستم نصب هست ولی کدی رو که گذاشته بودم به خوبی جواب میده. همونطور که در پست اولم هم گفتم چندین راه برای این کارها وجود داره که بهترین کار اینه که حداقل دو نمونه از این کدها رو قرار بدید که البته اگر یکی از این ها جواب داد دیگه نیاز نباشه که دومی هم تست بشه. اینم در نظر داشته باشید که ممکنه کد روی سیستم شما درست جواب بده ولی روی سیستم مشتری همون کد کار نکنه. پس چند راه حل رو پیاده سازی کنید.
در مورد سرعت، حدود 3 ثانیه برای من طول میکشه تا اطلاعات رو پیدا کنه که برای بار اول در اجرای برنامه، زمان قابل قبولی هست. اینم مد نظر داشته باشید که قرار نیست همیشه این موارد چک بشه چون وقتی این موارد رو پیدا می کنیم و درون کانکشن استرینگ ست می کنیم و برنامه به درستی به بانک اطلاعاتی متصل میشه، این کانکشن استرینگ در یه جایی ذخیره میشه و برای دفعات بعدی این کانکشن استرینگ استفاده میشه و نیازی نیست دوباره چک بشه که ایا sql نصبه یا نه یا edition اون چی هست.
در مورد Edition هم کدی رو که گذاشتم باید بهتون Edition رو بده، اگر اطلاعات بیشتری هم نیاز دارید می تونید به جای کوئری قبلی (select serverproperty('edition') AS SQLEdition) از کوئری زیر استفاده کنید :

select @@version AS SQLEdition

rezaei_y
شنبه 08 شهریور 1393, 12:14 عصر
تو ای صفحه میتونی جوابتو پیدا کنی (http://msdn.microsoft.com/en-us/library/a6t1z9x2%28v=vs.110%29.aspx)

ورژن رو مستقیم بهت نمیده


9.00.x (SQL Server 2005)
10.0.xx (SQL Server 2008)
10.50.x (SQL Server 2008 R2)
11.0.xx (SQL Server 2012)