PDA

View Full Version : پیدا کردن نام سرور های SQL و دیتابیس های موجود در سرور



arash.gh
چهارشنبه 14 اردیبهشت 1390, 01:11 صبح
دوستان ضمن عرض سلام
کمکی در مورد پیدا کردن نام سرور های sql بر روی یک سیستم رو یک برنامه به ما نشون بده

می خوام توی یک لیست باکسلیست سرور های SQL server رو نشون بده بعد اگه امکانش باشه لیست دیتا بیس های روی سرور انتخاب شده هم توی یک لیست باکس دیگه نشون داده بشه.

اما این برنامه رو می خوام چیکار : وقتی یه برنامه می نویسیم که با بانک اطلاعاتی کار می کنه معمولا ConnectionString رو توی یک کلاس تعریف می کنیم دیگه ثابته اسم سرور اگه رو یه سیستم دیگه ببریم شاید اسم سرور فرق کنه ابته من این موضوع رو از حالت ایستا خارج کردم ، ConnectionString برنامه رو از روی یک فایل متنی که در مسیر برنامه وججود داره می خونه اینو انجام دادم جواب داده مشکلی نسیت اما احساس می کنم این روش خیلی قدیمیه دوستان اگه می تونید و این کار رو انجام دادید که مستقم دیتابیس رو انتخاب کنیم تو برنامه به فرض یک فرم دیگه برای تنضیمات پایگاه داده درست کنیم این امکانات رو داشته باشه راهنمایی کنین کمک خیلی بزرگی کردین .

با تشکر.

Death_2008
چهارشنبه 14 اردیبهشت 1390, 06:16 صبح
سلام دوست عزيز
براي لیست سرور های SQL server مي توانيد از كد زير استفاده كرد كه ليست را از رجيستري دريافت مي كند (البته using Microsoft.win32 يادت نره)

RegistryKey reg = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\Microsoft SQL Server\Instance Names\SQL", false);
foreach (string s in reg.GetValueNames())
{
if (s == "MSSQLSERVER")
{
comboBox_listDB.Items.Add(System.Net.Dns.GetHostNa me());
}
else
{
comboBox_listDB.Items.Add(@".\" + s);
}
}

و براي بدست آوردن ديتابيس هاي موجود در سرور هم از پروسيجر sp_databases در ديتابيس master استفاده كنيد . مانند كد زير :


SqlConnection con = new SqlConnection(@"Data Source=" + txt_ConStr.Text + ";Initial Catalog=master;Integrated Security=True");
SqlCommand cmd = new SqlCommand();
con.Open();
cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sp_databases";

SqlDataReader dr = cmd.ExecuteReader();

while (dr.Read())
{
listBox_DBList.Items.Add(dr.GetString(0));
}

موفق باشيد

FastCode
چهارشنبه 14 اردیبهشت 1390, 07:59 صبح
برای به دست آوردن لیست دیتابیس های لوکال و شبکه داخلی هم میتونید ازSystem.Data.Sql.SqlDataSourceEnumerator.Instan ce.GetDataSources استفاده کنید.

arta.nasiri
چهارشنبه 14 اردیبهشت 1390, 10:47 صبح
سلام

کد زیر نام کلیه سرورهای موجود در شبکه محلی رو براتون میاره
این کد ها رو تو یک کلاس به اسم Servers کپی کنید.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management;
public class Servers
{
public static ServerInstance[] EnumerateServers()
{
return EnumerateServers("");
}

public static ServerInstance[] EnumerateServers(string computerName)
{
DataTable tableServers = null;
if (computerName.Length == 0) {
tableServers = Smo.SmoApplication.EnumAvailableSqlServers;
} else {
tableServers = SmoApplication.EnumAvailableSqlServers(computerNam e);
}
ServerInstance[] list = new ServerInstance[tableServers.Rows.Count];
for (int index = 0; index <= tableServers.Rows.Count - 1; index++) {
DataRow row = tableServers.Rows[index];
string name = row["Name"].ToString();
string server = row["Server"].ToString();
string instance = row["Instance"].ToString();
bool clustered = row["IsClustered"].ToString();
bool local = row["IsLocal"].ToString();
ServerInstance entry = new ServerInstance(name, server, instance, clustered, local);
list[index] = entry;
}
return list;
}
public class ServerInstance
{
public ServerInstance(string name, string server, string instance, bool clustered, bool local)
{
m_name = name;
m_server = server;
m_instance = instance;
m_clustered = clustered;
m_local = local;
}
private string m_name = "";
public string Name {
get { return m_name; }
set { m_name = value; }
}
private string m_server = "";
public string Server {
get { return m_server; }
set { m_server = value; }
}
private string m_instance = "";
public string Instance {
get { return m_instance; }
set { m_instance = value; }
}
private bool m_clustered;
public bool IsClustered {
get { return m_clustered; }
set { m_clustered = value; }
}
private bool m_local;
public bool IsLocal {
get { return m_local; }
set { m_local = value; }
}
}
}

بعدش میتونی با کد زیر combo box رو پر کنی.( نام combo box رو cmbServers گذاشتم )

Servers.ServerInstance[] s = null;
s = Servers.EnumerateServers();
cmbServers.Items.Clear();
for (i = 0; i <= s.Length - 1; i++) {
cmbServers.Items.Add(s[i].Name);
}

tara12514
چهارشنبه 14 اردیبهشت 1390, 11:48 صبح
سلام،من این کدرو نوشتم ولی اجرا نشدحالا چی کار کنم

arta.nasiri
چهارشنبه 14 اردیبهشت 1390, 12:41 عصر
از منوی Solution Explorer رو پروژه راست کلیک کنید و گزینه Add Reference... رو بزنید. سپس dll های مربوط به smo را اضافه کنید.

اگه Sql Server رو سیستم نصب باشه این dll ها رو اضافه کنید.

"C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies\Microsoft.SqlServer.Conne ctionInfo.dll",
"C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies\Microsoft.SqlServer.Smo.d ll",
"C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies\Microsoft.SqlServer.SmoEn um.dll",
"C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies\Microsoft.SqlServer.SqlEn um.dll"

arash.gh
پنج شنبه 15 اردیبهشت 1390, 01:14 صبح
دویت عزیز grlearn (http://barnamenevis.org/member.php?52028-grlearn)

بنده هم این کارو انجام دادم dll هایی رو هم که فرمودید اضافه کردم اما برنامه شما خطا داره شما خودتون اجرا کردید ؟ نتیجه گرفتید اگه امکانش هست پروژه رو پیوست کنید.
ممنون از راهنمایی تون

mehr_computer
پنج شنبه 15 اردیبهشت 1390, 10:32 صبح
من به نتیجه نرسیدم میشه لطف کنید بیشتر راهنمایی کنین ممنون میشم.کارم بد جور گیره

FastCode
پنج شنبه 15 اردیبهشت 1390, 11:11 صبح
namespace Test
{
class MainClass
{
public static void Main ()
{
System.Data.DataTable DT = System.Data.Sql.SqlDataSourceEnumerator.Instance.G etDataSources();
int i = 0;
foreach(System.Data.DataRow DR in DT.Rows)
System.Console.WriteLine("Server[{0}]:{1}\t{2}\t{3}\t{4}",(++i).ToString(), DR[0],DR[1],DR[2],DR[3]);
}
}
}
از این ساده تر دیگه نمیشه.

Mojtaba.Kh
پنج شنبه 15 اردیبهشت 1390, 11:22 صبح
اگه سرور لوکاله چرا از .(نقطه)استفاده نمیکنید؟
برا لیست دیتابیس ها هم بهترین راه استفاده از پروسیجر خود اسکیوال هست

tara12514
یک شنبه 18 اردیبهشت 1390, 08:22 صبح
با سلام ،منdllمورد نظر رو تو کدوم سربرگ اضافه کنم،واقعا نیاز به کمک دارم تمام کارم لنگه هرچی این کدها رو اجرا کیکنم جواب نمیده:گریه:

mahboube
دوشنبه 06 تیر 1390, 12:50 عصر
سلام
دوستان اگر روي سيستمم sql نصب نباشه چطوري ميتونه اسم سرورهاي sql بقيه كامپيوتر هاي شبكه رو بگيرم؟؟

magic69
یک شنبه 28 آبان 1391, 01:35 صبح
برای گرفتن لیست سرورها میتونین ازین کد استفاده کنید :

string myServer = Environment.MachineName;


DataTable servers = SqlDataSourceEnumerator.Instance.GetDataSources();
for (int i = 0;i < servers.Rows.Count;i++)
{
if (myServer == servers.Rows[i]["ServerName"].ToString())////
{
if (( servers.Rows[i]["InstanceName"] as string ) != null)
comboBox_listDB.Items.Add( servers.Rows[i]["ServerName"] + "\\" + servers.Rows[i]["InstanceName"] );//برای واردکردن لیست سرورها در کمبوباکس
else
comboBox_listDB.Items.Add( servers.Rows[i]["ServerName"] );
}
}