خیلی ممنون از جوابهای دوستان عزیز همچنین تشکر مخصوص از samaneh_aftab متاسفانه من نمیدونم sp دقیقا چی هست و در این مواقع چه طوری استفاده میشه اما به جواب خودم رسیدم
برای بدست آوردن نام سرورهای sql یا به عبارت بهتر لیست کردن سرورهای sql در یک کامبوباکس میتونیم از این کوئری استفاده کنیم:
کد:
Declare @servers TABLE(sname VARCHAR(255))
INSERT @servers EXEC master..XP_CMDShell 'OSQL -L'
DELETE @servers WHERE sname='Servers:' or sname is null
SELECT LTRIM(sname) FROM @servers
اما خب اینکه این کوئری رو چه طوری به زبان c# بنویسیم هم به این صورت هست:
کد:
private void identity_server()
{
SqlConnection con = new SqlConnection("Data Source=LocalHost;Initial Catalog=master;Integrated Security=True");
SqlCommand com = new SqlCommand();
com.Connection = con;
com.CommandText = "Declare @servers TABLE(sname VARCHAR(255)) " +
"INSERT @servers EXEC master..XP_CMDShell 'OSQL -L' " +
"DELETE @servers WHERE sname='Servers:' or sname is null " +
"SELECT LTRIM(sname) as sname FROM @servers";
SqlDataAdapter da = new SqlDataAdapter(com);
con.Open();
int i = com.ExecuteNonQuery();
DataSet dt = new DataSet();
da.Fill(dt);
cmbserver.DataSource = dt.Tables[0];
cmbserver.DisplayMember = "sname";
cmbserver.ValueMember = "sname";
con.Close();
if (cmbserver.Text == "-- NONE --")
{
cmbserver.DataSource = null;
cmbserver.Items.Add("(local)");
cmbserver.SelectedIndex = 0;
}
}
کسایی که تازه دارن یه همچین چیزی میبینن میخواستم بهشون بگم هنگ نکنند
کدش خیلی راحته الان براشون توضیح میدم:
این یک تابع هست که نه ورودی داره نه خروجی توی این تابع ما فقط یه چیزی رو نشون میدیم
خط اول: یه کانکشن از نوع sql میسازیم و از طریق سرور محلی یعنی سیستم خودمون بهش وصل میشیم که همون عبارت LocalHost میشه و به بانک اطلاعاتی master وصل میشیم
خط دوم: یه متغییر از نوع sqlcommand درست میکنیم که توش دستورات رو بنویسیم.
خط سوم: connection رو به command اختصاص میدیم.
خط چهارم: متن همون کوئری رو که اون بالا نوشتیم به command اختصاص میدیم. فاصله گذاشتم که دستورات با یه چوب رونده نشوند یعنی قاطی نشوند. و این خیلی مهمه باید حتما باشه چون ما اینجا مثل خود sql اینتر نمیتونیم داشته باشیم.
خط پنجم: یک DataAdapter درست میکنیم که این برنامه ها روی بانک اطلاعاتی اجرا کنه و دستورات و کانکشن رو که در com ریختیم بهش اختصاص میدیم. یعنی DataAdapter با استفاده از دستورات یا همون کوئری که داخل com ریختیم اطلاعات رو از بانک اطلاعاتی بازیابی می کند.
خط ششم: کانکشن رو باز میکنه.
خط هفتم: دستورات یا همون کوئری رو اجرا میکنه.
خط هشتم: یک DataSet میسازیم تا حاصل کارمون رو که در خط بعد اجرا کردیم و خروجی رو در اون بریزیم. که البته میشه به جای اون یک DataTable بسازیم. چندان تفاوتی در کد ما نمیکنه.
خط نهم: DataAdapter که اطلاعات رو بازیابی کرده توی DataSet میریزه و اونو پر میکنه. یعنی از این به بعد خروجی کار ما توی DataSet هست.
خط دهم: درواقع در این خط به منبع داده ای کامبوباکس، اولین جدول از DataSet رو اختصاص میدیم و بهش میگیم که داده های مورد نظر ما توی این جدول هستند.
خط یازدهم: نام اون ستون یا فیلدی که باید در کامبوباکس نمایش پیدا کند را به کامبوباکس اختصاص میدهیم.
خط دوازدهم: اون فیلدی که درواقع باهاش کارمیکنیم رو مینویسیم میشه گفت یه جور فیلد پس زمینه هستش. که میتونه یه چیز دیگه ای باشه اما ما اینجا چون همین یه فیلد رو داریم همینو مینویسیم. البته توی اینجا اگر ننوشتید هم اشکالی نداره.
خط سیزدهم: کانکشن رو میبندیم.
خط چهاردهم: چو که اگر مقدار -- NONE -- رو نشون بده ما بعدا با مشکل برخورد میکنیم و همچنین وقتی که ما به هیچ شبکه ای وصل نیستیم این رو نشون میده با وجود اینکه ما لوکال خالی هستیم (یعنی ما لوکال هستیم اما این هیچی نشون نمیده! اما فقط کافیه به اینترنت وصل بشید اونوقت هم لوکال مینویسه هم نام سیستم خودتون رو، حداقل مال من که اینطوری بوده). چون همه این اتفاقا میافته ما گفتیم اگر نشون داد -- NONE -- :
خط پانزدهم: اول اینکه به هیچ منبع داده ای دیگه وصل نباشه! چون اگر همچنان به منبع داده وصل باشه ما نمیتونیم به کامبوباکس گزینه ای اضافه کنیم. پس اتصالمون رو قطع میکنیم.
خط شانزدهم: حالا که کامبوباکس خالی شده یه گزینه ی (local) بهش اضافه کنه تا در اتصال به کامپیوتر محلی (خودمان) وقتی به شبکه ای وصل نیستیم مشکل پیش نیاد.
خط هفدهم: همان گزینه ای که اضافه کردیم را نمایش میدهیم.
امید وارم که کسایی که مثل من هیچی نمیدونستند فهمیده باشند
و همچنین از اساتید بزرگوار که فکر میکنند که توضیح واضحات دادم هم معذرت میخوام