PDA

View Full Version : سوال: مشکل در یک حلقه For و دستور Insert To SQL



NasimBamdad
پنج شنبه 23 آذر 1391, 11:25 صبح
سلام و خسته نباشید .

در جدولم ( Patients ) یک ستون دارم به اسم AGE . از اسمش معلومه که یعنی سن . بیمارانی که پذیرش میشن در نرم افزار من یک سن بهشون تخصیص داده .

حالا من می خواهم با یک حلقه For لیست تمام بیماران رو داشته باشم و اگه سنشون بیشتر از مثلا 50 سال بود ، یک دستور INSERT اجرا بشه .



cmd.Connection = cnn;
cnn.Open();
cmd.CommandText = "Select COUNT(*) AS cnt From patients WHERE sex = 'مرد' AND reg_tarikh_shamsi between '" + uc1.VDate + "' AND '" + uc2.VDate + "'";
cmd.Parameters.Clear();
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
string cnt = Convert.ToString(ds.Tables[0].Rows[0]["cnt"]);
int countz = Convert.ToInt32(cnt);
cnn.Close();
////////
cmd.Connection = cnn;
cnn.Open();
cmd.CommandText = "Select id,age From patients WHERE sex = 'مرد' AND reg_tarikh_shamsi between '" + uc1.VDate + "' AND '" + uc2.VDate + "'";
cmd.Parameters.Clear();
SqlDataAdapter da22 = new SqlDataAdapter(cmd);
DataSet ds22 = new DataSet();
da22.Fill(ds22);
cnn.Close();

del_navar();

try
{
for (int j = 0; j < countz; j++)
{
PID = Convert.ToString(ds22.Tables[0].Rows[j]["id"]);
int age = Convert.ToInt32(Convert.ToString(ds22.Tables[0].Rows[j]["age"]));

if (age == 40 || age > 40)
{
cmd.Connection = cnn;
cnn.Open();
cmd.CommandText = "Insert INTO other_usage (patientid,other_id,numberz) VALUES (@patientid,@other_id,@numberz)";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@patientid", PID);
cmd.Parameters.AddWithValue("@other_id", 3);
cmd.Parameters.AddWithValue("@numberz", 1);
cmd.ExecuteNonQuery();
cnn.Close();
}
}
MessageBox.Show("اضافه شد");
}
catch
{

}


این تیکه کد من هست . اما متاسفانه درست کار نمی کنه و رکورد هایی رو هم دارم که سنشون کمتر از 50 هست ( که در تیکه برنامه بالا قید کردم ) بازم دستور INSERT براشون انجام شده

ممنون میشم کمک کنید

ordebehesht
پنج شنبه 23 آذر 1391, 12:51 عصر
بنده خوب خدا یبارکی اونایی که سنشون بالای 50 هستش رو انتخواب کن و بعد داده مورد نظر تو وارد کن نمی خواد همه رو انتخواب کنی

NasimBamdad
پنج شنبه 23 آذر 1391, 13:32 عصر
بنده خوب خدا یبارکی اونایی که سنشون بالای 50 هستش رو انتخواب کن و بعد داده مورد نظر تو وارد کن نمی خواد همه رو انتخواب کنی

نظر بسیار خوبی بود . راست میگی . اشتباه کردم . مرسی دوست عزیز


راستی آواتارت خیلی قشنگه مثل تیمش !

ordebehesht
پنج شنبه 23 آذر 1391, 13:50 عصر
مرسی اگه طرفداره یووه هستی به این سایتها یه نگاه بنداز
www.juventus.ir
www.juventusfc.ir

NasimBamdad
پنج شنبه 23 آذر 1391, 14:09 عصر
عزیز کدم رو به این حالت تغییر دادم


cmd.Connection = cnn;
cnn.Open();
cmd.CommandText = "Select COUNT(*) AS cnt From patients WHERE sex = 'مرد' AND age > 39 AND reg_tarikh_shamsi between '" + uc1.VDate + "' AND '" + uc2.VDate + "'";
cmd.Parameters.Clear();
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
string cnt = Convert.ToString(ds.Tables[0].Rows[0]["cnt"]);
int countz = Convert.ToInt32(cnt);
cnn.Close();
////////
cmd.Connection = cnn;
cnn.Open();
cmd.CommandText = "Select id,age From patients WHERE sex = 'مرد' AND age > 39 AND reg_tarikh_shamsi between '" + uc1.VDate + "' AND '" + uc2.VDate + "'";
cmd.Parameters.Clear();
SqlDataAdapter da22 = new SqlDataAdapter(cmd);
DataSet ds22 = new DataSet();
da22.Fill(ds22);
cnn.Close();

del_navar();


for (int j = 0; j < countz; j++)
{
PID = Convert.ToString(ds22.Tables[0].Rows[j]["id"]);

cmd.Connection = cnn;
cnn.Open();
cmd.CommandText = "Insert INTO other_usage (patientid,other_id,numberz) VALUES (@patientid,@other_id,@numberz)";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@patientid", PID);
cmd.Parameters.AddWithValue("@other_id", 3);
cmd.Parameters.AddWithValue("@numberz", 1);
cmd.ExecuteNonQuery();
cnn.Close();
}
MessageBox.Show("اضافه شد");



بازم الان رکوردی دارم که سنش بیشتر از 60 سال هست ، اما براش INSERT انجام نشده !!

NasimBamdad
پنج شنبه 23 آذر 1391, 14:23 عصر
ببین کدم رو کلا تغییر دادم و بهینه ترش کردم


cmd.Connection = cnn;
cnn.Open();
cmd.CommandText = "INSERT INTO other_usage(patientid,other_id,numberz) Select P.id,3,1 FROM patients P WHERE P.sex = 'زن' AND P.age >= 50";
cmd.ExecuteNonQuery();
cnn.Close();


کلا گفتم هرکی بیشتر از اون سن هست ، براش یک INSERT انجام بشه . در واقع یک کوری رو Run می کنم . اما بازم کسی رو دارم فیلد AGE برابر 60 هست ، اما براش Insert انجام نمیشه

veniz2008
پنج شنبه 23 آذر 1391, 14:42 عصر
سلام. دستوری رو که در پست 6 گذاشتی اجرا میشه؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
25 درصد از هر دستور رو نوشتی. انتظار که نداری دستور اجرا بشه؟

NasimBamdad
پنج شنبه 23 آذر 1391, 15:04 عصر
SqlConnection cnn = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);
SqlCommand cmd = new SqlCommand();
cmd.Connection = cnn;
cnn.Open();
cmd.CommandText = "INSERT INTO other_usage(patientid,other_id,numberz) Select P.id,3,1 FROM patients P WHERE P.sex = 'زن' AND P.age >= 50";
cmd.ExecuteNonQuery();
cnn.Close();




شما اینجوری فرضش کنم . !! . اون 2 خط اول رو قسمت partial تعریف کردم

veniz2008
پنج شنبه 23 آذر 1391, 15:27 عصر
من هنوز دستور insert ای که values نداره ندیدم.شما چطور مقدار درج می کنید؟

NasimBamdad
پنج شنبه 23 آذر 1391, 15:38 عصر
من هنوز دستور insert ای که values نداره ندیدم.شما چطور مقدار درج می کنید؟


عزیز دلم با Select دیگه . مقدار P.id نماینده جدول Patients و فیلد id هست . 3 و 1 هم که یک مقدار ثابت هستند .

پس باید اون رکورد هایی که در WHERE شرط شدند رو Select کنه و بریزنه توی جدول other_usage

Insert into tbl1 (field1,field2,field3) Select a, b , c From tbl3

این یک مثاله دیگه !

morteza271
پنج شنبه 23 آذر 1391, 19:05 عصر
ببین کدم رو کلا تغییر دادم و بهینه ترش کردم


cmd.Connection = cnn;
cnn.Open();
cmd.CommandText = "INSERT INTO other_usage(patientid,other_id,numberz) Select P.id,3,1 FROM patients P WHERE P.sex = 'زن' AND P.age >= 50";
cmd.ExecuteNonQuery();
cnn.Close();


کلا گفتم هرکی بیشتر از اون سن هست ، براش یک INSERT انجام بشه . در واقع یک کوری رو Run می کنم . اما بازم کسی رو دارم فیلد AGE برابر 60 هست ، اما براش Insert انجام نمیشه

عجیبه ولی شما مطمئن هستین که شخصی که سنش 60 هست جنسیتش زنه ؟؟؟
شاید مرد باشه ها دقت کنید!!!
آخه تا جایی که من بلدم کوئری تون باید درست باشه و نباید مشکلی داشته باشه.
اینو چک کنید نتیجه رو اطلاع بدین...

NasimBamdad
شنبه 25 آذر 1391, 13:59 عصر
یک مشکل جزیی بود که حل شد . یک تابع برای حذف کردن بعضی رکورد ها استفاده می کردم که اشتباهی اونجا هم لود شوده بود .

بعضی وقتا مغز آدم دیگه جواب نمیده . همیشه جلوی چشمم بود ، اما نمی دیدمش .

مرسی از همه عزیزان . اما بازم ممنون از دوستان که کد های بهینه تر و سالم تر و مطمعن تری رو به من یاد دادند !

ali_habibi1384
شنبه 25 آذر 1391, 14:26 عصر
من هنوز دستور insert ای که values نداره ندیدم.شما چطور مقدار درج می کنید؟

با سلكت بهش مقدار داده.مطالعه كنين پيدا ميكنين! با اين حساب اينم يه نمونه ديگش :
Insert Into TableName Select * From TableName2

veniz2008
شنبه 25 آذر 1391, 14:49 عصر
با سلكت بهش مقدار داده.مطالعه كنين پيدا ميكنين! با اين حساب اينم يه نمونه ديگش :
Insert Into TableName Select * From TableName2
راستش تا اون لحظه ای که این تاپیک رو ببینم هیچوقت ندیده بودم. حرف شما منو یاد این جمله انداخت که بزرگی گفته :
"باید زیاد مطالعه کنید تا بدانید که هیچ نمیدانید"
بهرحال از دقت و توجه شما ممنونم. :چشمک:

NasimBamdad
دوشنبه 27 آذر 1391, 13:58 عصر
راستش تا اون لحظه ای که این تاپیک رو ببینم هیچوقت ندیده بودم. حرف شما منو یاد این جمله انداخت که بزرگی گفته :
"باید زیاد مطالعه کنید تا بدانید که هیچ نمیدانید"
بهرحال از دقت و توجه شما ممنونم. :چشمک:

خواهش می کنم ، اصل و پایه فروم این هست که با تبادل اطلاعات چیز یاد بگیریم .

ممنونم از توجه شما و سایر دوستان که منو کمک کردند !