PDA

View Full Version : ناتوان در نوشتن یک کوری Insert پیچیده



NasimBamdad
یک شنبه 29 مرداد 1391, 19:38 عصر
سلام و خسته نباشید .

یکسری کد دارم در حدود 500 تا کد که تقریبا شبیه به هم هستند و به زبان C#‎ هستند .


if (checkBox1.Checked == true)
{
SqlConnection cnn3 = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);
SqlCommand cmd3 = new SqlCommand();
cmd3.Connection = cnn3;
cnn3.Open();
cmd3.CommandText = "INSERT INTO daroo_usage(patientid,darooid,numberz) VALUES (@patientid,@darooid,@numberz)";
cmd3.Parameters.AddWithValue("@patientid", textBox113.Text);
cmd3.Parameters.AddWithValue("@darooid", 1);
cmd3.Parameters.AddWithValue("@numberz", textBox1.Text);
cmd3.ExecuteNonQuery();
cnn3.Close();
}
if (checkBox2.Checked == true)
{
SqlConnection cnn3 = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);
SqlCommand cmd3 = new SqlCommand();
cmd3.Connection = cnn3;
cnn3.Open();
cmd3.CommandText = "INSERT INTO daroo_usage(patientid,darooid,numberz) VALUES (@patientid,@darooid,@numberz)";
cmd3.Parameters.AddWithValue("@patientid", textBox113.Text);
cmd3.Parameters.AddWithValue("@darooid", 2);
cmd3.Parameters.AddWithValue("@numberz", textBox2.Text);
cmd3.ExecuteNonQuery();
cnn3.Close();
}
if (checkBox3.Checked == true)
{
SqlConnection cnn3 = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);
SqlCommand cmd3 = new SqlCommand();
cmd3.Connection = cnn3;
cnn3.Open();
cmd3.CommandText = "INSERT INTO daroo_usage(patientid,darooid,numberz) VALUES (@patientid,@darooid,@numberz)";
cmd3.Parameters.AddWithValue("@patientid", textBox113.Text);
cmd3.Parameters.AddWithValue("@darooid", 3);
cmd3.Parameters.AddWithValue("@numberz", textBox3.Text);
cmd3.ExecuteNonQuery();
cnn3.Close();
}


به همین ترتیب زیاد تر می شوند و .......

هر کدام از این قسمت ها برای یک CheckBox نوشته شده اند ، به صورت اگه تیک خورده بود اون عملیات INSERT انجام میشه .

یک توضیح کوتاه در مورد دیتابیسم بدم و بعد درخواست کمکم در کوری رو خدمت شما عزیزان توضیح میدم

جدول Patients که یکسری مشخصات بیماران در این جدول هست ، از جمله توع جراحی این بیماران که اسمش surgery_type است .

فیلد های زیر رو در گیر خواهیم کرد

id ( شماره پرونده بیمار هست )
surgery_type ( ای دی نوع جراحی که از جدول جراحی ها خوانده می شود )

جدول daroo_usage که دارو های استفاده شده برای هر بیمار در این قسمت قرار داده می شود

patientid ( معادل همان فیلد id در جدول Patients می باشد . در واقع پل ارتباطی این دو جدول می باشد و یک فیلد واحد در کل دیتابیسم هست )
darooid که آی دی دارو رو از جدول daroo_type می خواند .
numberz هم که تعداد اون دارو هست .

با اون سری کد C#‎ که در بالا موجود هست برای هر بیماری شماره پروندش در textbox113 نوشته شود یک رکورد اضافه می شود . کاری که من می خواهم بکنم این هست که بگم از حالت شماره پرونده برداشته شود و بر اساس نوع جراحی باشه .

یعنی بگم که برای تمام بیمارانی که جراحیشان برابر 3 هست ، این دارو ها برای همشان اضافه شود .

یه این طور چیزی .

SqlConnection cnn3 = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);
SqlCommand cmd3 = new SqlCommand();
cmd3.Connection = cnn3;
cnn3.Open();
cmd3.CommandText = "INSERT INTO daroo_usage(patientid,darooid,numberz) VALUES (@patientid,@darooid,@numberz) WHERE dbo.patients.surgery_type = '3'";
cmd3.Parameters.AddWithValue("@patientid", textBox113.Text);
cmd3.Parameters.AddWithValue("@darooid", 1);
cmd3.Parameters.AddWithValue("@numberz", textBox1.Text);
cmd3.ExecuteNonQuery();
cnn3.Close();


باید بگم که برای تمامی بیماران موجود که فیلد surgery_type اون ها در جدول patients برابر مثلا 3 هست ، این عملیات INSERT انجام بشه .

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

شرمنده اگه گنگ صحبت کردم ، لطفا بفرمایید کجاش رو بد توضیح دادم که مجدد بهتر و واضح تر توضیح بدم

ASKaffash
سه شنبه 31 مرداد 1391, 07:06 صبح
سلام
این موضوع را باید در لایه Application مرتفع کنید خیلی مرتبط به T_SQL نیست. یک راهنمائی اولیه : درون Tag هرکدوم از CheckBox ها ID دارو را قرار دهید و درون Tag هرکدوم از TextBox ها که مقدار دارو را تعیین میکند نام کنترل CheckBox مربوطه را سپس درون یک حلقه برای کلیه CheckBox هائی که Checked آنها true است دستور Insert را ساخته و اجرا کنید اگر به OOP مسلط باشید راه خیلی علمی تری برای اینکار وجود دارد که نیازی به Tag و ... نیست

NasimBamdad
چهارشنبه 01 شهریور 1391, 14:38 عصر
الان خودم به فکر یه حلقه FOR افتادم که به اول یه Select Count بگیرم از اون دسته از بیماران که می خواهم ، بعدش به اون تعداد حلقه تکرار بشه و با اون دسته( شماره پرونده ها ) دستور INSERT انجام بشه .

فکر کنم عملی تر باشه .

این OOP هم اگه توضیحات بیشتر یا Reference دارید بهم بدید . مرسییییییییییییی

ASKaffash
شنبه 04 شهریور 1391, 06:51 صبح
سلام
OOP مبنای زبان های شی گرا مثل جاوا و دات نت است چون این موضوع با یکی از اصول چهار گانه OOP بنام وراثت خیلی بهتر حل می شود (برای موضوع شما #C)

majjjj
شنبه 04 شهریور 1391, 08:23 صبح
بهتر نیست این عملیات تو sp انجام بشه ؟
به نظرم همه گزینه هایی که تیک میخورن رو به sp ارسال کنید و اونجا شرط بزارید اونهایی که بر اساس شرط های ورودی به sp انتخاب شدن را عملیات مربوطه رو براشون اجرا کنید
چون میدونید که استفاده از for باعث ایجاد پیچیدگی زمانی و کند شدن برنامه میشه

NasimBamdad
شنبه 04 شهریور 1391, 16:49 عصر
به نظرم همه گزینه هایی که تیک میخورن رو به sp ارسال کنید و اونجا شرط بزارید اونهایی که بر اساس شرط های ورودی به sp انتخاب شدن را عملیات مربوطه رو براشون اجرا کنید

میشه یک مثال بزنید ، کار با SP ها رو کامل بلد نیستم . یک مثال کوچیک اگر وقت دارید !

ASKaffash
یک شنبه 05 شهریور 1391, 06:52 صبح
سلام
شما نمی توانید یک آرایه به SP پاس دهید واگر از یک رشته مثلا شبیه 3,5,11,4,7,... بعنوان ورودی SP استفاده کنید وضعیت سخت تر هم می شود (اگر دقت کنید تعداد CheckBox ها در آینده قابل افزایش است)

بهتر نیست این عملیات تو sp انجام بشه ؟
به نظرم همه گزینه هایی که تیک میخورن رو به sp ارسال کنید و اونجا شرط بزارید اونهایی که بر اساس شرط های ورودی به sp انتخاب شدن را عملیات مربوطه رو براشون اجرا کنید
چون میدونید که استفاده از for باعث ایجاد پیچیدگی زمانی و کند شدن برنامه میشه

NasimBamdad
یک شنبه 05 شهریور 1391, 15:29 عصر
با این طور چیزی حلش کردم . اما یکم زمان می بره تا INSERT بشه .


private void button1_Click(object sender, EventArgs e)
{
SqlConnection cnn = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);
SqlCommand cmd = new SqlCommand();
cmd.Connection = cnn;
cnn.Open();
cmd.CommandText = "SELECT Count(*) AS tbl1 FROM patients WHERE surgery_type = '" + comboBox1.SelectedValue + "'";
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
string countz = Convert.ToString(ds.Tables[0].Rows[0]["tbl1"]);
int conz = Convert.ToInt32(countz);
cnn.Close();
//////////////////
SqlConnection cnn1 = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);
SqlCommand cmd1 = new SqlCommand();
cmd1.Connection = cnn1;
cnn1.Open();
cmd1.CommandText = "SELECT id FROM patients WHERE surgery_type = '" + comboBox1.SelectedValue + "'";
SqlDataAdapter da1 = new SqlDataAdapter(cmd1);
DataSet ds1 = new DataSet();
da1.Fill(ds1);

cnn1.Close();
//////////////////



for (int i = 0; i < conz; i++)
{
string PID = Convert.ToString(ds1.Tables[0].Rows[i]["id"]);
if (checkBox1.Checked == true)
{
SqlConnection cnn3 = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);
SqlCommand cmd3 = new SqlCommand();
cmd3.Connection = cnn3;
cnn3.Open();
cmd3.CommandText = "INSERT INTO daroo_usage(patientid,darooid,numberz) VALUES (@patientid,@darooid,@numberz)";
cmd3.Parameters.AddWithValue("@patientid", PID);
cmd3.Parameters.AddWithValue("@darooid", 1);
cmd3.Parameters.AddWithValue("@numberz", textBox1.Text);
cmd3.ExecuteNonQuery();
cnn3.Close();
}
if (checkBox2.Checked == true)
{
SqlConnection cnn3 = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);
SqlCommand cmd3 = new SqlCommand();
cmd3.Connection = cnn3;
cnn3.Open();
cmd3.CommandText = "INSERT INTO daroo_usage(patientid,darooid,numberz) VALUES (@patientid,@darooid,@numberz)";
cmd3.Parameters.AddWithValue("@patientid", PID);
cmd3.Parameters.AddWithValue("@darooid", 2);
cmd3.Parameters.AddWithValue("@numberz", textBox1.Text);
cmd3.ExecuteNonQuery();
cnn3.Close();
}
}

MessageBox.Show("Z");
}

private void Form6_Load(object sender, EventArgs e)
{
surg();
}

void surg()
{
SqlConnection cnn31 = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"]);
SqlCommand cmd31 = new SqlCommand();
cmd31.Connection = cnn31;
cnn31.Open();
cmd31.CommandText = "SELECT * FROM surgery_type";
SqlDataAdapter da31 = new SqlDataAdapter(cmd31);
DataSet ds31 = new DataSet();
da31.Fill(ds31);
comboBox1.DataSource = ds31.Tables[0];
comboBox1.DisplayMember = "surgery_name";
comboBox1.ValueMember = "id";
cnn31.Close();
}

majjjj
دوشنبه 06 شهریور 1391, 09:26 صبح
سلام
شما نمی توانید یک آرایه به SP پاس دهید واگر از یک رشته مثلا شبیه 3,5,11,4,7,... بعنوان ورودی SP استفاده کنید وضعیت سخت تر هم می شود (اگر دقت کنید تعداد CheckBox ها در آینده قابل افزایش است)

سلام
این که نمیشه یک ارایه رو به sp ارسال کرد که تا اونجایی که من قبلا کد نویسی کردم و الان هم تو یکی از شرکتها داره استفاده میشه میدونم که میشه و در ضمن لازم نیست یک رشته مثل اون چیزی که فرمودین به سرور ارسال و در اونجا جدا سازی بشه