PDA

View Full Version : exception در اجرای SP



resident
شنبه 13 بهمن 1386, 14:48 عصر
سلام.
من یه SP نوشتم که متنی رو که کاربر از کامبوباکس انتخاب کرده می گیره و id اون آیتم رو برمی گردونه تا در دیتابیس ذخیره بشه .

create procedure sp_id_combobox
@subject nvarchar(30)
as
select code_item_combobox
from item_combobox
where subject=@subject

حالا وقتی من اونو تو سی شارپ میخوام اجرا کنم موقع اجرای کد

id_of_item = (int)cmd.ExecuteScalar();

Exception زیر رخ میده:

Procedure or function sp_id_combobox has too many arguments specified.
اینم کدی که SP رو اجرا میکنه:


cmd.CommandText = "sp_id_combobox";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@subject", cmbtypeofsize.SelectedText.Trim());
cn.Open();
id_of_item = (int)cmd.ExecuteScalar();
cn.Close();

به نظرم در تعداد آرگومانها مشکلی نیست ولی میگه خطا داره. به نظر شما مشکل کجاست؟
متشکرم.

reza_rad
شنبه 13 بهمن 1386, 14:56 عصر
قبل از این خط:

cmd.Parameters.AddWithValue("@subject", cmbtypeofsize.SelectedText.Trim());پ
اینو بنویسید:

cmd.Parameters.Clear();

resident
شنبه 13 بهمن 1386, 15:41 عصر
یک مشکل دیگه هم دارم و اون اینکه موقع اجرای کد:


id_of_item = (int)cmd.ExecuteScalar();

استثنای زیر رخ میده:


Object reference not set to an instance of an object.

reza_rad
شنبه 13 بهمن 1386, 15:55 عصر
به جای این:

id_of_item = (int)cmd.ExecuteScalar();
اینو بنویسید:

id_of_item = Convert.ToInt32(cmd.ExecuteScalar());

resident
شنبه 13 بهمن 1386, 18:53 عصر
جناب راد عزیز، ممنون از اینکه وقت گذاشتید و مشکل بنده رو حل کردید.
مشکل چی بود؟چرا این استثناء رخ میداد؟

reza_rad
یک شنبه 14 بهمن 1386, 07:24 صبح
خواهش می کنم دوست عزیز.
ارور اول شما:

Procedure or function sp_id_combobox has too many arguments specified.
به این دلیل بود که شما در یک جای برنامه ات پارمتری رو به sqlCommand ات اضافه می کردی:

cmd.Parameters.AddWithValue("@subject", cmbtypeofsize.SelectedText.Trim());
خب این به خودی خود مشکلی نداره. اما اگر این قسمت داخل یک حلقه باشه هر بار یک پارامتر به این sqlcommand اضافه میشه و از اونجایی که تعداد پارامترها با پارامترهای sp برابر نیست اون ارور رو میده. این روال می تونه در صدا زدن یک ایونت هم وجود داشته باشه. به همین دلیل یا شما باید هر بار یک نمونه جدید از sqlCommand بگیرید و اون رو مقدار دهی کنید. یا اگر کلا از یک sqlCommand استفاده می کنید باید همیشه قبل از اضافه کردن پارامتر به اون اول پارامتر هاش رو پاک کنید:

cmd.Parameters.Clear();

و اما ارور دوم:

Object reference not set to an instance of an object.

به دلیل تبدیل نوع implicit ای هست که شما اینجا انجام میدید:

id_of_item = (int)cmd.ExecuteScalar();
و این بخاطر اینه که تبدیل نوع Implicit قادر به تبدیل از object به int نیست . چون اصولا در این حالت دات نت نمی دونه که نوع object واقعا چی هست که تبدیلش کنه.
اما اگه از تبدیل نوع Explicit به اینصورت استفاده کنید:

id_of_item = Convert.ToInt32(cmd.ExecuteScalar());
دیگه اینجا نیازی نیست که دات نت بدونه این شیئی که داره تبدیل میشه از چه نوع هست و ...