PDA

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



programmer.z
چهارشنبه 18 مرداد 1391, 15:08 عصر
سلام
من دارم یه برنامه می نویسم با sql که نیاز داره سرورهای sql را توی یه combobox نمایش بده.
برای این کار یه کوئری بهم دادند و گفتند که اول توی sql امتحان کنم بعد در C#‎ به عنوان یه کوئری ازش استفاده کنم و خطوطش رو از هم جدا نکنم
اما من نمی دونم چه طوری توی C#‎ اینو بنویسم. شاید خیلی راحت باشه اما من خیلی کم با بانک های اطلاعاتی کار کردم و نمی دونم چه کار باید بکنم
ممنون میشم بهم بگید که چه طوری باید ازش استفاده کنم و کدش رو هم برام واضع بنویسید یعنی حتی کانکشن استرینگشم بگید چی باید بنویسم ایا لوکال باشه آیا دیسابیسش باید مستر باشه ایا اصلا احتیاجی به کانکشن استرینگ هست و یه کم هم توضیح بدید

اینم کدش
-- To allow advanced options to be changed.EXEC sp_configure'show advanced options', 1
GO
-- To update the currently configured value for advanced options.
RECONFIGURE
GO
-- To enable the feature.
EXEC sp_configure'xp_cmdshell', 1
GO
-- To update the currently configured value for this feature.
RECONFIGURE
GO
--Create Varible Of Table
Declare @servers TABLE(sname VARCHAR(255))
--Insert Result To Table
INSERT @servers EXEC master..XP_CMDShell'OSQL -L'
--Delete From Table
DELETE @servers WHERE sname='Servers:' or sname is null
--Show Result


SELECT LTRIM(sname) FROM @servers

programmer.z
پنج شنبه 02 شهریور 1391, 03:11 صبح
بعضی از دوستان در جاهای دیگه گفتند که برای اجرای این کوئری باید از روش sp یا همون stored procedure استفاده کرد اما ن نمیدونم 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();
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) بهش اضافه کنه تا در اتصال به کامپیوتر محلی (خودمان) وقتی به شبکه ای وصل نیستیم مشکل پیش نیاد.

خط هفدهم: همان گزینه ای که اضافه کردیم را نمایش میدهیم.

امید وارم که کسایی که مثل من هیچی نمیدونستند فهمیده باشند:لبخند:
و همچنین از اساتید بزرگوار که فکر میکنند که توضیح واضحات دادم هم معذرت میخوام :خجالت: