PDA

View Full Version : سوال: راهنمایی در مورد یک پیغام خطا هنگام ثبت اطلاعات



arash.gh
شنبه 30 مهر 1390, 22:48 عصر
وقتی تکه کد زیر رو اجرا می کنم خطای زیر رو میده.


switch (tedad)
{
case 1 :
ac.karnamem(stdID, lbl1.Text, month, activeyear, Convert.ToDouble(txt1.Text));
break;
case 2 :
ac.karnamem(stdID, lbl1.Text, month, activeyear, Convert.ToDouble(txt1.Text));
ac.karnamem(stdID, lbl2.Text, month, activeyear, Convert.ToDouble(txt2.Text));
break;
}

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

public void karnamem(int stdID, string drsname, string month, string sal, double nomre)
{
con.Open();
cmd.CommandText = "insert into tblkarnamem(stdID,drsname,month,sal,nomre) values(@stdID,@drsname,@month,@sal,@nomre)";
cmd.Parameters.AddWithValue("@stdID", stdID);
cmd.Parameters.AddWithValue("@drsname", drsname);
cmd.Parameters.AddWithValue("@month", month);
cmd.Parameters.AddWithValue("@sal", sal);
cmd.Parameters.AddWithValue("@nomre", nomre);
cmd.ExecuteNonQuery();
con.Close();
}

وقتی ارا می کنم مقادیر txt1.text رو ثبت می کنه اما به txt2.text که میرسه پیغام خطای زیر رو نشون میده.

The variable name '@stdID' has already been declared. Variable names must be unique within a query batch or stored procedure.

فکر کنم داره میگه متغیر stdID@ یک بار اعلان شده نمیدونم جریان چیه من نیاز دارم این تابع رو دوبار یا هر چند بار پشت سرهم فراخوانی کنم

مشکل از کجاست به نظر شما ؟

ممنون از راهنمایی هاتون

JaguarXF
یک شنبه 01 آبان 1390, 00:23 صبح
کلید از کجا میاد ؟ همان stdId هستش؟ در اینصورت در کیس دوم دو تا رکورد رو با کلید یکسان داری ذخیره میکنی که خطاست.
فارغ از این مساله این نحوه کد نویسی فوق العاده مشکلات پایه ای زیادی داره و برنامه حاصل با همین تکه کد میتونه چندین باگ مختلف داشته باشه.

mina_ghorbani
یک شنبه 01 آبان 1390, 10:32 صبح
بايد قبل از اينكه پارامتر ها رو مقدار بدي بنويسي
cmd.Parameters.Clear();

cmd.Parameters.Clear();





چون از قبل وجود داره با اين پاك مي كنه دوباره مي سازه

arash.gh
یک شنبه 01 آبان 1390, 22:49 عصر
دوست عزیز JaguarXF (http://barnamenevis.org/member.php?90128-JaguarXF) از راهنمایی تون ممنون ، خیر کلید رو تعریف کردم با اسم ID و Identity رو هم yes کردم که auto مقدار دهی بشه،دوست عزیزمون mina_ghorbani (http://barnamenevis.org/member.php?61518-mina_ghorbani) راهنمایی بسیار مفیدی کردند و کارمون راه افتاد از شونم ممنون و سپاسگذارم.
اما در این که این نوع کدینگ اشتباه است و باگ زیاد میده شما درست میگید و کاملا قبول.من یه توضیح کوچولو بدم اگه تونستید شاید شما راه بهتری پیشنهاد کردید.

شما سیستم کارنامه و دانش آموز یک مدرسه رو فرض کنید.
تو اطلاعات پایه {تعریف دانش آموز - تعریف مقاطع - تعریف درس و...} رو گذاشتم که کاربر می تونه همه اطلاعات رو اونجا تعریف کنه.
بعد الان یه فرم طراحی می کنم برای وارد کردن نمره و کارنامه.
الان وقتی یک دانش آموز انتخاب میشه تمامی دروسی که مال مقطع اون دانش آموز هست باید براش لیست بشه.حالا اینکه تعداد دروس چندتاست در اختیار من نیست و من نباید به صورت پیشفرض تعریف کنم درس ها رو باید از جدول دروس بگیره.برای اینکار من باید label و textbox داشته باشم برای اسم درس و گرفتن نمره درس،حالا من رفتم نزدیک به 22 تا textbox و label گذاشتم که تقریبا تعداد درس ها بیشتر از 20 تا نیست و visible همه رو غیرفعال کردم.الان به تعداد درس هایی که از بانک میگیره یکی یکی lable ها رو text شرو برابر نام درس قرار می دم بعد هم با کد بالا برای ثبت رکورد می فرستم.شما برای این وضعیت چه پیشنهاد بهتری دارین.الانم یکم کدینگم بالا رفته اما کارم را افتاده نمیدونم چیزی به ذهنم نمیرسه احساسم میکنم این نوع کار اصلا حرفه ای نیست اما چیزی به ذهنم نمیرسه.اگه پیشنهاد قابل انجام دیگه ای دارید با کمال میل ازش استقبال میکنم.

ممنون از راهنمایی هاتون.

JaguarXF
دوشنبه 02 آبان 1390, 02:12 صبح
راههای مختلفی هستش. ساده ترین و سریعترینش همین کاری هتسش که خودت انجام دادی

راه دیگر اینه که این تکست باکس و لیبل ها رو در زمان اجرا بسازی بر حسب تعداد نیاز .

راه دیگر این هستش که اصلا تکست باکس و لیبلی در کار نباشه و یک گرید داشته باشی با دو ستون نام درس از نوع استرینگ و نمره ازنوع اعشاری و تعداد ردیفهایی به اندازه تعداد دروس . ( من خودم اینو دوست دارم ) .

راه دیگر این هستش که اصلا یک فرم کوچک نشان بدهی با یک تکست باکس و یک لیبل یعتی درهر لحظه نمره یک درس رو وارد کنند و به درس بعدی یا قبلی بروند

راه دیگر این هستش که یک کامبوباکس داشته باشی که لیست درسها رو میریزی داخلش و یک تکست باکس . با هر آیتمی که از کامبوباکس انتخاب میکنند محتوای تکست باکس خالی میشه و آماده برای ثبت نمره .


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

فعلا اینها به نظرم رسید

arash.gh
سه شنبه 03 آبان 1390, 00:20 صبح
دوستان ممنون از راهنمایی هاتون.
اصلا دوست ندارم فرم درس ها ثابت باشه یعنی ثابت تعریف کنم چون هم صورت جالبی نداره هم بعضی مدارس درس های دیگه ای مثل سایت کامپیوتر و... دارن بعضی ندارن پس اینکار تقریبا امکان پذیر نیست راه حل های دیگه مثل اینکه یک کنترل رو new کنم و اینکارا اکان پذیره اما باید مختصات فرم و اینارو بهش بدم که همگی به ترتیب باشه اینم دردسر های خاص خودش رو داره.این کارم که برای هر درس یک فرم و تکست باشه و اینکه با یه combobox این راه حل ها هم خوبه اما زیاد جالب نیست کارکاربر رو خیلی سخت مینه فرض کنید برای چند نفر دانش آموز هر بار باز شدن یه فرم یا انتخاب درس از یه کمبو چقدر سخت و زمان گیره،با این تفاصیر فکر کنم راه حل خودم هم بد نبوده و کارمو راه انداخته.به هر حال استفاده کردم ممنون از راهنمایی هاتون.