PDA

View Full Version : چگونگی نوشتن Update و Insert در یک Button



*Ashrafi*
پنج شنبه 29 تیر 1391, 11:24 صبح
سلام دوستان من یک فرم دارم به شکل زیر که دیتابیسش اکسسه وقتی کاربرروی گریدکلیک میکنه اطلاعات توی تکست باکس میاداگرسطرخالی باشه تکستهاخالی می شودومیتوان اطلاعات جدیدرادرتکست باکس هااضافه کردمیخوام وقتی Add را زداگر اطلاعات وجوداشت که Updateکنداگر نه insertکند باتوجه به اینکه ContactIdدرتکست باکس هانشان داده نمی شود وبه صورتAutonumberهست چطوری میتونم اینکاروبکنم اگر کسی راهنمایی کنه ممنون میشم...

*Ashrafi*
پنج شنبه 29 تیر 1391, 12:00 عصر
نمیتونم ContactIdرودرتکست باکس نشان بدهم بایداینطوری درستش کنم این کدم برای گرفتن ContactIdنوشتم ولی جواب نگرفتم

;i = dataGridView1.SelectedCells[0].RowIndex

OleDbCommand ocom = newOleDbCommand("SELECT C.ContactId from Contacts C Where ContactId=@ContactId", ocon);

ocom.Parameters.AddWithValue("@ContactId", Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value));

*Ashrafi*
پنج شنبه 29 تیر 1391, 13:47 عصر
میشه بیشترتوضیح بدیدکه چطوری بایداینکاروبکنم؟

aslan
پنج شنبه 29 تیر 1391, 14:25 عصر
نمیتونم ContactIdرودرتکست باکس نشان بدهم

TextBox را روی فرم بذار و مخفی کن (hidden)
TextBox.Visible=false

*Ashrafi*
پنج شنبه 29 تیر 1391, 17:57 عصر
ممنون این هم راه خوبی است دوست عزیز اما مشکل من اینه که چه if تعریف کنم که این دو کار یعنی insert و update را با یک button انجام بدهم.
من برنامه update این را جدا نوشتم اما حتی update را هم به درستی انجام نمی دهد و تمام داده های جدول را هم زمان عین هم می کند.

OleDbCommand cmd2 = new OleDbCommand("UPDATE tblContact set "+"FirstName='"+txtName.Text+"',LastName='"+txtFamily.Text+"',Phone='"+txtPhone.Text+"',Mobile='"+txtMobile.Text+"',Address='"+txtAddress.Text+"'"+" where IdContact="+txtid.Text, myconnection);
cmd2.Parameters.AddWithValue("@IdContact",Convert.ToInt32(txtid.Text.Trim()));
cmd2.Parameters.AddWithValue("@FirstName", txtName.Text.Trim());
cmd2.Parameters.AddWithValue("@LastName", txtFamily.Text.Trim());
cmd2.Parameters.AddWithValue("@Phone", txtPhone.Text.Trim());
cmd2.Parameters.AddWithValue("@Mobile", txtMobile.Text.Trim());
cmd2.Parameters.AddWithValue("@Address", txtAddress.Text.Trim());
try
{
myconnection.Open();
byte X = 0;
X = (byte)cmd2.ExecuteNonQuery();

if (X != 0)
{
MessageBox.Show("عملیات انجام شد", "کاربر گرامی", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.tblContactTableAdapter.Fill(this.databaseCont actDataSet.tblContact);
}
else
{
MessageBox.Show("عملیات انجام نشد", "خطا", MessageBoxButtons.OK);
}

}
catch (Exception err)
{
MessageBox.Show("عملیات انجام نشد" + err.Message, "خطا", MessageBoxButtons.OK);
}
finally
{
myconnection.Close();
cmd2.Dispose();
}

aslan
پنج شنبه 29 تیر 1391, 19:43 عصر
ساده است
اگر textbox مخفی شده مقدار داشت پس Update
اگر مقدار نداشت پس Insert

بشرطیکه با هر بار کلیک بر روی ردیفهای گرید تکست باکس نیز با مقدار contactid پر بشه

در ضمن وقتی پارامتر تعریف کردی در query نیز از پارامترها استفاده کنید نه مقدار تکست باکس ها
بدینصورت FirstName=@FirstName , ...............

*Ashrafi*
پنج شنبه 29 تیر 1391, 22:09 عصر
این کار را هم تست کردم دوست عزیز با پارامتر که می نویسم این خطا را می دهد!!
فکر کنم دیتا بیس access با دستورات sql مشکل دارد.

aslan
پنج شنبه 29 تیر 1391, 23:47 عصر
لطفا کدتون را اینجا بذارین ( اصلاح شده کد پست 7 ) - به احتمال زیاد query تون از نظر Datat Type مشکل داره

*Ashrafi*
جمعه 30 تیر 1391, 09:43 صبح
این کل کد هایی است که برای این button نوشتم دوست عزیز.

if (txtid.Text=="")

{
myconnection.Open();
OleDbCommand cmd3 = new OleDbCommand("insert into tblContact(FirstName,LastName,Phone,Mobile,Address ) VALUES(@FirstName,@LastName,@Phone,@Mobile,@Addres s)", myconnection);

cmd3.Parameters.AddWithValue("@FirstName", txtName.Text.Trim());
cmd3.Parameters.AddWithValue("@LastName", txtFamily.Text.Trim());
cmd3.Parameters.AddWithValue("@Phone", txtPhone.Text.Trim());
cmd3.Parameters.AddWithValue("@Mobile", txtMobile.Text.Trim());
cmd3.Parameters.AddWithValue("@Address", txtAddress.Text.Trim());


int z = 0;
z = cmd3.ExecuteNonQuery();

if (z != 0)
{
MessageBox.Show("!داده ها با موفقیت ثبت شد", "ثبت داده");
}
else
{
MessageBox.Show("!داده ها با موفقیت ثبت نشد", "ثبت داده");

}
myconnection.Close();
cmd3.Dispose();
}
else
{
OleDbCommand cmd2 = new OleDbCommand("UPDATE tblContact set FirstName=@FirstName,LastName=@LastName,Phone=@Pho ne,Mobile=@Mobile,Address=@Address where IdContact=@IdContact", myconnection);
cmd2.Parameters.AddWithValue("@IdContact", Convert.ToInt32(txtid.Text.Trim()));
cmd2.Parameters.AddWithValue("@FirstName", txtName.Text.Trim());
cmd2.Parameters.AddWithValue("@LastName", txtFamily.Text.Trim());
cmd2.Parameters.AddWithValue("@Phone", txtPhone.Text.Trim());
cmd2.Parameters.AddWithValue("@Mobile", txtMobile.Text.Trim());
cmd2.Parameters.AddWithValue("@Address", txtAddress.Text.Trim());
try
{
myconnection.Open();
byte X = 0;
X = (byte)cmd2.ExecuteNonQuery();

if (X != 0)
{
MessageBox.Show("عملیات انجام شد", "کاربر گرامی", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.tblContactTableAdapter.Fill(this.databaseCont actDataSet.tblContact);
}
else
{
MessageBox.Show("عملیات انجام نشد", "خطا", MessageBoxButtons.OK);
}

}
catch (Exception err)
{
MessageBox.Show("عملیات انجام نشد" + err.Message, "خطا", MessageBoxButtons.OK);
}
finally
{
myconnection.Close();
cmd2.Dispose();
}
}

veniz2008
جمعه 30 تیر 1391, 10:15 صبح
کدهاتونو اینطوری تغییر بدید:

if (txtid.Text=="")
{
OleDbCommand cmd3 = new OleDbCommand("insert into tblContact(FirstName,LastName,Phone,Mobile,Address ) VALUES(@FirstName,@LastName,@Phone,@Mobile,@Addres s)", myconnection);

cmd3.Parameters.AddWithValue("@FirstName", txtName.Text.Trim());
cmd3.Parameters.AddWithValue("@LastName", txtFamily.Text.Trim());
cmd3.Parameters.AddWithValue("@Phone", txtPhone.Text.Trim());
cmd3.Parameters.AddWithValue("@Mobile", txtMobile.Text.Trim());
cmd3.Parameters.AddWithValue("@Address", txtAddress.Text.Trim());
myconnection.Open();
cmd3.ExecuteNonQuery();
myconnection.Close();
MessageBox.Show("!داده ها با موفقیت ثبت شد", "ثبت داده");
cmd3.Dispose();
}
else
{
try
{
OleDbCommand cmd2 = new OleDbCommand("UPDATE tblContact set FirstName=@FirstName,LastName=@LastName,Phone=@Pho ne,Mobile=@Mobile,Address=@Address where IdContact=@IdContact", myconnection);
cmd2.Parameters.AddWithValue("@IdContact", Convert.ToInt32(txtid.Text.Trim()));
cmd2.Parameters.AddWithValue("@FirstName", txtName.Text.Trim());
cmd2.Parameters.AddWithValue("@LastName", txtFamily.Text.Trim());
cmd2.Parameters.AddWithValue("@Phone", txtPhone.Text.Trim());
cmd2.Parameters.AddWithValue("@Mobile", txtMobile.Text.Trim());
cmd2.Parameters.AddWithValue("@Address", txtAddress.Text.Trim());
myconnection.Open();
cmd2.ExecuteNonQuery();
MessageBox.Show("عملیات انجام شد", "کاربر گرامی", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.tblContactTableAdapter.Fill(this.databaseCont actDataSet.tblContact);
}
catch (Exception err)
{
MessageBox.Show("عملیات انجام نشد" + err.Message, "خطا", MessageBoxButtons.OK);
}
finally
{
myconnection.Close();
cmd2.Dispose();
}
}
موفق باشید.

*Ashrafi*
جمعه 30 تیر 1391, 10:25 صبح
سلام
ممنون از پاسختون دوست عزیز
اما از خط آخر
cmd2.Dispose();
error می گیره اما اونم که جاش را تغییر دادم بازم همون خطا دفعه پیش را می دهد متاسفانه:ناراحت:

Nima_kyan
جمعه 30 تیر 1391, 10:31 صبح
والبته مينونيد به جاي استفاده از يك textbox و مخفي كردن اون كه قطعا راه حل استانداردي نيست از يك متغيير استفاده كنيد.
و در مورد خطاي جديدتون يك بار بدون cmd2.Dispose امتحان كنيد. يعني اين خط رو اصلا حذف كنيد.

*Ashrafi*
جمعه 30 تیر 1391, 11:13 صبح
میشه بیشتر توضیح بدید دوست عزیز
در داخل آن متغییر چه چیزی را بریزیم؟

Nima_kyan
جمعه 30 تیر 1391, 11:36 صبح
میشه بیشتر توضیح بدید دوست عزیز
در داخل آن متغییر چه چیزی را بریزیم؟
يه متغيير از نوع رشته در نظر بگيريد(با مقدار اوليه "" يعني خالي باشه) بعدش زماني كه روي Gridview كليك ميكني مقدار فيلد contactid را در اين متغيير ميريزي و بعد اون در شرطت بررسي ميكني اگر مقدار متغيير مخالف "" بود كه insert ميكنه درغير اينصورت update كنه.

*Ashrafi*
جمعه 30 تیر 1391, 11:46 صبح
دوست عزیز من راه حل شما را هم تست کردم راه خوبی است اما در هر صورت آن خطا را می دهد:ناراحت:

i = dataGridView1.SelectedCells[0].RowIndex;
string id = dataGridView1.Rows[i].Cells[0].Value.ToString();
if (id=="")

aslan
جمعه 30 تیر 1391, 13:37 عصر
MSDN says:

The OLE DB .NET Provider does not support named parameters for passing parameters to an SQL statement or a stored procedure called by an OleDbCommand when CommandType is set to Text. In this case, the question mark (?) placeholder must be used. For example:

SELECT * FROM Customers WHERE CustomerID = ?

Therefore, the order in which OleDbParameter objects are added to the OleDbParameterCollection must directly correspond to the position of the question mark placeholder for the parameter in the command text.

So make it that way:

private void button1_Click(object sender, RoutedEventArgs e)
{
conn.Open();
OleDbCommand cmd = new OleDbCommand("UPDATE tbl_Fullname SET Firstname=?,Lastname=?,Middlename=? WHERE fnID=?", conn);

cmd.Parameters.Add("@firstn", OleDbType.VarChar).Value = textBox1.Text;
cmd.Parameters.Add("@lastn", OleDbType.VarChar).Value = textBox2.Text;
cmd.Parameters.Add("@midn", OleDbType.VarChar).Value = textBox3.Text;
cmd.Parameters.Add("@idn", OleDbType.VarChar).Value = textBox5.Text;
cmd.ExecuteNonQuery();
conn.Close();
}


http://stackoverflow.com/questions/7683320/edit-using-c-sharp-and-ms-access

aslan
جمعه 30 تیر 1391, 13:53 عصر
http://msdn.microsoft.com/en-us/library/xz0c5z64

*Ashrafi*
جمعه 30 تیر 1391, 15:48 عصر
دوست عزیز من کارایی که کردم رومیزارم تابیشترمتوجه کارایی که کردم بشید اینسرتش اگه تکست باکس ContactIdرااستفاده کنم کارمیکنه ولی برای آپدیت هیچ کاری نمی کنه این فایلی که میزارم ازتکست باکس استفاده نکردم و اینسرتشم مشکل داره دوست دارم یادبگیرم چطوری میشه این کارو بااستفاده از گرید انجام بدهم اگه لطف کنید و بهم بگیدمشکلم کجاست ممنونتون میشم...:اشتباه:

aslan
جمعه 30 تیر 1391, 19:47 عصر
سلام
کدهای اصلاح شده را ضمیمه میکنم . سعی کردم کمترین تغییرات را در کدهاتون اعمال کنم (و به روش کدنویسی خودتون )

Mahmoud.Afrad
جمعه 30 تیر 1391, 20:52 عصر
سلام
ممنون از پاسختون دوست عزیز
اما از خط آخر
cmd2.Dispose();
error می گیره اما اونم که جاش را تغییر دادم بازم همون خطا دفعه پیش را می دهد متاسفانه:ناراحت:
خطا به خاطر این هست که cmd2 در بلاک try تعریف شده و در بلاک finally معتبر نیست. به این صورت اصلاح کنید
OleDbCommand cmd2;
if (txtid.Text=="")
{
try
{
cmd2 = new OleDbCommand("insert into tblContact(FirstName,LastName,Phone,Mobile,Address ) VALUES(@FirstName,@LastName,@Phone,@Mobile,@Addres s)", myconnection);
cmd2.Parameters.AddWithValue("@FirstName", txtName.Text.Trim());
cmd2.Parameters.AddWithValue("@LastName", txtFamily.Text.Trim());
cmd2.Parameters.AddWithValue("@Phone", txtPhone.Text.Trim());
cmd2.Parameters.AddWithValue("@Mobile", txtMobile.Text.Trim());
cmd2.Parameters.AddWithValue("@Address", txtAddress.Text.Trim());
myconnection.Open();
cmd2.ExecuteNonQuery();
myconnection.Close();
MessageBox.Show("!داده ها با موفقیت ثبت شد", "ثبت داده");
}
catch (Exception err)
{
MessageBox.Show("عملیات انجام نشد" + err.Message, "خطا", MessageBoxButtons.OK);
}
finally
{
cmd2.Dispose();
myconnection.Close();
}
}
else
{
try
{
cmd2 = new OleDbCommand("UPDATE tblContact set FirstName=@FirstName,LastName=@LastName,Phone=@Pho ne,Mobile=@Mobile,Address=@Address where IdContact=@IdContact", myconnection);
cmd2.Parameters.AddWithValue("@IdContact", Convert.ToInt32(txtid.Text.Trim()));
cmd2.Parameters.AddWithValue("@FirstName", txtName.Text.Trim());
cmd2.Parameters.AddWithValue("@LastName", txtFamily.Text.Trim());
cmd2.Parameters.AddWithValue("@Phone", txtPhone.Text.Trim());
cmd2.Parameters.AddWithValue("@Mobile", txtMobile.Text.Trim());
cmd2.Parameters.AddWithValue("@Address", txtAddress.Text.Trim());
myconnection.Open();
cmd2.ExecuteNonQuery();
MessageBox.Show("عملیات انجام شد", "کاربر گرامی", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.tblContactTableAdapter.Fill(this.databaseCont actDataSet.tblContact);
}
catch (Exception err)
{
MessageBox.Show("عملیات انجام نشد" + err.Message, "خطا", MessageBoxButtons.OK);
}
finally
{
cmd2.Dispose();
myconnection.Close();
}
}

*Ashrafi*
جمعه 30 تیر 1391, 23:37 عصر
از کمکتون و وقتی که گذاشتین واقعاً ممنونم دوستان
من تازه کارم کداتون کار کرد اما می خواستم ببینم اگه بخواهم بدون استفاده از تکست باکس همین کار را بکنم چی بنویسم و اینکه بعد add کردن به سطر خالی giridview برود چی بنویسم؟ ممنون می شم کمکم کنید
بازم ممنونم از کمکتون
من این کدها را نوشتم اما سطر جدید را انتخاب نمی کند!

*Ashrafi*
شنبه 31 تیر 1391, 08:49 صبح
DataGridViewRow row = dataGridView1.Rows[dataGridView1.Rows.Count - 1];
row.Cells[0].Selected= true;