PDA

View Full Version : سوال: مشکل در join دوتا جدول



behruz1212
یک شنبه 11 فروردین 1392, 11:37 صبح
سلام دوستام من دوتا جدول دارم یکی درس(course) و ارائه(peresent) حالا میخوام join بین دوتا جدول برقرا کنم و بعضی فیلدا رو در گرید نشون بده ولی این ارور رو میده میشه کمکم کنین ممنون

string s = "select course.coname,course.coid,present.year,present.ter m from course inner join present on present.coid=course.coid where present.stid=" + txtid.Text + " and present.term='" + txtterm.Text + "' and present.year='" + txtsal.Text + "'";

DataTable dt = k.select(s, "present").Tables[0];
if (dt.Rows.Count == 0)
{
MessageBox.Show("اين دانشجو در اين ترم هيچ درسي انتخاب نكرده است ");
}
else
{
dataGridView1.DataSource = dt;
}

بعد این ارور رو میده No value given for one or more required parameters.

veniz2008
یک شنبه 11 فروردین 1392, 12:18 عصر
سلام.
سبک کوئری نوشتن شما سال هاست که منسوخ شده است(مشکلات امنیتی) و الان در ado از پارامترها استفاده میکنن.
زمانی تک کوتیشن میزارن که بخوای یه فیلد رشته ای رو بفرستی ولی به نظر نمیاد که شماره ترم و سال مقادیری رشته ای باشن که نیاز به تک کوتیشن داشته باشند.
موفق باشید.

behruz1212
یک شنبه 11 فروردین 1392, 12:20 عصر
سلام.
سبک کوئری نوشتن شما سال هاست که منسوخ شده است(مشکلات امنیتی) و الان در ado از پارامترها استفاده میکنن.
زمانی تک کوتیشن میزارن که بخوای یه فیلد رشته ای رو بفرستی ولی به نظر نمیاد که شماره ترم و سال مقادیری رشته ای باشن که نیاز به تک کوتیشن داشته باشند.
موفق باشید.
من فیلد سال و ترم رو از نوع text گرفتم مشکل از اون نیست...لطفا بیشتر راهنماییم کنین:افسرده:

veniz2008
یک شنبه 11 فروردین 1392, 12:37 عصر
بگذریم از اینکه چرا ترم و سال رو رشته در نظر گرفتی. ظاهرا بعضی مقادیر رو به متد Select پاس ندادید که باید چک کنید که همه مقادیر رو بهش تحویل بدید ولی من خودم همیشه در ado بصورت زیر کدنویسی میکنم:

SqlConnection con = new SqlConnection("server = .\\md2008;database = Test1;Integrated Security = True");
SqlDataAdapter da = new SqlDataAdapter("select course.coname,course.coid,present.year,present.ter m from course inner join present on present.coid=course.coid where present.stid= @stid and present.term= @term and present.year= @year", con);
da.SelectCommand.Parameters.AddWithValue("@stid", txtid.Text.Trim());
da.SelectCommand.Parameters.AddWithValue("@term", txtterm.Text.Trim());
da.SelectCommand.Parameters.AddWithValue("@year", txtsal.Text.Trim());
DataTable dt = new DataTable();
da.Fill(dt);
if (dt.Rows.Count == 0)
{
MessageBox.Show("اين دانشجو در اين ترم هيچ درسي انتخاب نكرده است ");
}
else
{
dataGridView1.DataSource = dt;
}

ali_habibi1384
یک شنبه 11 فروردین 1392, 12:40 عصر
خب شايد نوع Coid ها در دو جدول يكسان نيست. شما بدون پارامترهاي Where خود كوئري رو تست كن تا متوجه بشي مشكل از Join هست يا شرط Where

hessam2003
یک شنبه 11 فروردین 1392, 12:54 عصر
سلام.
راه اسون تری هم برای join کردن است.
شما یک select درون یک stored procedure بنویسید به این شکل که کار join را هم انجام میده.
102140

FastCode
یک شنبه 11 فروردین 1392, 13:16 عصر
فقط پاسخ های veniz2008 درست هستن.بقیه هیچ ربطی به سوال شما نداره.

paieez
سه شنبه 20 فروردین 1392, 12:05 عصر
سلام لطفا یکی این 2 تا جدول رو توضیح بده . ممنون میشم

http://www.8pic.ir/images/21479809383174215388.jpg

http://www.8pic.ir/images/86182305126538186236.jpg

veniz2008
سه شنبه 20 فروردین 1392, 12:32 عصر
عکس اول یک cross join رو نشون میده که بدون در نظر گرفتن فیلد مشترک میاد و تمامی سطرهای جدول1 رو در جدول2 ضرب میکنه (یعنی هر رکورد از جدول1 در تمامی رکوردهای جدول2 ضرب میشه) و دومی هم که فقط رکوردهایی رو نشون میده که فیلد مشترک دارند یعنی یک inner join هست.

paieez
سه شنبه 20 فروردین 1392, 12:43 عصر
عکس اول یک cross join رو نشون میده که بدون در نظر گرفتن فیلد مشترک میاد و تمامی سطرهای جدول1 رو در جدول2 ضرب میکنه (یعنی هر رکورد از جدول1 در تمامی رکوردهای جدول2 ضرب میشه) و دومی هم که فقط رکوردهایی رو نشون میده که فیلد مشترک دارند یعنی یک inner join هست.

چگونگی تشکیل جدول های حاصل رو بیشتر توضیح میدید ؟ ممنونم
اینم یکیشه
http://www.8pic.ir/images/65999220101158928254.jpg

veniz2008
سه شنبه 20 فروردین 1392, 13:26 عصر
ببینید r*s اینو میگه :
ما در join دنبال فیلد مشترک بین دو جدول میگردیم (اغلب کلید اصلی یک جدول که میشه کلید خارجی جدول دیگه چنین خصوصیتی رو داره).
حالا در این جداول join بر روی فیلد part که بین دو جدول یکسان هست در نظر گرفته شده. در جدول r مقدار 1 در سطر اول با مقدار فیلد part در جدول s مقایسه میشه که آیا با هم برابرند یا نه. اگر برابر بود سطر جدول r با سطر متناظر در جدول s با هم join (متصل) میشن. در مرحله دوم دوباره مقدار 1 (مربوط به سطر دوم) جدول r با مقادیر فیلد part از جدول s مقایسه میشه که در صورت برابری با سطر متناظر join میشه. و در مرحله آخر هم مقدار 2 (سطر سوم) در جدول r با مقادیر فیلد part در جدول s مقایسه و در صورت برابری باهم join میشن.
اما در cross join فیلد مشترک معنا نداره و هر سطر از جدول r حتما با تمام سطرهای جدول s با هم join میشن. (تعداد رکوردهای حاصل میشه r * s ).

paieez
سه شنبه 20 فروردین 1392, 14:32 عصر
بسیار سپاسگذارم