PDA

View Full Version : سوال: ثبت اطلاعات به صورت کلی برای گروه خاصی از افراد + حذف داده از جدول بدون کلید



rayson
دوشنبه 14 مرداد 1392, 19:20 عصر
با سلام خدمت دوستان .
من چند سوال داشتم و از دوستان خواهش دارم که من را راهنمایی کنم ، سوالات به شرح زیر است:
1- من میخوام یک سری اطلاعات عددی وارد کنم در گروه خاصی از کاربران:
-اعداد من تا 2 رقم اعشار دارند و ممکنه عدد منفی هم باشند.
-من درون دیتابیس از Decimal استفاده کردم برای آن فیلدها .
- بخش ثبت به شکل زیر که قرار دادم است یعنی من اول باید انتخاب کنم که میخوام تکی اطلاعات وارد کنم و یا کلی.
- اگر تکی است کد عضویت میگیرد + سال و گروه و مدرک غیر قابل دسترس است.( حالا اطلاعات گروه و مدرک را ار جدول دیگر که اطلاعات کارمندان است به دست میاره).( بگم که گروه و مدرک هر کدام جدول جدا دارند و آی دی آنها درون جدول اطلاعات کارمندان ثبت میشود)
من چطوری میتونم اطلاعات که آی دی هستند را از یک جدول بخونم و در فیلد خاصی از جدول دیگر بریزم؟
تا ایجا بخش ارسال تکی بود.
بخش دوم که کلی است که اگر تیک تمام کارمندان زده شود خانه کد عضویت غیر فعال شده و بجای آن خانه گروه و مدرک فعال میشود.
حالا سوال من این است که : چطور میشه من با انتخاب گروه مثلا طراحی تمام کسانی که گروهشان طراحی است مقدار هایی که دادم را بگیرن و یا چطور میشه فقط مدرک تحصیلی انتخاب کنم و ثبت فقط مدرک خاصی صورت گیرد و یا هردو کمبو باکس انتخاب کنم و کارمندان مشترک این دو کمبو اطلاعات داده ای شان ثبت شود؟
2- درون جدول که این اطلاعات ثبت میشود من آی دی سال درون آن ثبت میکنم.(هنگام ثبت خطا میده(کدهای زیر برای نمایش در کمبو و ثبت ) ) و زمانی که بخواهم داده ها را در دیتا گرید نمایش دهم آی دی سال را نمایش میدهد ، حال من چطور میتوانم به جای آی دی سال ، خود سال را نمایش بدهم برای هر کسی ( شکل )؟

کد پر کردن کمبو باکس :
private void show_cmb_sal()
{
SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\data computer.org\Documents\Visual Studio 2010\Projects\SNM\SNM\sm.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter("select id_sal,add_sal from sal ", con);
SqlCommand com = new SqlCommand();
con.Open();
com.Connection = con;
da.Fill(dt);
mojaz_cmb_sal.DataSource = dt;
mojaz_cmb_sal.DisplayMember = "add_sal";
mojaz_cmb_sal.ValueMember = "id_sal";
con.Close();
}

کد ثبت و قتی میزنم برای ثبت میگه که نوع متغیر باید تغییر بدم !
com.Parameters.AddWithValue("@id_sal", mojaz_cmb_sal.ValueMember);

3- میشه جدولی که کلید ندارد از آن اطلاعات حذف کرد اگر بلی چطور ؟

اطلاعات به شکل زیر ثبت میشوند.
108584

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

Mahmoud.Afrad
دوشنبه 14 مرداد 1392, 19:32 عصر
برای چی برای سال یک جدول جدا ایجاد کردید. برای سال نیاز به جدول جدا ندارید. به جای آی دی سال خود سال رو ذخیره کنید.

برای اینکه ممکنه سال ، مدرک تحصیلی، گروه هر کدوم وارد بشن یا نشن باید چک کنید مقداری انتخاب شده یا نه. اگر نشده بود که هیچ ولی اگر اضافه شده بود باید شرط مناسبی رو به کوئری اضافه کنید. کوئری آپدیت رو تا اونجایی که میتونید بنویسید و بزارید اینجا تا راهننمایی بشید.

rayson
دوشنبه 14 مرداد 1392, 19:51 عصر
برای چی برای سال یک جدول جدا ایجاد کردید. برای سال نیاز به جدول جدا ندارید. به جای آی دی سال خود سال رو ذخیره کنید.
یک سری داده در آینده اضافه میشود که لازم هست این فیلد جدا باشد.
من برروی برنامه دارم کار میکنم فقط اگر میشه بگید چطوری میشه آی دی سال را در جدول دیگر ثبت کرد کد بالا که گذاشتم روش من است اما خطا میذه .

veniz2008
دوشنبه 14 مرداد 1392, 20:10 عصر
با سلام خدمت دوستان .
من چند سوال داشتم و از دوستان خواهش دارم که من را راهنمایی کنم ، سوالات به شرح زیر است:
1- من میخوام یک سری اطلاعات عددی وارد کنم در گروه خاصی از کاربران:
-اعداد من تا 2 رقم اعشار دارند و ممکنه عدد منفی هم باشند.
-من درون دیتابیس از Decimal استفاده کردم برای آن فیلدها .

سلام.
چون گفتید تا دو رقم اعشار دارید از (28,2)decimal استفاده کنید.


3- میشه جدولی که کلید ندارد از آن اطلاعات حذف کرد اگر بلی چطور ؟

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

rayson
دوشنبه 14 مرداد 1392, 20:29 عصر
ممنون از شما بابت کمک . من سوالاتم یکی یکی میگم . درست و بابت بالا ببخشید نباید با هم سوالات را میگفتم.
پس سوال 3 را شما جواب دادید ، من میام یک آی دی براش میزارم و بحث تمام میشود . مرسی .

چون گفتید تا دو رقم اعشار دارید از (28,2)decimal استفاده کنید.من تغییر میدم ولی چرا باید 28 باشد ؟ من 18و2 قرار دادم .
من میخوام اعشاری ثبت کنم ولی مشکل دارم یعنی عدد میزارم و وقتی اعشار آن را جدا میکنم با , یا / برنامه خطا نوع داده ای میده.
اگر سوال بالا هم که میخوام ای دی سال ثبت کنم را هم توضیح بدید ممنون میشم .

این دو بخش برود جلو من ادامه میدم کدنویسی را تا برسه به بقیه سوالات ولی الان این 2 بخش بالا که سوال کردم خطا میده.
با تشکر

veniz2008
دوشنبه 14 مرداد 1392, 20:45 عصر
من تغییر میدم ولی چرا باید 28 باشد ؟ من 18و2 قرار دادم .
من میخوام اعشاری ثبت کنم ولی مشکل دارم یعنی عدد میزارم و وقتی اعشار آن را جدا میکنم با , یا / برنامه خطا نوع داده ای میده.

در مورد عدد 28 ای که گفتم اجباری به گذاشتن این عدد نیست. من سعی کردم عدد بزرگی رو بگم تا مشکلی در ذخیره سازی نداشته باشید کلا مفهوم این (18,2)decimal به این معنی هست که شما کلا مجاز به وارد کردن 18 رقم هستید که 2 رقم برای اعشار خواهد بود و 16 رقم هم برای خود عدد مجاز هستید که وارد کنید. شما طبق نیاز پروژه تون این اعداد رو تعیین کنید.
در مورد خطا دقیق متوجه نشدم منظورتون چیه ولی ظاهرا از کاراکتر غیر مجاز (, یا / ) برای ممیز استفاده کردید. از نقطه ( . ) برای ممیز استفاده کنید.

اگر سوال بالا هم که میخوام ای دی سال ثبت کنم را هم توضیح بدید ممنون میشم .
این دو بخش برود جلو من ادامه میدم کدنویسی را تا برسه به بقیه سوالات ولی الان این 2 بخش بالا که سوال کردم خطا میده.
با تشکر
در مورد سال طبق گفته دوستمون عمل کنید و خود سال رو ذخیره کنید.

Mahmoud.Afrad
دوشنبه 14 مرداد 1392, 22:23 عصر
آی دی را به valuemember کمبوباکس نسبت میدید پس در هنگام ذخیره SelectedValue را باید ذخیره کنید.

در مورد اینکه گفتید ممکنه تیک همه کارمندان بخوره و یا نه همونطور که گفتم یا باید کوئری رو سمت برنامه بسازید یا در یک storedprocedure این کار رو انجام بدید. هر وقت کوئری رو گذاشتید میتونیم روش بحث کنیم.

rayson
سه شنبه 15 مرداد 1392, 16:47 عصر
در مورد اینکه گفتید ممکنه تیک همه کارمندان بخوره و یا نه همونطور که گفتم یا باید کوئری رو سمت برنامه بسازید یا در یک storedprocedure این کار رو انجام بدید. هر وقت کوئری رو گذاشتید میتونیم روش بحث کنیم. سلام و خسته نباشید.
من کوئری را نوشتم ، برای زمانی که تیک چک باکس تمام کارمندان غیر فعال است.
توضیح کد:
ب کد اول کد عضویت را چک میکند که آیا وجود دارد چنین کد عضویتی یا نه . اگر بود دستور اول که اول خواندن اطلاعات از جدول Employ ( جدول اطلاعات کارمندان) و جستجو میکونه دنبال کد عضویت که وارد شده و زمانی که پیدا کرد ، اطلاعات کد عضویت ( که نیاز بود برای جستجو ) و id_group_employ و id_madrak_tahsili را میریزه تو da و بعد dt را پر میکنه . بعد من اومدم دو تا آی دی گروه و مدرک را تبدیل کردم به اینتیجر تا بریزمش تو جدول اصلی ولی خطا میده . Message Error :Input string was not in a correct format. که میگه: رشته ورودی در یک فرمت درست نبود.
چه دستوری باید جایگزین کنم که جواب بده ؟
کاری که من میخوام انجام بدم این است که بعضی فیلد ها ( نه همه فیلد ها) از یک جدول بخونم و در جدول دیگر بریزم.مانند: id_group_employ + id_madrak_tahsili


if (mojaz_chb_all_employ.Checked == false)
{

SqlConnection con = new SqlConnection();
con.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\data computer.org\Documents\Visual Studio 2010\Projects\SNM\SNM\sm.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
SqlCommand com = new SqlCommand();

// Sabt Etela'at mojaz

SqlCommand com2 = new SqlCommand();
int check = 0;
// aval search for boodan code ozviat
com2.CommandText = "select count(*) from employ where code_ozviat=@code_ozviat";
com2.Parameters.AddWithValue("@code_ozviat", mojaz_txt_code_ozviat.Text);
com2.Connection = con;
con.Open();
check = Convert.ToInt32(com2.ExecuteScalar());
con.Close();
if (check != 0)
{
int myid_group, myid_madrak;
//------------ khandan etela'at az jadval employ ( group + madrak_Tahsili )----------------
SqlCommand com3 = new SqlCommand();
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter("select id_group_employ,id_madrak_tahsili,code_ozviat from employ where convert (varchar,code_ozviat) LIKE N'%" + mojaz_txt_code_ozviat.Text + "%'", con);
da.Fill(dt);
myid_group = int.Parse(dt.Columns["id_group_employ"].ToString());
myid_madrak = int.Parse(dt.Columns["id_madrak_tahsili"].ToString());
con.Close();

//-----------------------------------------------------------------
com.CommandText = "insert into mojaz(sonati,felezi,sakhteshode,code_ozviat,id_sal ,id_group_employ,id_madrak_tahsili) VALUES (@sonati,@felezi,@sakhteshode,@code_ozviat,@id_sal ,@id_group_employ,@id_madrak_tahsili)";
// felezi , sakhteshode , sonati + code_ozivat |||||| id_group + id_madrak az jadval employ migirim.
com.Parameters.AddWithValue("@sonati", mojaz_txt_sonati.Text);
com.Parameters.AddWithValue("@felezi", mojaz_txt_felezi.Text);
com.Parameters.AddWithValue("@sakhteshode", mojaz_txt_sakhte_shode.Text);
com.Parameters.AddWithValue("@code_ozviat", mojaz_txt_code_ozviat.Text);
com.Parameters.AddWithValue("@id_sal", mojaz_cmb_sal.SelectedValue);
com.Parameters.AddWithValue("@id_group_employ", myid_group);
com.Parameters.AddWithValue("@id_madrak_tahsili", myid_madrak);
con.Open();
com.Connection = con;
com.ExecuteNonQuery();
con.Close();
MessageBox.Show("اطلاعات با موفقیت ثبت گردید", "توجه");
refresh_dgv_mojaz();
}
else
{
mojaz_txt_code_ozviat.BackColor = Color.OrangeRed;
MessageBox.Show("کد عضویت با چنین مشخصاتی موجود نمی باشد", "توجه");
mojaz_txt_code_ozviat.Text = "";
mojaz_txt_code_ozviat.BackColor = Color.White;
}


}
else
{
//وقتی تیک چک باکس زده میشود
//وقتی تیک چک باکس زده میشود
//وقتی تیک چک باکس زده میشود
MessageBox.Show("در دست تعمیر ", "");
}
با تشکر .

veniz2008
سه شنبه 15 مرداد 1392, 18:06 عصر
من اومدم دو تا آی دی گروه و مدرک را تبدیل کردم به اینتیجر تا بریزمش تو جدول اصلی ولی خطا میده . Message Error :Input string was not in a correct format. که میگه: رشته ورودی در یک فرمت درست نبود.
چه دستوری باید جایگزین کنم که جواب بده ؟
برای دسترسی به یک سلول دیتاتیبل اینطوری بنویس (براکت اول شماره سطر هست و براکت دوم شماره ستون (یا نام فیلد جدولتون) رو باید قرار بدید).

myid_group = int.Parse(dt.Rows[0]["id_group_employ"].ToString());
myid_madrak = int.Parse(dt.Rows[0]["id_madrak_tahsili"].ToString());

Mahmoud.Afrad
سه شنبه 15 مرداد 1392, 18:06 عصر
دیتاتیبلی که پر میکنی باید از طریق سطرهاش به اطلاعاتش دسترسی پیدا کنی.

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



از دیتاریدر هم میتونی استفاده کنی:

if (mojaz_chb_all_employ.Checked == false)
{
SqlConnection con = new SqlConnection
{
ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\data computer.org\Documents\Visual Studio 2010\Projects\SNM\SNM\sm.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
};
SqlCommand cmdGetData = new SqlCommand
{
CommandText = "select id_group_employ,id_madrak_tahsili,code_ozviat from employ where code_ozviat=@code_ozviat",
Connection = con
};
cmdGetData.Parameters.AddWithValue("@code_ozviat", mojaz_txt_code_ozviat.Text);
con.Open();
using (SqlDataReader dataReader = cmdGetData.ExecuteReader())
{
if (dataReader.Read())
{
int myidGroup = Convert.ToInt32(dataReader["id_group_employ"]);
int myidMadrak = Convert.ToInt32(dataReader["id_madrak_tahsili"]);
SqlCommand cmdInsert = new SqlCommand
{
CommandText = "insert into mojaz(sonati,felezi,sakhteshode,code_ozviat,id_sal ,id_group_employ,id_madrak_tahsili) VALUES (@sonati,@felezi,@sakhteshode,@code_ozviat,@id_sal ,@id_group_employ,@id_madrak_tahsili)",
Connection = con
};
cmdInsert.Parameters.AddWithValue("@sonati", mojaz_txt_sonati.Text);
cmdInsert.Parameters.AddWithValue("@felezi", mojaz_txt_felezi.Text);
cmdInsert.Parameters.AddWithValue("@sakhteshode", mojaz_txt_sakhte_shode.Text);
cmdInsert.Parameters.AddWithValue("@code_ozviat", mojaz_txt_code_ozviat.Text);
cmdInsert.Parameters.AddWithValue("@id_sal", mojaz_cmb_sal.SelectedValue);
cmdInsert.Parameters.AddWithValue("@id_group_employ", myidGroup);
cmdInsert.Parameters.AddWithValue("@id_madrak_tahsili", myidMadrak);
con.Open();
cmdInsert.ExecuteNonQuery();
con.Close();
MessageBox.Show("اطلاعات با موفقیت ثبت گردید", "توجه");
refresh_dgv_mojaz();
}
else
{
mojaz_txt_code_ozviat.BackColor = Color.OrangeRed;
mojaz_txt_code_ozviat.Text = "";
mojaz_txt_code_ozviat.BackColor = Color.White;
MessageBox.Show("کد عضویت با چنین مشخصاتی موجود نمی باشد", "توجه");
}
}
con.Close();
}
else
{
MessageBox.Show("در دست تعمیر");
}

rayson
سه شنبه 15 مرداد 1392, 21:16 عصر
سلام به دوستان.
بخش اول پایان یافت و از شما بسیار ممنون هستم که راهنمایی کردید.
حال بخش دوم :
در بخش دوم قرار بر این شد : زمانی که گزینه تمام کارمندان فعال شد 3 حالت ایجاد شود:
حالت اول : فقط گروه انتخاب شود.
حالت دوم: فقط مدرک تحصیلی انتخاب شود.
حالت سوم: هر دو فعال شوند.
حالت اول و دوم یک صورت است که ابتدا در مورد آنها سوال میپرسم.
من در طراحی یک تغییر ایجاد کردم که در زیر نمایش دادم(تیک هر کدام زده شود فعال و قابل استفاده میشود.
طبق کد های بالا یک روند را پیش گرفتم و میتونم اطلاعات یک کارمند را فقط ثبت کنم حال من اگر بخواهم گروه ای را درج کنم به چه صورت است ؟

108645

else if(mojaz_chb_all_employ.Checked == true) {


if (mojaz_chk_group.Checked == true && mojaz_chk_madrak.Checked == true) {
// حالت اول هر دو گزینه گروه و مدرک فعال باشند


}
else if (mojaz_chk_group.Checked == true && mojaz_chk_madrak.Checked == false) {
// حالت دوم فقط گزینه گروه فعال باشد
cmdGetData.CommandText = "select id_group_employ,id_madrak_tahsili,code_ozviat from employ where id_group_employ=@id_group_employ";
cmdGetData.Parameters.AddWithValue("@id_group_employ", mojaz_cmb_group.SelectedValue);
con.Open();
cmdGetData.Connection = con;

using (SqlDataReader dataReader = cmdGetData.ExecuteReader())
{


if (dataReader.Read())
{
myCodeOzviat = dataReader["code_ozviat"].ToString();
myidGroup = Convert.ToInt32(dataReader["id_group_employ"]);
myidMadrak = Convert.ToInt32(dataReader["id_madrak_tahsili"]);

SqlCommand cmdInsert = new SqlCommand{CommandText = "insert into mojaz(sonati,felezi,sakhteshode,code_ozviat,id_sal ,id_group_employ,id_madrak_tahsili) VALUES (@sonati,@felezi,@sakhteshode,@code_ozviat,@id_sal ,@id_group_employ,@id_madrak_tahsili)", Connection = con };

cmdInsert.Parameters.AddWithValue("@sonati", mojaz_txt_sonati.Text);
cmdInsert.Parameters.AddWithValue("@felezi", mojaz_txt_felezi.Text);
cmdInsert.Parameters.AddWithValue("@sakhteshode", mojaz_txt_sakhte_shode.Text);
cmdInsert.Parameters.AddWithValue("@code_ozviat",myCodeOzviat);
cmdInsert.Parameters.AddWithValue("@id_sal", mojaz_cmb_sal.SelectedValue);
cmdInsert.Parameters.AddWithValue("@id_group_employ", myidGroup);
cmdInsert.Parameters.AddWithValue("@id_madrak_tahsili", myidMadrak);
dataReader.Close();
cmdInsert.ExecuteNonQuery();
con.Close();
MessageBox.Show("اطلاعات با موفقیت ثبت گردید", "توجه");
refresh_dgv_mojaz();

}//if

else
{

mojaz_txt_code_ozviat.BackColor = Color.OrangeRed;
mojaz_txt_code_ozviat.Text = "";
mojaz_txt_code_ozviat.BackColor = Color.White;
MessageBox.Show("گروهی با چنین مشخصاتی موجود نمی باشد", "توجه");

}//else
}//using

}//else if
else if (mojaz_chk_group.Checked == false && mojaz_chk_madrak.Checked == true) {
// حالت سوم فقط گزینه مدرک فعال باشد

}
else
MessageBox.Show("لطفا گروه و مدرک تحصیلی مورد نظر را انتخاب کنید");


}

rayson
چهارشنبه 16 مرداد 1392, 20:20 عصر
وقتی توی یک تاپیک چند تا سوال می پرسی رشته بحث از دست آدم در میره.
از این بابت عذرخواهی میکنم .
دوستان اطلاعات در یک شاخه بود برای همین گفتم در یکجا قرار بدم.
این آخرین بحث اوکی شد بقیه سوالات در تاپیک جدید ارسال میکنم:((
دوست من روش بالا چیزی نیست که من میخواهم. از این که میگید رشته کار از دستتون در اومد حق دارید ببخشید ولی این سوال که دارم میپرسم تازه با آبجکت تاپیک یکی است و سوالات قبل پیش زمینه بودند.

اول عکس نگاه کنید.
108709

به اعداد درون عکس توجه کنید این اعداد به این معنی است که اطلاعات به چه ترتیب ذخیره میشود : ابتدا جدول کارمند و مدرک تحصیلی بعد اطلاعات کارمندان و در آخر مجاز.
خوب در بالا بخش اول ما که گفته شد کد عضویت وارد میشود و طبق کد عضویت در جدول کارمند جستجو کرده و اطلاعات دیگر ( گروه و مدرک تحصیلی ) را از جدول کارمند گرفته و در جدول مجاز ثبت میکند.
در بخش دوم که در مورد بحث تمام کارمندان بود و در تاپیک های قبلی عکس ضمیمه کردم قرار بر این شد که 3 حالت اجرا شود:
1- اگر فقط گروه باشد : گروه را در جدول کارمندان جستجو کرده و هرکس که گروه مشابه دارد را میگیرد و اطلاعات دیگر آنها که ( علاوه بر گروه + کد عضویت و مدرک تحصیلی است ) را از جدول کارمند گرفته و در جدول مجاز ثبت میکند. توجه داشته باشید که ممکنه N تا کاربر ثبت شود پس از خانه 0 تا N باید ثبت شود که هرکدام مشخصات خاص خود را دارند .
2- اگر فقط مدرک تحصیلی باشد: دقیقا مشابه بالا با این تفاوت که در این بخش مدرک را جستجو میکند.
3- این حالت که هم مدرک و هم گروه انتخاب شده باشد و خود به دو حالت دیگر تقسیم میشود:
3-1:اگر اول گروه و دوم مدرک انتخاب شده باشد: کارمندی ممکنه گروهش با یک کارمند یکی باشد ولی مدرک فرق بکند.
3-2:اگر اول مدرک و دوم گروه انتخاب شده باشد: دقیقا شبیه بالا.

بازم بابت اسپم در این تاپیک ببخشید .

من در بالا کد های هم قرار دادم که برای بخش تمام کارمندان نوشتم ولی فقط یک کارمند را ثبت میکند( و مال گروه است )
ممنون میشم کمک کنید و طبق توضیحات بالا راهنمایی مناسب کنید( این بخش بسیار مهمی در برنامه من است)
ببخشید باز هم :((
با تشکر

veniz2008
پنج شنبه 17 مرداد 1392, 01:32 صبح
من در بالا کد های هم قرار دادم که برای بخش تمام کارمندان نوشتم ولی فقط یک کارمند را ثبت میکند

دلیل اینکه فقط یک رکورد رو ثبت میکنه اینه که اولا حلقه استفاده نکردی، همچنین بعد از ثبت نباید کانکشن و ریدر رو ببندی.همچنین بعد از عمل execute هم پارامترهای کامند رو خالی کن.
باید عمل بسته شدن رو هم بعد از ثبت همه رکوردها انجام بدی :

while (dataReader.Read())
{
myCodeOzviat = dataReader["code_ozviat"].ToString();
myidGroup = Convert.ToInt32(dataReader["id_group_employ"]);
myidMadrak = Convert.ToInt32(dataReader["id_madrak_tahsili"]);

SqlCommand cmdInsert = new SqlCommand{CommandText = "insert into mojaz(sonati,felezi,sakhteshode,code_ozviat,id_sal ,id_group_employ,id_madrak_tahsili) VALUES (@sonati,@felezi,@sakhteshode,@code_ozviat,@id_sal ,@id_group_employ,@id_madrak_tahsili)", Connection = con };

cmdInsert.Parameters.AddWithValue("@sonati", mojaz_txt_sonati.Text);
cmdInsert.Parameters.AddWithValue("@felezi", mojaz_txt_felezi.Text);
cmdInsert.Parameters.AddWithValue("@sakhteshode", mojaz_txt_sakhte_shode.Text);
cmdInsert.Parameters.AddWithValue("@code_ozviat",m yCodeOzviat);
cmdInsert.Parameters.AddWithValue("@id_sal", mojaz_cmb_sal.SelectedValue);
cmdInsert.Parameters.AddWithValue("@id_group_emplo y", myidGroup);
cmdInsert.Parameters.AddWithValue("@id_madrak_tahs ili", myidMadrak);
cmdInsert.ExecuteNonQuery();
cmdInsert.Parameters.Clear();
}
dataReader.Close();
con.Close();

veniz2008
پنج شنبه 17 مرداد 1392, 15:42 عصر
سلام ممنون .
اگز من از حلقه در این بخش استفاده کنم سیستم از کجا متوجه میشود که باید کدام خانه را بگیرد و درج کند عمل نکست چطور صورت میگیرد ؟ آیا تمام این کارها با دستور Read انجام میشود ؟

شما وقتی از حلقه استفاده می کنید با فرض اینکه 3 تا رکورد برگشت داده شده باشه در هر بار اجرای حلقه میتونید به یک سطر (و یک ستون) دسترسی داشته باشید. یعنی فیلد myCodeOzviat و دو فیلد دیگه ای که از دیتاریدر میخونید در هر بار اجرای حلقه مقدار جدید رو دریافت میکنه.(فقط مقدار این 3 متغیر متفاوت خواهد بود و بقیه فیلدها مقدار یکسانی رو در طول حلقه خواهند داشت).


من این عمل را در دستور قبلی در بعد از Excute قرار داده بودم ولی وقتی برنامه اجرا میشد خطا زیر را میداد .( که به دلیل بسته نبودن Reader است) راه دیگه ای دارد ؟

108756
با تشکر. نه تنها مشکل شما که مشکل خیلی از دوستان اینه که وقتی یه کانکشن رو باز میکنن دیگه ولش میکنن به امان خدا.
اینو همیشه بخاطر داشته باشید : هر جایی که کانکشن باز کردید (یا دیتا ریدر) بعد از اتمام کارتون اونو ببندید. مگر میشه آدم در خونه رو باز کنه و نبنده؟
شما برو کدت رو بررسی کن ببین کجا باز کردی و نبستی. ممکنه توی فرم لود باز کرده باشی ممکنه توی دکمه دیگه ای باز کرده باشی. هر کجا که باز کردی، بعد از اتمام کار در همون جا ببندش.

rayson
پنج شنبه 17 مرداد 1392, 18:07 عصر
سلام من کل فرم چک کردم ولی جایی کانکشنی باز نمونده بود. 2 3 بار هم چک کردم.

خطا که میده میگه که DataReader باز هست و من در این فرم فقط در کد زیر از Reader استفاده کردم.
من شاید مکان بستن Reader را اشتباه قرار دادم. لطفا یک نگاه به کد بیندازید ممکنه من مکان درست قرار ندادم.

به جز Connection و Reader حالت دیگه ای از کانکشن وجود داره ؟
ممکنه من نشناسم و نبسته باشم آن را .
اگر در فرم دیگری کانکشنی باز مونده باشه روی این فرم تاثیر میگذاره ؟

private void mojaz_btn_sabt_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection();
con.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\data computer.org\Documents\Visual Studio 2010\Projects\SNM\SNM\sm.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
SqlCommand cmdGetData = new SqlCommand();
if (mojaz_chb_all_employ.Checked == false)
{
cmdGetData.CommandText = "select id_group_employ,id_madrak_tahsili,code_ozviat from employ where code_ozviat=@code_ozviat";
cmdGetData.Parameters.AddWithValue("@code_ozviat", mojaz_txt_code_ozviat.Text);

con.Open();
cmdGetData.Connection = con;
using (SqlDataReader dataReader1 = cmdGetData.ExecuteReader())
{
if (dataReader1.Read())
{
myidGroup = Convert.ToInt32(dataReader1["id_group_employ"]);
myidMadrak = Convert.ToInt32(dataReader1["id_madrak_tahsili"]);
SqlCommand cmdInsert = new SqlCommand{CommandText = "insert into mojaz(sonati,felezi,sakhteshode,code_ozviat,id_sal ,id_group_employ,id_madrak_tahsili) VALUES (@sonati,@felezi,@sakhteshode,@code_ozviat,@id_sal ,@id_group_employ,@id_madrak_tahsili)" };
cmdInsert.Parameters.AddWithValue("@sonati", mojaz_txt_sonati.Text);
cmdInsert.Parameters.AddWithValue("@felezi", mojaz_txt_felezi.Text);
cmdInsert.Parameters.AddWithValue("@sakhteshode", mojaz_txt_sakhte_shode.Text);
cmdInsert.Parameters.AddWithValue("@code_ozviat", mojaz_txt_code_ozviat.Text);
cmdInsert.Parameters.AddWithValue("@id_sal", mojaz_cmb_sal.SelectedValue);
cmdInsert.Parameters.AddWithValue("@id_group_employ", myidGroup);
cmdInsert.Parameters.AddWithValue("@id_madrak_tahsili", myidMadrak);
cmdInsert.ExecuteNonQuery();
MessageBox.Show("اطلاعات با موفقیت ثبت گردید", "توجه");
refresh_dgv_mojaz();
}
else
{
mojaz_txt_code_ozviat.BackColor = Color.OrangeRed;
mojaz_txt_code_ozviat.Text = "";
mojaz_txt_code_ozviat.BackColor = Color.White;
MessageBox.Show(" کد عضویت با چنین مشخصاتی موجود نمی باشد", "توجه");
}
con.Close();
dataReader1.Close();
}
}
else if(mojaz_chb_all_employ.Checked == true) {

if (mojaz_chk_group.Checked == true && mojaz_chk_madrak.Checked == true) {
// حالت اول هر دو گزینه گروه و مدرک فعال باشند
}
else if (mojaz_chk_group.Checked == true && mojaz_chk_madrak.Checked == false) {
// حالت دوم فقط گزینه گروه فعال باشد
cmdGetData.CommandText = "select id_group_employ,id_madrak_tahsili,code_ozviat from employ where id_group_employ=@id_group_employ";
cmdGetData.Parameters.AddWithValue("@id_group_employ", mojaz_cmb_group.SelectedValue);
con.Open();
cmdGetData.Connection = con;

using (SqlDataReader dataReader2 = cmdGetData.ExecuteReader())
{


while (dataReader2.Read())
{
myCodeOzviat = dataReader2["code_ozviat"].ToString();
myidGroup = Convert.ToInt32(dataReader2["id_group_employ"]);
myidMadrak = Convert.ToInt32(dataReader2["id_madrak_tahsili"]);
SqlCommand cmdInsert = new SqlCommand{CommandText = "insert into mojaz(sonati,felezi,sakhteshode,code_ozviat,id_sal ,id_group_employ,id_madrak_tahsili) VALUES (@sonati,@felezi,@sakhteshode,@code_ozviat,@id_sal ,@id_group_employ,@id_madrak_tahsili)"};
cmdInsert.Parameters.AddWithValue("@sonati", mojaz_txt_sonati.Text);
cmdInsert.Parameters.AddWithValue("@felezi", mojaz_txt_felezi.Text);
cmdInsert.Parameters.AddWithValue("@sakhteshode", mojaz_txt_sakhte_shode.Text);
cmdInsert.Parameters.AddWithValue("@code_ozviat",myCodeOzviat);
cmdInsert.Parameters.AddWithValue("@id_sal", mojaz_cmb_sal.SelectedValue);
cmdInsert.Parameters.AddWithValue("@id_group_employ", myidGroup);
cmdInsert.Parameters.AddWithValue("@id_madrak_tahsili", myidMadrak);
cmdInsert.Connection = con;
cmdInsert.ExecuteNonQuery();
cmdInsert.Parameters.Clear();
}
dataReader2.Close();
con.Close();
MessageBox.Show("اطلاعات با موفقیت ثبت گردید", "توجه");
refresh_dgv_mojaz();

}//using

}//else if
با تشکر.

veniz2008
پنج شنبه 17 مرداد 1392, 19:59 عصر
به فرم دیگه مروبط نمیشه.
هرچی هست مربوط به همین فرم هست. قبل باز کردن کانکشن اول چک کن که کانکشن باز نباشه. اگر بسته بود بعد بازش کن :

if (con.State == ConnectionState.Closed)
{
con.Open();
}

rayson
پنج شنبه 17 مرداد 1392, 20:19 عصر
بله این روش هم تست زدم ولی جواب نمیده یعنی باز همان خطامیده.
وقتی تو کد اول Reader.close را بالا Excute قرار میدم دیگه خطا نمیده و اطلاعات یک نفر را ثبت میکند ولی وقتی میارمش بعد آن یا بعد از دستور کلی قرار میدم مثل کد پایین که While داره خطا مشابه میده.
نظر شما چیست ؟
از این لحاظ مطمئن باشید که کد Con.close ست است.
لیست خطا :

http://www.uploadtak.com/images/l8945_my1.jpg

:گریه:

rayson
شنبه 19 مرداد 1392, 15:38 عصر
سلام دوستان.
من داشتم روی کد فکر میکردم بعد یک لحظه یاد مثال یکی از استادان دانشگاه افتادم که در مورد کانکشن زده بود.
گفت کانکشن مثل یک لوله آب میمونه و جدول ها هم شیر آب ، نمیدونم این فکر درست یا نه که چیزی گه استاد ما گفته صحیح یا غلط فقط این فکر به ذهن من خطور کرد که در قسمت اول برنامه من کانکت کردم برای گرفتن اطلاعات از جدول کارمندان و بدون اینکه بخواهم کانکت را ببندم آمدن عمل درج را در یک جدول دیگر به نام مجاز انجام دادم . ممکنه دلیل خطا برنامه من این باشد ؟
الان چند روز گیر همین تکه کد هستم کسی تا به حال به این مشکل بر نخورده ؟
روش دیگری هست که من نخوام از DataReader استفاده کنم ؟

veniz2008
شنبه 19 مرداد 1392, 18:51 عصر
سلام دوستان.
من داشتم روی کد فکر میکردم بعد یک لحظه یاد مثال یکی از استادان دانشگاه افتادم که در مورد کانکشن زده بود.
گفت کانکشن مثل یک لوله آب میمونه و جدول ها هم شیر آب ، نمیدونم این فکر درست یا نه که چیزی گه استاد ما گفته صحیح یا غلط فقط این فکر به ذهن من خطور کرد که در قسمت اول برنامه من کانکت کردم برای گرفتن اطلاعات از جدول کارمندان و بدون اینکه بخواهم کانکت را ببندم آمدن عمل درج را در یک جدول دیگر به نام مجاز انجام دادم . ممکنه دلیل خطا برنامه من این باشد ؟
الان چند روز گیر همین تکه کد هستم کسی تا به حال به این مشکل بر نخورده ؟
روش دیگری هست که من نخوام از DataReader استفاده کنم ؟
حالت رو درک میکنم!
وقتی یه مشکل حل نمیشه آدم فکرش تا لوله و شیر آب هم میره. اینا طبیعی هست!!!
هر چی datareader.close داری رو پاک کن. فقط یکبار قبل از اینکه کلا وارد if یا else if بشی کانکشن رو باز کن و یکبار هم در خارج از if و else if کانکشن رو ببند.
راه های دیگه ای هم هست. اگر جواب نگرفتی میتونی از همون دیتاتیبل استفاده کنی.

private void mojaz_btn_sabt_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection();
con.ConnectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\data computer.org\Documents\Visual Studio 2010\Projects\SNM\SNM\sm.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True";
SqlCommand cmdGetData = new SqlCommand();
con.Open();
if (mojaz_chb_all_employ.Checked == false)
{
cmdGetData.CommandText = "select id_group_employ,id_madrak_tahsili,code_ozviat from employ where code_ozviat=@code_ozviat";
cmdGetData.Parameters.AddWithValue("@code_ozviat", mojaz_txt_code_ozviat.Text);


cmdGetData.Connection = con;
using (SqlDataReader dataReader1 = cmdGetData.ExecuteReader())
{
if (dataReader1.Read())
{
myidGroup = Convert.ToInt32(dataReader1["id_group_employ"]);
myidMadrak = Convert.ToInt32(dataReader1["id_madrak_tahsili"]);
SqlCommand cmdInsert = new SqlCommand{CommandText = "insert into mojaz(sonati,felezi,sakhteshode,code_ozviat,id_sal ,id_group_employ,id_madrak_tahsili) VALUES (@sonati,@felezi,@sakhteshode,@code_ozviat,@id_sal ,@id_group_employ,@id_madrak_tahsili)" };
cmdInsert.Parameters.AddWithValue("@sonati", mojaz_txt_sonati.Text);
cmdInsert.Parameters.AddWithValue("@felezi", mojaz_txt_felezi.Text);
cmdInsert.Parameters.AddWithValue("@sakhteshode", mojaz_txt_sakhte_shode.Text);
cmdInsert.Parameters.AddWithValue("@code_ozviat", mojaz_txt_code_ozviat.Text);
cmdInsert.Parameters.AddWithValue("@id_sal", mojaz_cmb_sal.SelectedValue);
cmdInsert.Parameters.AddWithValue("@id_group_emplo y", myidGroup);
cmdInsert.Parameters.AddWithValue("@id_madrak_tahs ili", myidMadrak);
cmdInsert.ExecuteNonQuery();
MessageBox.Show("اطلاعات با موفقیت ثبت گردید", "توجه");
refresh_dgv_mojaz();
}
else
{
mojaz_txt_code_ozviat.BackColor = Color.OrangeRed;
mojaz_txt_code_ozviat.Text = "";
mojaz_txt_code_ozviat.BackColor = Color.White;
MessageBox.Show(" کد عضویت با چنین مشخصاتی موجود نمی باشد", "توجه");
}
}
}
else if(mojaz_chb_all_employ.Checked == true) {

if (mojaz_chk_group.Checked == true && mojaz_chk_madrak.Checked == true) {
// حالت اول هر دو گزینه گروه و مدرک فعال باشند
}
else if (mojaz_chk_group.Checked == true && mojaz_chk_madrak.Checked == false) {
// حالت دوم فقط گزینه گروه فعال باشد
cmdGetData.CommandText = "select id_group_employ,id_madrak_tahsili,code_ozviat from employ where id_group_employ=@id_group_employ";
cmdGetData.Parameters.AddWithValue("@id_group_empl oy", mojaz_cmb_group.SelectedValue);
cmdGetData.Connection = con;

using (SqlDataReader dataReader2 = cmdGetData.ExecuteReader())
{


while (dataReader2.Read())
{
myCodeOzviat = dataReader2["code_ozviat"].ToString();
myidGroup = Convert.ToInt32(dataReader2["id_group_employ"]);
myidMadrak = Convert.ToInt32(dataReader2["id_madrak_tahsili"]);
SqlCommand cmdInsert = new SqlCommand{CommandText = "insert into mojaz(sonati,felezi,sakhteshode,code_ozviat,id_sal ,id_group_employ,id_madrak_tahsili) VALUES (@sonati,@felezi,@sakhteshode,@code_ozviat,@id_sal ,@id_group_employ,@id_madrak_tahsili)"};
cmdInsert.Parameters.AddWithValue("@sonati", mojaz_txt_sonati.Text);
cmdInsert.Parameters.AddWithValue("@felezi", mojaz_txt_felezi.Text);
cmdInsert.Parameters.AddWithValue("@sakhteshode", mojaz_txt_sakhte_shode.Text);
cmdInsert.Parameters.AddWithValue("@code_ozviat",m yCodeOzviat);
cmdInsert.Parameters.AddWithValue("@id_sal", mojaz_cmb_sal.SelectedValue);
cmdInsert.Parameters.AddWithValue("@id_group_emplo y", myidGroup);
cmdInsert.Parameters.AddWithValue("@id_madrak_tahs ili", myidMadrak);
cmdInsert.Connection = con;
cmdInsert.ExecuteNonQuery();
cmdInsert.Parameters.Clear();
}

MessageBox.Show("اطلاعات با موفقیت ثبت گردید", "توجه");
refresh_dgv_mojaz();

}//using

}//else if

con.Close();

}//end block button

rayson
سه شنبه 22 مرداد 1392, 18:59 عصر
سلام دوستان مشکل حل شد.
دلیل : تداخل اتصال در کانکت بود زیرا از یک کانکشن استفاده کردم.
همان مثال شیر و لوله کارساز بود یعنی من از یک کانکشن برای خواندن اطلاعات استفاده کردم و یک کانکشن برای درج اطلاعات درون جدول ها و مشکل برطرف شد.
گفتم بگم که کسی اگر خواست استفاده کند.
با تشکر از همه.

Mahmoud.Afrad
سه شنبه 22 مرداد 1392, 20:03 عصر
سلام دوستان مشکل حل شد.
دلیل : تداخل اتصال در کانکت بود زیرا از یک کانکشن استفاده کردم.
همان مثال شیر و لوله کارساز بود یعنی من از یک کانکشن برای خواندن اطلاعات استفاده کردم و یک کانکشن برای درج اطلاعات درون جدول ها و مشکل برطرف شد.
گفتم بگم که کسی اگر خواست استفاده کند.
با تشکر از همه.
ربطی به این نداره شما با یک کانکشن باز هم میتونی سلکت و اینزرت متوالی داشته باشی. قبل از باز و بسته کردن کانکشن ، وضعیت کانکشن رو تست کن. در انتها کانکشن رو باز هم با چک کردن وضعیت ، ببند.


میتونی همه اینکارها رو با یک کوئری انجام بدی. به جای Values دستور سلکت رو بنویس.
همچنین کافیه در شرط ها قسمت مورد نیاز رو به کوئری اضافه کنی.

SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\data computer.org\Documents\Visual Studio 2010\Projects\SNM\SNM\sm.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
SqlCommand cmd = new SqlCommand
{
Connection = con,
CommandText =
@"insert into mojaz(sonati,felezi,sakhteshode,id_sal,code_ozviat ,id_group_employ,id_madrak_tahsili)
select @sonati,@felezi,@sakhteshode,@id_sal,"
};
if (mojaz_chb_all_employ.Checked == false)
{
cmd.CommandText +=
@"@code_ozviat , id_group_employ, id_madrak_tahsili
from employ where code_ozviat=@code_ozviat";
}
else
{
if (mojaz_chk_group.Checked == true && mojaz_chk_madrak.Checked == false)
{
cmd.CommandText +=
@" code_ozviat, id_group_employ, id_madrak_tahsili
from employ where id_group_employ=@id_group_employ ";
}
}

cmd.Parameters.AddWithValue("@code_ozviat", mojaz_txt_code_ozviat.Text);
cmd.Parameters.AddWithValue("@sonati", mojaz_txt_sonati.Text);
cmd.Parameters.AddWithValue("@felezi", mojaz_txt_felezi.Text);
cmd.Parameters.AddWithValue("@sakhteshode", mojaz_txt_sakhte_shode.Text);
cmd.Parameters.AddWithValue("@code_ozviat", mojaz_txt_code_ozviat.Text);
cmd.Parameters.AddWithValue("@id_sal", mojaz_cmb_sal.SelectedValue);
cmd.Parameters.AddWithValue("@id_group_employ", mojaz_cmb_group.SelectedValue);

con.Open();
int flag = cmd.ExecuteNonQuery();
con.Close();
if (flag > 0)
{
MessageBox.Show("اطلاعات با موفقیت ثبت گردید", "توجه");
refresh_dgv_mojaz();
}
else
{
MessageBox.Show(" کد عضویت و یا کد گروه موجود نمی باشد", "توجه");
}