PDA

View Full Version : این کوئری را چطور بنویسم ؟



c_doost
پنج شنبه 10 فروردین 1391, 14:00 عصر
سلام
در پروژه ای یک کومبو دارم که در آن اطلاعات را از دیتابیس میگیرم و به ان بایند میکنم این کومبو مربوط به رشته هنری است که هر وقت کاربر روی هر یک از آیتم های موجود در کومبو انتخاب میکند شناسه هنری
ان بدست می آید
شناسه هنری به همراه 2 فیلد دیگر را میخوام در جدول جدیدی درج کنم ولی قبلش میخوام چک کنم که این اطلاعات که الان میخوام درج کنم از قبل در دیتابیس موجود نباشد
دو فیلد دیگر به نام های تخصص هنری و شناسه تخصصی هستند
تخصص هنری یک کد هست مثلا 01 یا 02 .... که تعدادش معلوم نیست
شناسه تخصصی عنوان تخصص هنرمند هست مثلا نویسنده ادبیات داستانی که میشود شناسه تخصصی


توصیح این قسمت کمی برام سخته امیدوارم درست منظورمو برسانم

رشته های هنری ما دقیق معلوم نیست چند تاست ولی یک دو تا مثال میزنم مطلب روشن بشه

رشته هنری :
شعر و ادب
شناسه :
11
تخصص هنری :
01
02
03

شناسه تخصصی :
نویسنده ادبیات داستانی
نویسنده طنز
سارینده شعر


------------------------------------------------------------
حالا رشته هنری جدید
رشته هنری :
سرود و موسیقی
شناسه :
22
تخصص هنری :
01
02
03
04
شناسه تخصصی :
سازنده نت
نوازنده
سرود حماسی
خواننده


و به همین روال باید رشته هنری ، شناسه ، تخصص هنری ، شناسه تخصصی باید تعریف کنیم

حالا قبل از درج در دیتابیس باید چک کنیم اطلاعات تکراری درج نشه

در اینجا شناسه تخصصی نباید اصلا تکراری درج بشه

تخصص هنری میتونه تکرراری باشه ولی برای هر شناسه منحصر بفرد هست
مثلا
رشته هنری | شناسه | تخصص هنری | شناسه تخصصی
شعر و ادب | 11 | 01 | نویسنده ادبیات داستانی
شعر و ادب | 11 | 02 |نویسنده طنز

شعر و ادب | 11 | 01 | نویسنده ادبیات داستانی

حالا اگر بخوایم این سطر آخری که قرمز نوشتم را در دیتابیس درج کنیم اشتباهه به دو دلیل :
1- رشته هنری ، شعر و ادب هست شناسه آن هم 11 پس تخصص هنری آن نمیتونه 01 باشه
2-چون رشته هنری ، شعر و ادب هست شناسه آن هم 11 و شناسه تخصصی هم تکراریه پس اشتباهه

حالا برای رشته هنری جدید داریم :

رشته هنری | شناسه | تخصص هنری | شناسه تخصصی
سرود و موسیقی | 22 | 01 | سازنده نت
سرود و موسیقی | 22 | 02 | نوازنده

کاملا واضحه که در رشته هنری با کد 22 تخصص هنری 01 و 02 ...... مجاز است ولی فقط باید یک بار تکرار بشه

حالا چطوری میتونم قبل از درج در دیتابیس یک کوئری بنویسم که چک کنم اطلاعات تکراری درج نشه یک کوئری که به ذهنم رسید اینه ولی جواب نمیده




cmd = new SqlCommand("SELECT * FROM tbl_shenasetakhasosi where takhasos_honari='" + txt_takhasoshonari.Text + "' or shenase_takhasosi='" + txt_shenase.Text + "'", con);

با تشکر

masoudmok
پنج شنبه 10 فروردین 1391, 16:34 عصر
سلام .
با توجه به چیزایی که گفتی کلید تو جدولت ترکیبی از دو شناسس . و اگه بخوای تحلیل ریز تری داشته باشی 2 تا رابطه ی یک به یک داری . بگذریم
احتمالا با این روش جواب بگیری
اول چک کنی ببینی سرود و موسیقی شناسش چیه . اگه با شناسه ای که می خوای درج کنی برابره بری مرحله بعد .
دوما چک کنی که نوازنده با سرود و موسیقی و شناسه سرود و موسیقی ثبت شده . اگه نشده مرحله بعد .
ثالثا چک کنی شناسه ی نوازنده با سرود و موسیقی و شناسش ثبت شده . اگه نشده میتونی تو جدولت درج کنی .
البته مرحله 2 و 3 رو میتونی با یه select بنویسی و اگه حاصل null بود مطمئن باشی میتونی درج کنی

Mahmoud.Afrad
پنج شنبه 10 فروردین 1391, 17:00 عصر
میتونید تعداد رو چک کنید اگر صفر بود درج نشده اگه غیرصفر بود قبلا درج شده


int k;
private void button2_Click(object sender, EventArgs e)
{
com.CommandText = "select count(*) FROM tbl_shenasetakhasosi where takhasos_honari=N'" + txt_takhasoshonari.Text + "' or shenase_takhasosi=N'" + txt_shenase.Text + "'";
k = (int)com.ExecuteScalar();

if (k != 0)
{
MessageBox.Show("اطلاعات تکراریست");
}
else
{
//دستورات درج در پایگاه داده
}
}

c_doost
پنج شنبه 10 فروردین 1391, 17:11 عصر
میتونید تعداد رو چک کنید اگر صفر بود درج نشده اگه غیرصفر بود قبلا درج شده


int k;
private void button2_Click(object sender, EventArgs e)
{
com.CommandText = "select count(*) FROM tbl_shenasetakhasosi where takhasos_honari=N'" + txt_takhasoshonari.Text + "' or shenase_takhasosi=N'" + txt_shenase.Text + "'";
k = (int)com.ExecuteScalar();

if (k != 0)
{
MessageBox.Show("اطلاعات تکراریست");
}
else
{
//دستورات درج در پایگاه داده
}
}



منظور از تعداد چیه ؟ میشه تویح نوشتاری هم بدی بفهمم چی به چیه

Mahmoud.Afrad
پنج شنبه 10 فروردین 1391, 18:40 عصر
select count(*)
برای بدست آوردن تعداد سطرهای مورد نظر از جدوله. کافیه فیلدهایی که باید چک بشند رو در قسمت where دستور select بنویسید.
ExecuteScalar() هم این دستور اس کیو ال رو اجرا میکنه با این تفاوت که یک مقدار بازگشتی از نوع عدد داره نه جدول.
کافیه این مقدار رو به int تبدیل کرده و چک بشه. اگه تعداد صفر بود یعنی چنین سطری با مشخصات درج شده در where وجود ندارد و میتونید درج کنید. اگر هم غیرصفر باشه یعنی سطر یا سطرهایی با این مشخصات قبلا در دیتابیس ذخیره شده.

c_doost
جمعه 11 فروردین 1391, 11:07 صبح
select count(*)
برای بدست آوردن تعداد سطرهای مورد نظر از جدوله. کافیه فیلدهایی که باید چک بشند رو در قسمت where دستور select بنویسید.
ExecuteScalar() هم این دستور اس کیو ال رو اجرا میکنه با این تفاوت که یک مقدار بازگشتی از نوع عدد داره نه جدول.
کافیه این مقدار رو به int تبدیل کرده و چک بشه. اگه تعداد صفر بود یعنی چنین سطری با مشخصات درج شده در where وجود ندارد و میتونید درج کنید. اگر هم غیرصفر باشه یعنی سطر یا سطرهایی با این مشخصات قبلا در دیتابیس ذخیره شده.


من نفهمیدم چرا باید تعداد سطرها را بدست بیارم لطفا توضیح بدید

Mahmoud.Afrad
جمعه 11 فروردین 1391, 15:52 عصر
من نفهمیدم چرا باید تعداد سطرها را بدست بیارم لطفا توضیح بدید

فرض کنید یه جدول روی کاغذ دارید. برای درج در جدول ، برای اینکه بخواید بفهمید سطری با این مشخصات کلیدی قبلا وارد جدول شده یا نه چه کار میکنید؟ خوب میایید توی جدول نگاه میکیند سطری با این مشخصات وجود داره یا نه؟ اگر سطری با این مشخصات در جدول نبود تعداد صفر است(k=0) یعنی اطلاعات جدید است و میتوانید آنرا وارد جدول کنید، و اگر سطری با این مشخصات در جدول بود پس تعداد سطرهایی با این مشخصات غیر صفر است(k!=0) یعنی اطلاعاتی که میخواهید درج کنید تکراری است.
حالا همین کار توی این کدها انجام شده دیگه.

راه دیگه اینه که از همون دستور سلکت خودتون استفاده کنید و نتایج رو در یه دیتاتیبل ذخیره کنید و سطرهای اونو بشمارید. اگر صفر بود درج کنید و اگر غیرصفر بود درج نکنید. البته این کار نسبت به روش اولی سربار حافظه و پردازش بیشتری داره.