PDA

View Full Version : درج نشدن مقدار پارامتر



b.paseban
پنج شنبه 30 دی 1389, 13:32 عصر
سلام بر دوستان برنامه نویس.
من برای اینکه بفهمم یه لینک چند بار کلیک شده از یه لینک باتن که ocmmandname و CommandArgument
داره استفاده کردم و توی رویداد کلیک پارامتر ارسالی رو توی viewstate قرار دادم و اونو تو دیتا بیسم اپدیت میکنم.
کد html من:

<asp:LinkButton ID="LinkBtnShowNews" runat="server" Text="کلیک کنید..." PostBackUrl='<%#"News.aspx?ID="+Eval("NewsID")%>'
CommandArgument='<%# Eval("NewsID") %>' CommandName="DoCounter" Font-Overline="False"
Font-Underline="False"></asp:LinkButton>


codebehind:


protected void NewsID_RowCommand(object sender, GridViewCommandEventArgs e)
{
switch (e.CommandName)
{

case "DoCounter":
{
ViewState["NewsID"] = Convert.ToInt32(e.CommandArgument);
CounterViewNews();
break;
}

}

}
private void CounterViewNews()
{
SqlConnection conect = new SqlConnection(ConfigurationManager.ConnectionStrin gs["CS_Heydarzadeh"].ConnectionString);
try
{
conect.Open();
string strpsroccomand = "CounterViewedNews";
SqlCommand comand = new SqlCommand(strpsroccomand, conect);
int NewsID = (int)ViewState["NewsID"];
comand.Parameters.AddWithValue("NewsID", NewsID);
comand.ExecuteReader();
}
catch (Exception ex)
{
Label6.Text = ex.Message;
}
finally
{
conect.Close();
}
}

اینم storedprocedure:
ALTER PROCEDURE CounterViewedNews
@NewsID int
AS


UPDATE News_News
SET ViewCount = ViewCount + 1
WHERE NewsID = @NewsID

ولی این ارور رو میده:
Procedure or function 'CounterViewedNews' expects parameter '@NewsID', which was not supplied

mehran_sh_t
پنج شنبه 30 دی 1389, 13:49 عصر
شما برنامه ات رو دیباگ کردی؟
اگه تا اینجا
ViewState["NewsID"] = Convert.ToInt32(e.CommandArgument);

NewsID رو به دست آوردی، داری مستقیم تابع رو فراخونی میکنی که بعدش، به صورت پارامتر بده به تابعت(شاید مسکل از viewstate باشه!)

اگه نه که مشکل از اون خط به قبله. بگو تا بگردیم دور هم پیداش کنیم!

b.paseban
پنج شنبه 30 دی 1389, 13:56 عصر
با تشکر از شما.
آره دیباگ کردم.تا این خط
comand.Parameters.AddWithValue("NewsID", NewsID);
NewsID مقدار رو میگیره.ولی موقع
comand.ExecuteReader();
این پیغام خطا داده میشه.
خودمم موندم اشکال از چیه:عصبانی:

mehran_sh_t
پنج شنبه 30 دی 1389, 18:27 عصر
جالب شد!
یه کاری کن شما. ExecuterReader رو به ExecuteNoneQuery تغییر بده (بعضی وقت ها راح حل های بی ربط یه هو دیدی با ربط شد)

Javad_Darvish_Amiry
پنج شنبه 30 دی 1389, 20:06 عصر
دوست من سلام. اشکال از پارامتریه که به پروسیجرتون میدید. NewsID رو به NewsID@ تغییر بدید، درست میشه. اما یه پیشنهاد هم دارم. چرا برای پاس دادن NewsID از ویواستیت استفاده کردید. شما که براحتی میتونستید پارامترتون رو به متود مورد نظر انتقال بدید. هم برای خودتون راحت تره و هم بهینه تره:


protected void NewsID_RowCommand(object sender, GridViewCommandEventArgs e)
{
switch (e.CommandName)
{

case "DoCounter":
{
// ViewState["NewsID"] = Convert.ToInt32(e.CommandArgument);
// به جای خط بالا، خط زیر رو به این شکل تغییر بدید:
CounterViewNews(Convert.ToInt32(e.CommandArgument) );
break;
}

}

}
private void CounterViewNews(int NewsID)
{
SqlConnection conect = new SqlConnection(ConfigurationManager.ConnectionStrin gs["CS_Heydarzadeh"].ConnectionString);
try
{
conect.Open();
string strpsroccomand = "CounterViewedNews";
SqlCommand comand = new SqlCommand(strpsroccomand, conect);
// int NewsID = (int)ViewState["NewsID"];
// به خط بالا دیگه نیازی نیست، چون مقدار مورد نظر به عنوان پارامتر به متود تحویل داده میشه:
comand.Parameters.AddWithValue("NewsID", NewsID);
comand.ExecuteReader();
}
catch (Exception ex)
{
Label6.Text = ex.Message;
}
finally
{
conect.Close();
}
}

b.paseban
جمعه 01 بهمن 1389, 13:43 عصر
از همه دوستان هم تشکر می کنم هم معذرت می خوام.اشکال فقط از یه خط بود:
comand.commandtype = commandtype.storeprocedur.:عصبانی:
من از یه storprocedure استفاده کرده بودم که باید توی برنامه خودم این مورد رو ذکر میکردم که commandtype من از نوع storprocedur تشریف دارن.
هی وای از دست این اشباهای کوچولو.:اشتباه: