PDA

View Full Version : سوال: اطلاعات آپدیت نمی شود (اجرا بدون ارور)



میلاد قاضی پور
چهارشنبه 19 خرداد 1389, 11:23 صبح
سلام . این کد وقتی اجرا میشه باید اطلاعاتم بروز بشه ولی نمیشه و هیچ پیغام خطایی هم داده نمیشه . این کدی که اجرا میشه :







rwd.daUpdate("update users set ([name]='" + textBox1_name.Text + "',"
+ "[lname]='" + textBox2_lname.Text + "',"
+ "[semat]='" + textBox5_job.Text + "',"
+ "[pass]='" + textBox4_pass.Text + "',"
+ "[sabtkonande]='" + textBox6_sabtkonande.Text + "',"
+ "[image]=" + mStream.GetBuffer()
+ " where [username]='" + textBox3_uname.Text + "')");





تابعی که فراخونده میشه:






public void daUpdate(string updCommand)
{
adapt = new SqlDataAdapter();
command = new SqlCommand(updCommand, connection);
adapt.UpdateCommand = command;
}







خاطر نشان میکنم که اون تابع در کلاسی به نام readwritedata هست که ازون کلاس نمونه ای ایجاد و تابعش فراخوانده شده

Open-Source
چهارشنبه 19 خرداد 1389, 11:47 صبح
چرا کدت رو به این صورت مینویسی که احتمال خطا رو بالا میبره.
از Parameters استفاده کن.

cardano7
چهارشنبه 19 خرداد 1389, 11:55 صبح
سلام
1- آیا Error هم میده؟
2- از کجا می دونید Update نمی شه؟ آیا با برنامه ی خودتون چک می کنید یا از خارج اون؟(ممکنه ایراد از Load نکردن درست اطلاعات جدید باشه)

sds1920
چهارشنبه 19 خرداد 1389, 15:19 عصر
توي اين كدي كه نوشتيد هيچ ايرادي نيست به جز اينكه Connection باز نيست.
اگه شما ديتابيس رو به پروژه Attach كرديد بايد بگم كه اين ديتابيس به دو قسمت اضافه مي شه.يكي در قسمت پروژه و يكي هم در قسمت Debug برنامه.ديتابيسي كه در قسمت پروژه هست هميشه به صورتي خام يا بدون تغيير باقي مي مونه.تغييراتي كه در بانك مي ديد در بانكي كه در قسمت Debug هست وارد مي شه.اما مسئله اينجاست كه بعد از هر بار كامپايل شدن ديتابيس قسمت پروژه كه خام هست كپي شده و به جاي ديتابيسي كه در قسمت Debug هست قرار مي گيره.براي همين ممكنه تغييرات پاك بشه.

میلاد قاضی پور
چهارشنبه 19 خرداد 1389, 16:13 عصر
با تشکر از همه دوستان :
اوپن سورس عزیز من قبلا با پارامیترز می نوشتم یه نفر گفت اینجوری اصولی تره .
کاردانوی گرامی اروری در کار نیست . من داده های دیتابیسم رو برررسی میکنم .





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

sds1920
چهارشنبه 19 خرداد 1389, 16:58 عصر
شما ميگيد ثبت مي شه ولي نمايش داده نمي شه.پس بايد مشكل از دستور SELECT باشه نه UPDATE.

میلاد قاضی پور
چهارشنبه 19 خرداد 1389, 17:25 عصر
ما را به دستور سلکت چکار ؟ من کجا باید از سلکت استفاده کنم . آیا باید قبل از آپدیت فیلدها رو سلکت کنم ؟

sds1920
چهارشنبه 19 خرداد 1389, 17:31 عصر
حالا فهميدم.دوست عزيز شما اصلا تابع adapt.UpdateCommand.ExcuteNoneQuery() رو فراخواني نكرديد.

میلاد قاضی پور
چهارشنبه 19 خرداد 1389, 20:57 عصر
:لبخند:قربون شکلت اصلا تعارف نکن بگو چقد پیاده شم . جون دادا بگو .
مسأله برطرف شد . حالا یک ارور روی همون اکسکیوتنونکوئری وجود داره :

Incorrect syntax near '('.
An object or column name is missing or empty. For SELECT INTO statements, verify each column has a name. For other statements, look for empty alias names. Aliases defined as "" or [] are not allowed. Add a name or single space as the alias name.

behnam25214
چهارشنبه 19 خرداد 1389, 23:25 عصر
مشکل در دستور SQL ات هست که نوشتی !

میلاد قاضی پور
پنج شنبه 20 خرداد 1389, 01:13 صبح
میدونم اما هرچقدر دقت میکنم مورد مورد داری نمیبینم . فکر کنم میگه یکی از فیلدها مقدار نداره . یعنی ممکنه همه فیلدها مقدار نداشته باشن . نمیدونم چجوریاس!

behnam25214
پنج شنبه 20 خرداد 1389, 11:27 صبح
میگه فیلدهات خالی!فقط برای name از [] استفاده کن.میگه یک فضای خالی هم برای name وجود داره.به پرانتز هم که انگار گیر داده.

به نظر من اگه از Parameters استفاده کنی خیلی بهتره!از این روشت هم خوب هست.(البته نظر خودم رو گفتم):قلب:

میلاد قاضی پور
پنج شنبه 20 خرداد 1389, 12:48 عصر
خب من دارم سعی میکنم از پارامیترز استفاده کنم . ولی کاش روشی میبود که بتونم براش تابع بنویسم . البته برای اینم میشه اما اگه خواستم برا کسی توضیح بدم کابوس میشه . یعنی این مشکل نذاشته خواب تو چشام بره . دیشب خواب دیدم استاد شدم دارم به دانشجوها دستور آپدیت درس میدم . :)))

behnam25214
پنج شنبه 20 خرداد 1389, 13:04 عصر
حالا این مشکلت حل شد یانه.!؟

میلاد قاضی پور
پنج شنبه 20 خرداد 1389, 15:39 عصر
متأسفانه فعلا نه . با روشپارامتر ها میخوام بنویسم بدین صورت که یک تابع در همون کلاسم مینویسم که دو تا آرایه رشته ای میگیره . یکی شامل عناوین فیلدها و یکی شامل مقادیر مربوطه . بعد با یک فور بهتعداد عناصر آرایه ها پارامتر اضافه میشه و برابر با آیتمهای آرایه دوم قرار داده میشه . میدونید من میخوام در پروژه های دیگه هم این کلاس رو استفاده کنم برای همین میخوام ترجیحا همه چی تو توابع باشه .

sds1920
پنج شنبه 20 خرداد 1389, 15:56 عصر
اول اسم جدولت رو بين دوتا ` (كليد پ فارسي)قرار بده ببين درست مي شه يا نه؟
اگه نشد چك كن ببين Buffer خالي نباشه.

میلاد قاضی پور
پنج شنبه 20 خرداد 1389, 16:27 عصر
امکان نداره بافر خالی باشه . با مسیج باکس مقدار همشونو چک کردم . حتی اون قسمت مربوط به ایمیج رو هم حذف کردم . کوت ها رو هم حذف کردم . احتمالا مایکروسافت یادش رفته اونجاشو درست کنه .

sds1920
پنج شنبه 20 خرداد 1389, 16:35 عصر
وقتي يه برنامه به اين مشكل بخوره بهترين راه Trace كردن با F10 هست.
حالا كه ديگه اينقدر اين مشكل زيگيل شده بيا يكي يكي خطل ها رو بررسي كن ببين مشكل از كجاست.
(در ضمن براي راحتي در Trace كردن از BreakPoint استفاده كن)

میلاد قاضی پور
پنج شنبه 20 خرداد 1389, 19:42 عصر
اینکارو کردم عزیز. هیچ جا ارور نداره . درست میاد روی اگزکیوتنونکوئری لنگر میندازه . از همه مچکرم حالا یه وخ دیدی ویندوزمو عوض کردم درست شد :دی . اگه راه حلشو پیدا کردم اینجا اعلام میکنم .

میلاد قاضی پور
شنبه 22 خرداد 1389, 01:22 صبح
خب همونطور که قول داده بودم اومدم تانحوه حل کردن مشکلمو گزارش بدم تا اگر روزی کسی به این مصیبت خدای نکرده دچار شد مثل من علاف نشه . ابتدا این راه حل رو امتحان کردم و جوابی نگرفتم . تابع رو توی کلاس مربوطه نوشتم :



public void UPD(string[] fields, string[] values, string tableName,string updCommand)
{

command.Connection = connection;
command.CommandText = updCommand;

for (int i = 0; i < fields.Length; i++)
{
command.Parameters.AddWithValue("@"+fields[i].ToString(), values[i]);
}
connection.Open();
command.ExecuteNonQuery();
connection.Close();

بعد به این صورت فراخوانی شد :




string[] flds=new string[5];
flds[0] = "name";
flds[1] = "lname";
flds[2] = "semat";
flds[3] = "pass";
flds[4] = "sabtkonande";

string[] vals=new string[5];
vals[0] = textBox1_name.Text;
vals[1] = textBox2_lname.Text;
vals[2] = textBox5_job.Text;
vals[3] = textBox4_pass.Text;
vals[4] = textBox6_sabtkonande.Text;


rwd.UPD(flds, vals, "users",
"update users set name=@name,lname=@lname,"
+ "semat=@semat,pass=@pass,sabtkonande=@sabtkonande"
+",image="+mStream.GetBuffer()+" where username="+textBox3_uname.Text);

همونطور که گفتم این کد هم کار نکرد و ارور دقیقا همون ارور کد قبلی بود . راه دیگه ای به ذهنم نرسید جز اینکه بزرگترین جنایت دنیای برنامه نویسی رو مرتکب بشم که باعث شد کد باتونم به این شکل در بیاد :




private void button_sabtekarbar_Click(object sender, EventArgs e)
{
MemoryStream mStream = new MemoryStream();
pictureBox1.Image.Save(mStream, ImageFormat.Gif);
if (textBox4_pass.Text == textBox7_confPass.Text)
{
if (isUpdateForm == false)
{

//byte[] pic = ReadFile(picPath);

rwd.daInsert("INSERT INTO users ([name] ,lname, semat ,username, pass, sabtkonande,image)"
+ "values('" + textBox1_name.Text + "','"
+ textBox2_lname.Text + "','"
+ textBox5_job.Text + "','"
+ textBox3_uname.Text + "','"
+ textBox4_pass.Text + "','"
+ textBox6_sabtkonande.Text + "','"
+ mStream.GetBuffer() + "')");

MessageBox.Show("کاربر مورد نظر با موفقیت ثبت شد.", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
SqlConnection con = new SqlConnection();
SqlCommand cmd = new SqlCommand();
con.ConnectionString = "server=(local)\\sqlexpress;" +
"initial catalog=University;" +
"user id=Administrator;integrated security=SSPI;";

cmd.Connection = con;
cmd.CommandText = "update users set [name]=@name, lname=@lname, semat=@semat"
+ ", pass=@pass , sabtkonande=@sabtkonande , image=@image";
cmd.Parameters.AddWithValue("@name", textBox1_name.Text);
cmd.Parameters.AddWithValue("@lname", textBox2_lname.Text);
cmd.Parameters.AddWithValue("@semat", textBox5_job.Text);
cmd.Parameters.AddWithValue("@pass", textBox4_pass.Text);
cmd.Parameters.AddWithValue("@sabtkonande", textBox6_sabtkonande.Text);
cmd.Parameters.AddWithValue("@image", mStream.GetBuffer());
con.Open();
cmd.ExecuteNonQuery();
con.Close();
MessageBox.Show("اطلاعات وارد شده با موفقیت تغییر یافت.", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
else
MessageBox.Show("رموز وارد شده یکسان نیستند" , "خطا", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

میدونم بد آموزی داره ولی چاره ای جز خط زدن صورت مسأله نبود.

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