PDA

View Full Version : سوال: مشکل update



Milo_22
جمعه 24 مهر 1388, 11:58 صبح
با سلام به دوستان
من یک سوال دارم راجع به این کد ، من یک برنامه C#‎ دارم با پایگاه داده MySql ، برای add و delete هیچ مشکلی ندارم اما برای update ئه مقادیرم داخله دیتا بیس ام با این پیغام خطا مواجه میشم .
میشه لطفا راهنماییم کنید ؟





private void btnEdit_Click(object sender, EventArgs e)
{

// Declare local variables and objects...

MySqlCommand objCommand = new MySqlCommand();


// Set the SqlCommand object properties...
objCommand.Connection = objConnection;


objCommand.CommandText = " UPDATE person SET" +
"name=" + txtName.Text +
",'family'=" + txtFamily.Text +
",'email'=" + txtEmail.Text +
",'phonum'=" + txtPhoNum.Text +
",'pesc'=" + txtPesc.Text +
",'pass'=" + txtPass.Text +
"'WHERE id=" + txtID.Text;
objCommand.CommandType = CommandType.Text;

// Add parameters for the placeholders in the MySQL in the CommandText property...

// Parameter for the name field...
objCommand.Parameters.AddWithValue("@name",txtName.Text);
// Parameter for the family field...
objCommand.Parameters.AddWithValue("@family", txtFamily.Text);
// Parameter for the email field...
objCommand.Parameters.AddWithValue("@email",txtEmail.Text);
// Parameter for the phone number field...
objCommand.Parameters.AddWithValue("@phonum", txtPhoNum.Text);
// Parameter for the pescription field...
objCommand.Parameters.AddWithValue("@pesc", txtPesc.Text);
// Parameter for the password field...
objCommand.Parameters.AddWithValue("@pass", txtPass.Text);



// Open the connection...
objConnection.Open();
// Execute the SqlCommand object to update the data...
objCommand.ExecuteNonQuery();
// Close the connection...
objConnection.Close();

// Fill the DataSet and bind the fields...
FillDataSetAndView();
BindFields();


// Show the current record position...
ShowPosition();

// Display a message that the record was updated...
toolStripStatusLabel1.Text = "Record Updated";

}





مقداره ID داخله پایگاه دادم int هستش . ممکنه واسه اون باشه ؟

پیغام خطائی که میده اینه :




Index and length must refer to a location within the string.
Parameter name: length

sara.f
جمعه 24 مهر 1388, 12:10 عصر
سلام
خب نمیشه مقداری از نوع string را در int بریزید، ائل باید تبدیل انجام دهید و مقدار textbox را به int تبدیل کنید.

saeeedft
جمعه 24 مهر 1388, 12:40 عصر
دوست عزیز اون ID که تعریف کردی اومدی براش یک پارامتر تعریف کردی، اما موقع ارسال مقدار به پامترت هیچ مقداری رو براش ارسال نکردی، برا ID هم پارامتر بفرست

Milo_22
جمعه 24 مهر 1388, 12:44 عصر
سلام
خب نمیشه مقداری از نوع string را در int بریزید، ائل باید تبدیل انجام دهید و مقدار textbox را به int تبدیل کنید.

می دونم ولی سواله من چیزه دیگه ای بودش !
تبدیل نوع انجام دادم ، مشکل چیزه دیگه ای هست . میشه لطفا خوده code رو بررسی کنید برام ؟
چون من مشکلی توش نمی بینم . بیشتر از 10 تا حالت براش امتحان کردم ولی فایده نداشت . :عصبانی++::اشتباه:

saeeedft
جمعه 24 مهر 1388, 12:50 عصر
بازم متوجه نشدی؟

sara.f
جمعه 24 مهر 1388, 12:52 عصر
می دونم ولی سواله من چیزه دیگه ای بودش !
تبدیل نوع انجام دادم ، مشکل چیزه دیگه ای هست . میشه لطفا خوده code رو بررسی کنید برام ؟
چون من مشکلی توش نمی بینم . بیشتر از 10 تا حالت براش امتحان کردم ولی فایده نداشت . :عصبانی++::اشتباه:
دوست عزیز لطفا کدی که الان داری و می گی درستش کردی را اینجا بذار و بگو دقیقا موقع اجرا چه خطایی میده؟

Milo_22
جمعه 24 مهر 1388, 12:54 عصر
دوست عزیز اون ID که تعریف کردی اومدی براش یک پارامتر تعریف کردی، اما موقع ارسال مقدار به پامترت هیچ مقداری رو براش ارسال نکردی، برا ID هم پارامتر بفرست

تو آپ دیت پارامتر برای آی دی نفرستادم ! ولی بازم کدم رو عوض کردم بازم مشکل داشت اجرا نمیشه :گریه:




objCommand.CommandText = " UPDATE person SET" +
"name=" + txtName.Text +
",'family'=" + txtFamily.Text +
",'email'=" + txtEmail.Text +
",'phonum'=" + txtPhoNum.Text +
",'pesc'=" + txtPesc.Text +
",'pass'=" + txtPass.Text +
"'WHERE id=" + Convert.ToInt32(txtID.Text);
objCommand.CommandType = CommandType.Text;

// Add parameters for the placeholders in the MySQL in the CommandText property...

objCommand.Parameters.AddWithValue("@id", txtID.Text);
// Parameter for the name field...
objCommand.Parameters.AddWithValue("@name",txtName.Text);
// Parameter for the family field...
objCommand.Parameters.AddWithValue("@family", txtFamily.Text);
// Parameter for the email field...
objCommand.Parameters.AddWithValue("@email",txtEmail.Text);
// Parameter for the phone number field...
objCommand.Parameters.AddWithValue("@phonum", txtPhoNum.Text);
// Parameter for the pescription field...
objCommand.Parameters.AddWithValue("@pesc", txtPesc.Text);
// Parameter for the password field...
objCommand.Parameters.AddWithValue("@pass", txtPass.Text);

sara.f
جمعه 24 مهر 1388, 12:57 عصر
در ضمن شما همون که داری مقادیر فیلدهارو set می کنی، مقدارشون را مستقیما داری از textbox می گیری، چرا دیگه واسشون parameter تعریف کردی؟
اصلا این parameter ها دارن به کجا اشاره می کنن؟

Milo_22
جمعه 24 مهر 1388, 12:58 عصر
دوست عزیز لطفا کدی که الان داری و می گی درستش کردی را اینجا بذار و بگو دقیقا موقع اجرا چه خطایی میده؟

کد رو گذاشتم تو پست قبلیم
اینم خطا :


Index and length must refer to a location within the string.
Parameter name: length


اینم کد هایی که میده :


ArgumentOutOfRangeException was unhandled

Index and length must refer to a location within the string.
Parameter name: length

saeeedft
جمعه 24 مهر 1388, 12:59 عصر
در ضمن شما همون که داری مقادیر فیلدهارو set می کنی، مقدارشون را مستقیما داری از textbox می گیری، چرا دیگه واسشون parameter تعریف کردی؟
اصلا این parameter ها دارن به کجا اشاره می کنن؟
یکی از نکات جالب برنامت هم همینه که دوستمون گفت، کد تون رو درست کنید

sara.f
جمعه 24 مهر 1388, 12:59 عصر
در ضمن شما همون موقع که داری مقادیر فیلدها رو set می کنی، مقدارشون را مستقیما از textbox می گیری، چرا دیگه parameter تعریف کردی؟!!!!
اصلا این parameter ها دارن به کجا اشاره می کنن؟

Milo_22
جمعه 24 مهر 1388, 13:12 عصر
در ضمن شما همون که داری مقادیر فیلدهارو set می کنی، مقدارشون را مستقیما داری از textbox می گیری، چرا دیگه واسشون parameter تعریف کردی؟
اصلا این parameter ها دارن به کجا اشاره می کنن؟

بعد از اینکه واسه هر placeholder ای که داخله دستوره command ام نوشتم باید از parameter استفاده کنم که اینها رو داخله دیتا بیس ذخیره کنه !

sara.f
جمعه 24 مهر 1388, 13:23 عصر
بعد از اینکه واسه هر placeholder ای که داخله دستوره command ام نوشتم باید از parameter استفاده کنم که اینها رو داخله دیتا بیس ذخیره کنه !
وقتی شما داری همون موقع مقادیر را از textbox می گیری که دیگه نیازی به تعریف parameter نیست.
اگر می خوای از پارامتر استفاده کنی باید مثلا به این شکل بنویسی.


objadapter.UpdateCommand.CommandText = "update employee set fname=@fname1"
objadapter.UpdateCommand.Parameters.AddWithValue("@fname1", textBox7.Text.Trim());

Milo_22
جمعه 24 مهر 1388, 13:27 عصر
objCommand.CommandText = "UPDATE person SET Name= @name , Family=@family , Email= @email , Phone Number = @phonum , Pescription = @pesc , Password = @pass " +
"WHERE ID ="+ txtID.Text;این طوری که می نویسم میگه :


Fatal error encountered during command execution.

Milo_22
جمعه 24 مهر 1388, 13:37 عصر
این شکلی ام نوشتم :

objDataAdapter.UpdateCommand.CommandText = "UPDATE person SET Name= @name , Family=@family , Email= @email , Phone Number = @phonum , Pescription = @pesc , Password = @pass " +
"WHERE ID =" + Convert.ToInt32(txtID.Text) ;

این خطا رو داد :


Object reference not set to an instance of an object.

saeeedft
جمعه 24 مهر 1388, 13:44 عصر
کدت رو با دقت ررسی کن،اون پارامترهای اول رو حذف کن(منظورم TEXTBOX ها هست) به جای TEXTBOX ها بیا یه نام برا پارامترهات تعریف کن بعد توسط همون objparameter اونا رو مقدار دهی کن و بعد اجراش کن، اگه باز error داد حتما یه جا یه چیز کم گذاشتی،اگه دقت کنی این دستور اجرا میشه، پس اول تعریف دستور ابدیت و دادن پارامتر به اون، بعد دادن مقدار به اون و در نهایت هم اجرای اون دستور، اون کدی که شما اول گذاشته بودی به نظر من به اشتباه بود(قسمت های اضافی رو حذف کنید و این کارایی که گفتم رو اجرا کنید،اگه بازم error داد کدهای اصلاح شدتون رو بذارید تا اگه تونشتم کمکتون کنم))

sara.f
جمعه 24 مهر 1388, 13:58 عصر
objCommand.CommandText = "UPDATE person SET Name= @name , Family=@family , Email= @email , Phone Number = @phonum , Pescription = @pesc , Password = @pass " +
"WHERE ID ="+ txtID.Text;این طوری که می نویسم میگه :


Fatal error encountered during command execution.
کد اولیه شما اضافی زیاد داشت، من الان کدی را که شبیه کد شما بود را با حذف اضافی ها بر روی database خودم اجرا کردم و جواب داد، براتون میذارمش و با فیلدهای خودتون تغییرش بدید.


try
{
SqlCommand objcom=new SqlCommand();
objcom.CommandText="update employee set fname=@fname1, lname=@lname1 "
+ ", position=@position1 ,office=@office1 where code=@code1";
objcom.Parameters.AddWithValue("@code1", dataGridView2.SelectedCells[0].Value);
objcom.Parameters.AddWithValue("@fname1", textBox7.Text.Trim());
objcom.Parameters.AddWithValue("@lname1", textBox8.Text.Trim());
objcom.Parameters.AddWithValue("@position1", textBox9.Text.Trim());
objcom.Parameters.AddWithValue("@office1", textBox10.Text.Trim());
objcom.Connection=objconn;
objconn.Open();
objcom.ExecuteNonQuery();
objconn.Close();
Form4_Load(sender, e);
MessageBox.Show("اطلاعات با موفقیت ثبت شد");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
objconn.Close();
}

Milo_22
جمعه 24 مهر 1388, 14:02 عصر
objDataAdapter.UpdateCommand.CommandText = "UPDATE person SET Name= @name , Family=@family , Email= @email , Phone Number = @phonum , Pescription = @pesc , Password = @pass " +
"WHERE ID =@id" ;


objCommand.CommandType = CommandType.Text;



// Parameter for the name field...
objCommand.Parameters.AddWithValue("@name",txtName.Text);
// Parameter for the family field...
objCommand.Parameters.AddWithValue("@family", txtFamily.Text);
// Parameter for the email field...
objCommand.Parameters.AddWithValue("@email",txtEmail.Text);
// Parameter for the phone number field...
objCommand.Parameters.AddWithValue("@phonum", txtPhoNum.Text);
// Parameter for the pescription field...
objCommand.Parameters.AddWithValue("@pesc", txtPesc.Text);
// Parameter for the password field...
objCommand.Parameters.AddWithValue("@pass", txtPass.Text);

saeeedft
جمعه 24 مهر 1388, 14:07 عصر
خب حالا باید اجراش کنی، برا اون هم کدش رو بنویس،به صورت زیر


objconnection.open()
objcommand.ExecutenonQuery();
objconnection.close()

ابن کد رو به کد بالات اضافه کن

sara.f
جمعه 24 مهر 1388, 14:14 عصر
objDataAdapter.UpdateCommand.CommandText = "UPDATE person SET Name= @name , Family=@family , Email= @email , Phone Number = @phonum , Pescription = @pesc , Password = @pass " +



"WHERE ID =@id" ;


objCommand.CommandType = CommandType.Text;



// Parameter for the name field...
objCommand.Parameters.AddWithValue("@name",txtName.Text);
// Parameter for the family field...
objCommand.Parameters.AddWithValue("@family", txtFamily.Text);
// Parameter for the email field...
objCommand.Parameters.AddWithValue("@email",txtEmail.Text);
// Parameter for the phone number field...
objCommand.Parameters.AddWithValue("@phonum", txtPhoNum.Text);
// Parameter for the pescription field...
objCommand.Parameters.AddWithValue("@pesc", txtPesc.Text);
// Parameter for the password field...
objCommand.Parameters.AddWithValue("@pass", txtPass.Text);


این کد اشتباهه
اگر از SqlDataAdapter می خوای استفاده کنی، باید در مقدار دهی پارمترهات هم ازش استفاده کنی.
همون کدی که بدون SqlDataAdapter نوشته بودی را درستش را گذاشتم که!!! چرا امتحانش نمی کنی؟

Milo_22
جمعه 24 مهر 1388, 14:23 عصر
کد اولیه شما اضافی زیاد داشت، من الان کدی را که شبیه کد شما بود را با حذف اضافی ها بر روی database خودم اجرا کردم و جواب داد، براتون میذارمش و با فیلدهای خودتون تغییرش بدید.


try
{
SqlCommand objcom=newSqlCommand();
objcom.CommandText="update employee set fname=@fname1, lname=@lname1 "
+ ", position=@position1 ,office=@office1 where code=@code1";
objcom.Parameters.AddWithValue("@code1", dataGridView2.SelectedCells[0].Value);
objcom.Parameters.AddWithValue("@fname1", textBox7.Text.Trim());
objcom.Parameters.AddWithValue("@lname1", textBox8.Text.Trim());
objcom.Parameters.AddWithValue("@position1", textBox9.Text.Trim());
objcom.Parameters.AddWithValue("@office1", textBox10.Text.Trim());
objcom.Connection=objconn;
objconn.Open();
objcom.ExecuteNonQuery();
objconn.Close();
Form4_Load(sender, e);
MessageBox.Show("اطلاعات با موفقیت ثبت شد");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
objconn.Close();
}





ممنون ولی این کده شما واسه sql هست ! من که گفتم پایگاه دادم mysql ئه ! بد یک نکته دیگه اینکه شما از datagridview استفاده کردین . من اصلا نمی خوام تو جدول داده هام رو نمایش بدم ! قراره داخله همون فرم اطالاعات تغییر کنه و بدش هم داخله دیتا بیس ذخیره بشه ...

ولی کدی رو نوشته بودید با توجه به برنامه خودم اصلاح کردم ولی جواب نداد :


try
{
MySqlCommand objcom = new MySqlCommand();
objcom.CommandText = "update person set Name=@name, Family=@family "
+ ", Email=@email ,Phone Number =@phonum , Pescription=@pesc , Password=@pass where ID =@id";
objcom.Parameters.AddWithValue("@name", txtName.Text);
objcom.Parameters.AddWithValue("@family", txtFamily.Text);
objcom.Parameters.AddWithValue("@email", txtEmail.Text);
objcom.Parameters.AddWithValue("@phonum", txtPhoNum.Text);
objcom.Parameters.AddWithValue("@pesc", txtPesc.Text);
objcom.Parameters.AddWithValue("@pass", txtPass.Text);
objcom.Connection = objConnection;
objConnection.Open();

objcom.ExecuteNonQuery();
objConnection.Close();
Form1_Load(sender, e);
MessageBox.Show("اطلاعات با موفقیت ثبت شد");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
objConnection.Close();
}


پیفام خطا ش هم اینه :


Fatal error encountered during command execution

Milo_22
جمعه 24 مهر 1388, 14:25 عصر
خب حالا باید اجراش کنی، برا اون هم کدش رو بنویس،به صورت زیر


objconnection.open()
objcommand.ExecutenonQuery();
objconnection.close()
ابن کد رو به کد بالات اضافه کن


جواب نداد :ناراحت:

saeeedft
جمعه 24 مهر 1388, 14:25 عصر
اقا تو کد بالا شما هنوز هم به id مقدار پارامتر نفرستادید، به id هم مقدار پارامتر رو بفرستید، مگه با خودشه ،باید اجرا شه:قهقهه:

saeeedft
جمعه 24 مهر 1388, 14:35 عصر
میدونید مشکل اصلی کجاست،فقط اون id هست،شما مگه شرط ابدیتتون این نیست که بر اساس فیلد id ابدیت بشه،حالا باید یه مقدار به اون id پاس بدید،شما تو اینجا همچین کاری رو انجام ندادید،این کارو کنید حتما مشکلتون حل میشه

sara.f
جمعه 24 مهر 1388, 14:50 عصر
ممنون ولی این کده شما واسه sql هست ! من که گفتم پایگاه دادم mysql ئه ! بد یک نکته دیگه اینکه شما از datagridview استفاده کردین . من اصلا نمی خوام تو جدول داده هام رو نمایش بدم ! قراره داخله همون فرم اطالاعات تغییر کنه و بدش هم داخله دیتا بیس ذخیره بشه ...

ولی کدی رو نوشته بودید با توجه به برنامه خودم اصلاح کردم ولی جواب نداد

شما می تونید از دیتا گرید ویو استفاده نکنید، این که مشکلی ایجاد نمی کنه.
در ضمن اگر دقت کرده بودید، من در کدم مقدار کد را که به عنوان شرط where قرار داده ام را مقدار دهی کردم ولی شما اصلا هیچ مقداری برای آن تعریف نکردید. دوستمون saeeedft درست می گه، باید مقدار id را هم مشخص کنی .
یه سوال شما ID را اتوماتیک تعریف کردی؟
چطوری مقدار ID را دریافت می کنی؟

Milo_22
جمعه 24 مهر 1388, 15:06 عصر
آی دی به صورت اتوماتیک داخل فرم پر میشه ، کاربر نه می تونه اون رو ویرایش کنه و نه می تونه اون رو ایجاد کنه ! من با مقداره id هم دستورم رو تست کردم ولی بازم جواب نمیده . ..

saeeedft
جمعه 24 مهر 1388, 15:13 عصر
خب حالا شد، شما بیا اون کد رو اول به دست بیار با یه دستور sql،بعد اون پارامتر رو برابر اون قرار بده،مشکل حل میشه

sara.f
جمعه 24 مهر 1388, 16:01 عصر
آی دی به صورت اتوماتیک داخل فرم پر میشه ، کاربر نه می تونه اون رو ویرایش کنه و نه می تونه اون رو ایجاد کنه ! من با مقداره id هم دستورم رو تست کردم ولی بازم جواب نمیده . ..
خب در دستور update مقدار ID را از کجا می گیرید؟

saeeedft
جمعه 24 مهر 1388, 18:36 عصر
شما یک دستور sql مینویسید که در ان فقط id برگردانده میشود، حالا اون مقدار رو به عنوان مقدار برای پارامتر id میفرستید،مشکلی بود بگید،بیشتر توضیح میدم

Milo_22
جمعه 24 مهر 1388, 21:38 عصر
شما یک دستور sql مینویسید که در ان فقط id برگردانده میشود، حالا اون مقدار رو به عنوان مقدار برای پارامتر id میفرستید،مشکلی بود بگید،بیشتر توضیح میدم

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

Milo_22
جمعه 24 مهر 1388, 21:39 عصر
خب در دستور update مقدار ID را از کجا می گیرید؟


از داخله همون تکست باکس اش . :افسرده:

sara.f
جمعه 24 مهر 1388, 21:47 عصر
از داخله همون تکست باکس اش . :افسرده:
مگه نمی گید مقدار ID اتوماتیک هست، پس چطوری خودت مقدارش را در textbox وارد می کنی؟
اگر هم منظورت این هست که ID را از database در textbox می ریزی، خب پس دیگه نباید مشکلی داشته باشی.

saeeedft
جمعه 24 مهر 1388, 22:35 عصر
ببینید شما برای اینکه عمل ابدیت رو انجام بدیدباید حتما داده هاتونو یه جا (حالا تو دیتا گرید یا textbox )نشون بدید،چون غیر اینکه نمیشه(بلاخره عمل ابدیت روی یه چیزی باید انجام بشه)،شما دقیقا به چه طریق میخواهید ابدیت انجام بشه؟
این دادهاتون تو چه چیزی نمایش داده میشن؟ اینو مشخص کنید تا دقیقا بگم چه کار کنید..........راه حل بالا برا زمانی هست که دادها تو textbox هستند،شما دقیق بگید چه جور به دادهاتون دسترسی دارید تا اگه تونستم بیشتر راهنمایی کنم

Milo_22
جمعه 24 مهر 1388, 22:46 عصر
عکس فرم ام رو گذاشتم ! ببینید من همه اطلاعاتم رو داخل تکست باکس ها میبینم ! و همونجا هم تغییر می دم .

saeeedft
جمعه 24 مهر 1388, 23:03 عصر
خب طبق این نیاز به اون چیزی که من میخواستم به شما بگم هم نیست،شما مقدار id رو به پارامتر id که تعریف کردید بدید، برنامه هیچ errr ای نباید بده،شما عکسم هم دارید؟ اگه عکس دارید عکس رو هم ابدیت کنید ببینید بازم error میده

Milo_22
شنبه 25 مهر 1388, 21:36 عصر
MySqlCommand objCommand = new MySqlCommand();


// Set the SqlCommand object properties...
objCommand.Connection = objConnection;

objCommand.CommandText = "UPDATE person SET `ID` = @id ,`Name`= @name , `Family`= @family , `Email`= @email , `Phone Number`= @phonum , `Pescription`= @pesc , `Password`= @pass " +
"WHERE ID ="+ txtID.Text ;


objCommand.CommandType = CommandType.Text;

// // Add parameters for the placeholders in the MySQL in the CommandText property...

objCommand.Parameters.AddWithValue("@id",Convert.ToInt32(txtID.Text));
// Parameter for the name field...
objCommand.Parameters.AddWithValue("@name", txtName.Text);
// Parameter for the family field...
objCommand.Parameters.AddWithValue("@family", txtFamily.Text);
// Parameter for the email field...
objCommand.Parameters.AddWithValue("@email", txtEmail.Text);
// Parameter for the phone number field...
objCommand.Parameters.AddWithValue("@phonum", Convert.ToInt32(txtPhoNum.Text));
// Parameter for the pescription field...
objCommand.Parameters.AddWithValue("@pesc", txtPesc.Text);
// Parameter for the password field...
objCommand.Parameters.AddWithValue("@pass", txtPass.Text);

// Open the connection...
objConnection.Open();

// Execute the SqlCommand object to update the data...
objCommand.ExecuteNonQuery();

// Close the connection...
objConnection.Close();


مشکل حل شد ممنون ...