PDA

View Full Version : سوال: پیغام خطا پس از عمل Update



a_true_2004
شنبه 12 مرداد 1387, 02:30 صبح
سلام
توی صفحه ای که ایجاد کردم بعد از عمل Update خطای زیر رو نمایش میده که عکسش رو هم برای شما گذاشتم.

Procedure or function Site_Pages_Update has too many arguments specified.

21155
جالب اینکه عمل آپدیت به طور کامل انجام میشه ولی متوجه نشدم که این پیغام خطا برای چیه؟
حتی دستور Update رو به صورت inline هم که نوشتم بازم فرقی نکرد. با QueryBuilder خود VS هم که خطا نمیده اصلا عمل Update رو انجام نمیده. الان عمل Update توسط SP انجام میشه.
در زیر SP رو هم نوشتم :


USE [Community_Site]
GO
/****** Object: StoredProcedure [dbo].[Site_Pages_Update] Script Date: 08/02/2008 01:59:02 ******/
SETANSI_NULLSON
GO
SETQUOTED_IDENTIFIERON
GO
-- ================================================== ========================================
-- Entity Name: sp_Site_Pages_Update
-- Create date: 7/26/2008 2:43:34 AM
-- Description: This stored procedure is intended for updating Site_Pages table
-- ================================================== ========================================
ALTERProcedure [dbo].[Site_Pages_Update]
@Page_Name_N nvarchar(100),
@Page_Title nvarchar(4000),
@Page_Data ntext,
@Last_Edit nvarchar(30),
@Edit_By nvarchar(50)
As
Begin
Update Site_Pages
Set
/*Page_Name = @Page_Name_N,*/
Page_Title = @Page_Title,
Page_Data = @Page_Data,
Last_Edit = @Last_Edit,
Edit_By = @Edit_By
Where
(Page_Name = @Page_Name_N)
End

از دوستان میخوام من رو برای رفع این خطا کمک کنند.

mostafa_sgh
شنبه 12 مرداد 1387, 04:50 صبح
دوست عزيز

پروسیجری که ساختید مشکلی نداره !

به نظر من مشکل از تعداد پارامترهای ارسالی تون هستش ( یا کمه یا زیاده ) !

اگه میشه کدی رو که برای این قسمت نوشتید ، رو کنید :لبخند: تا ببینیم مشکل از کجاست ...

milade
شنبه 12 مرداد 1387, 07:41 صبح
مشکل نه از sp هست نه از تعداد پارامتر
من فکر کنم که شما فیلدهای جدول رو بد معرفی کردید(داخل[] بزار ببین چی می شه)
موفق باشی

mostafa_sgh
شنبه 12 مرداد 1387, 15:48 عصر
البته باید خدمتتون عرض کنم ، معمولاً [] زمانی استفاده میشه که فیلدی هم نام با سینتکسهای SQL داشته باشیم.

در ضمن اگه بیشتر به خطای مربوطه توجه کنید ، خودش از عمق قضیه خبر داده .....

a_true_2004
یک شنبه 13 مرداد 1387, 01:39 صبح
سلام
با تشکر از دوستان عزیز
مشکل مطمئناً از [] نیست چون قبل از زدن این پست همه اینها رو امتحان کردم و تفاوتی حاصل نشد.


Protected Sub GV_EditPages_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs)
Try
Dim objPage_Name, objPage_Title, objPage_Data, objLast_Edit As Object, temp As String
objPage_Name = DirectCast(GV_EditPages.Rows.Item(e.RowIndex).Find Control("lbl_EDT_PageName"), WebControls.Label)
temp = objPage_Name.Text
DS_EditPages.UpdateParameters("Page_Name_N").DefaultValue = temp
objPage_Title = DirectCast(GV_EditPages.Rows.Item(e.RowIndex).Find Control("TXT_EDT_PageTitle"), WebControls.TextBox)
DS_EditPages.UpdateParameters("Page_Title").DefaultValue = objPage_Title.Text
objPage_Data = DirectCast(GV_EditPages.Rows.Item(e.RowIndex).Find Control("PED_EDT_PageEditData"), FredCK.FCKeditorV2.FCKeditor)
DS_EditPages.UpdateParameters("Page_Data").DefaultValue = objPage_Data.Value
objLast_Edit = DirectCast(GV_EditPages.Rows.Item(e.RowIndex).Find Control("lbl_EDT_Lastedit"), WebControls.Label)
DS_EditPages.UpdateParameters("Last_Edit").DefaultValue = objLast_Edit.Text
DS_EditPages.UpdateParameters("Edit_By").DefaultValue = LBL_Username.Text
'DS_EditPages.UpdateCommand = "UPDATE Site_Pages SET Page_Title = " & b & ", Page_Data = '" & c & "', Last_Edit = '" & d & "', Edit_By = '" & f & "' WHERE (Page_Name = '" & a & "')"
DS_EditPages.Update()
DS_EditPages.DataBind()
GV_EditPages.DataBind()
Exit Sub
Catch ex As Data.SqlClient.SqlException
LBL_SerError.Text = ex.Message.ToString
End Try
End Sub


نکته آخر اینکه من عمل آپدیت رو در خود Gridview انجام میدم همونطور که از خود تابع مشخصه.
حالا ببینید مشکل از کجاست؟

mostafa_sgh
یک شنبه 13 مرداد 1387, 01:56 صبح
یه مشکلی که میتونه وجود داشته باشه اینه که مقدارهائی که به پارامترها اختصاص میدید Null باشند.

این قضیه رو با Debugging پیگیری کنید تا ادامه پیگیری مشکل .....

a_true_2004
یک شنبه 13 مرداد 1387, 02:47 صبح
یه مشکلی که میتونه وجود داشته باشه اینه که مقدارهائی که به پارامترها اختصاص میدید Null باشند.

این قضیه رو با Debugging پیگیری کنید تا ادامه پیگیری مشکل .....

نه من این مورد رو هم قبلاً چک کردم ولی مشکل از این هم نبود...

mostafa_sgh
یک شنبه 13 مرداد 1387, 05:51 صبح
خوب بلاخره جواب این مشکل هم پیدا شد ......

دوست عزیز شما وقتی از پروسیجر در این زمینه استفاده میکنی با تمامی فیلد هائی رو که نمایش میدی توی پروسیجر تعریف کرده باشی( همانند 5 فیلدی که در پست اول تعریف کردی )


@Page_Name_N nvarchar(100),
@Page_Title nvarchar(4000),
@Page_Data ntext,
@Last_Edit nvarchar(30),
@Edit_By nvarchar(50)


**** اگر غیر از این فیلدها ، فیلد دیگه ای رو توی گرید نمایش میدی ، به لیست بالا اضافه کن ****

حتی نیاز به استفاده از اونها در دستور Update نیست . ( فقط برای اینکه SqlDataSource تمامی پارامترهای نمایش داده شده رو برای پروسیجر ارسال میکنه )

به همین خاطر اون خطا رو نشون میده .( خطا : شما پارامترهای بیشتری رو ارسال کرده اید (خیلی دیگه ترجمش کردم :لبخند: ) )

البته این مشکل فقط برای حالتی هست که شما از پروسیجر استفاده میکنی.
در حالت (UpdateCommandType = Text) مشکلی نداره.

موفق باشید دوست عزیز

a_true_2004
دوشنبه 14 مرداد 1387, 01:05 صبح
سلام

**** اگر غیر از این فیلدها ، فیلد دیگه ای رو توی گرید نمایش میدی ، به لیست بالا اضافه کن ****
نه از کد هم مشخصه که فیلد دیگه ای رو در گرید ندارم البته بجز دو مورد Delete و Edit btn حالا نمیدونم اگه قراره اینا رو هم به اون لیست اضافه کنم چجوری و به چه اسمی این کار رو انجام بدم.

در حالت (UpdateCommandType = Text) مشکلی نداره.
چرا با اینم مشکل داشتم چون عمل آپدیت رو انجام نمیداد.
نمونه UpdateCommand در حالت Text رو در کد بالا ببینید مشکلی داره یا نه؟
نمیدونم چرا برای من جواب نداد.
در حالت (UpdateCommandType = Text) مشکلی نداره.

از شما دوستان ممنونم که در این تاپیک شرکت می کنید...

mostafa_sgh
دوشنبه 14 مرداد 1387, 01:21 صبح
دوست عزیز

مشکل 120% از همون چیزیه که گفتم ( 20% هم به خاطره اینه که تستش کردم )

من تمام مراحل رو با یه مثال انجام دادم.

همین مشکلی که فرمودید وجود داشت .

البته پس از اون کاری که در بالا گفتم مشکل حل شد.

برای فیلدهای Add / Delete /Edit لازم نیست پارامتری بسازید .( اونها فقط یه Command هستن نه فیلد )

دقت کنید در استفاده از SqlDataSource خصیصه ConflictDetection روی گزینه OverwriteChanges قرار داشته باشه.( اجباراً همین باشه )

اگه امکان داره سورس Html و کد رو ضمیمه کنید تا از این قضیه اطمینان حاصل کنیم.

a_true_2004
دوشنبه 14 مرداد 1387, 01:56 صبح
دقت کنید در استفاده از SqlDataSource خصیصه ConflictDetection روی گزینه OverwriteChanges قرار داشته باشه.( اجباراً همین باشه )
این که مقدار پیشفرضه و من هم تغییرش ندادم.

این Grid من در حالت عادی

21277

و این هم در حالت Edit

21278

آیا ممکنه که به خاطر FCKEditor ی که داخل Gridهست باشه؟
نمیدونم مشکل از کجاست با اینکه کد رو داخل Try نوشتم اما این Error رو نمایش میده و انگار نه انگار که Catch وجود داره!
یک مسئله دیگه :
21280
در Query Builder زمانی که دکمه Refresh Paameter رو برای تشخیص Parameter ها از SP میزنم یک Parameter دیگه هم اضافه میشه که من اونو جایی تعریف نکردم به اسم RETURN_VALUE که فکر میکنم مقداریه که SQL برای اعلام نتیجه عمل Update (موفق|ناموفق) برمیگردونه.
آیا میتونه مشکل از این باشه. با اینکه من در هردوحالت که این پارامتر وجود داشت و نداشت تست کردم و نفاوتی نبود.

mostafa_sgh
دوشنبه 14 مرداد 1387, 02:08 صبح
نه اون مشکلی رو ایجاد نمی کنه

برای اطمینان Editor رو بردارید و دوباره امتحان کنید ! ( به جاش یه TextBox بزارید )

البته بعید میدونم از اون باشه ...

mostafa_sgh
دوشنبه 14 مرداد 1387, 02:18 صبح
البته اینو جدای از همه این مسائل باید خدمتتون بگم ، شما در عکسی که فرستادید تنها 2 فیلد رو Update میکنید ...

با این وجود چرا همه فیلد ها رو Update میکنید ؟
آیا نمی تونه تو سرعت کارتون تاثیر داشته باشه ؟ ( مسلماً داره چون الکی بقیه پارامترها رو پاس میدید )

به این نکته هم توجه داشته باشید

a_true_2004
دوشنبه 14 مرداد 1387, 02:20 صبح
نه مشکل از Editor هم نبود...
دوستان مرا دریابید.

mostafa_sgh
دوشنبه 14 مرداد 1387, 02:25 صبح
شما چرا توی کد پارامترها رو وارد میکنید ؟

گرید خودش اینکارو انجام میده !

من دیگه چیزی به نظرم نمیرسه .

مگر اینکه کل کار رو ببینم .

a_true_2004
دوشنبه 14 مرداد 1387, 02:35 صبح
شما در عکسی که فرستادید تنها 2 فیلد رو Update میکنید
نه من 4 فیلد رو Updateمیکنم توی کد که مشخصه
Page_Title,Page_Data_Last_Edit,Edit_By از Page_Name هم برای یافتن سطر مورد نظر

گرید خودش اینکارو انجام میده !
منظورتون در قسمتیه که به پارامتر DefaultValue رو نسبت میده؟؟؟

mostafa_sgh
دوشنبه 14 مرداد 1387, 02:41 صبح
نه !

شما وقتی یه DataSource به گرید معرفی میکنی خودش با استفاده از تکنیکی که وجود داره پارامترهای جدید رو میگیره Update میکنه .

شما فقط کافیه UpdateCommand رو بهش معرفی کرده باشی .

a_true_2004
دوشنبه 14 مرداد 1387, 02:48 صبح
خوب از کجا میتونه تشخیص بده که من چه مقداری رو از کجا میخوام به کدوم پارامتر نسبت بدم ؟؟ (:

mostafa_sgh
دوشنبه 14 مرداد 1387, 03:10 صبح
البته اینجوریم نیست که همشو خودش انجام بده . خوب شما هم تو کارش دخیل هستید ( Eval() , Bind() )

*** البته در مواقعی که در گرید ویو در قسمت DataSource معرفی کرده باشید

برای مثال : شما اگر تکست باکس EditTemplate فیلد Page_Name تون به صورت زیر باشه خودش به صورت اتوماتیک Bind میشه ( حتی دستوری که تو رویداد RowUpdating برای مقدار دهی این فیلد مینویسید بدون تاثیر میباشد )



<asp:TextBox ID="TextBox3" runat="server"Text='<%# Bind("Page_Name") %>'></asp:TextBox>


واگر به جای Bind کلمه Eval رو قرار بدید ، باید برای Update اون رو داخل رویداد فوق مقداردهی کنید .

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

a_true_2004
سه شنبه 15 مرداد 1387, 01:41 صبح
سلام مجدد

مشکلی نیست اینم کد HTML یا بهتر بگم Aspx :



<%@ Page Language="VB" AutoEventWireup="false" CodeFile="EditPages.aspx.vb" Inherits="Site_ControlPanel_EditPages" %>

<%@ Register Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
Namespace="System.Web.UI" TagPrefix="asp" %>
<%@ Register Assembly="FredCK.FCKeditorV2" Namespace="FredCK.FCKeditorV2" TagPrefix="FCKeditorV2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Edit Pages</title>
</head>
<script type="text/javascript" language="javascript">
function CheckInsert()
{
if (EditPages.Inserted.value=='Yes')
{
if (EditPages.TXT_PageFilename.value=='')
{alert('Enter Page Filename');
return false;}
//else EditPages.RFV_PageFilename='';
if (EditPages.TXT_PageTitle.value=='')
{alert('Enter Page Title');
return false;}
//else EditPages.RFV_PageTitle='';
if (EditPages.PED_PageData.value=='')
{alert('Enter Page Data');
return false;}
else EditPages.RFV_PageData='';
}
else
{
EditPages.Inserted.value=='';
return true;
}
}
</script>
<body>
<form id="EditPages" runat="server" onsubmit="return CheckInsert()">
<a id="ANK_Back" href="Default.aspx"><img src="Images/Back.png" alt="Back" style="border-top-style: none; border-right-style: none; border-left-style: none; border-bottom-style: none;"/></a>&nbsp;
<asp:SqlDataSource ID="DS_EditPages" runat="server" ConnectionString="Data Source=.\SQLEXPRESS;Initial Catalog=Community_Site;Integrated Security=True"
DeleteCommand="DELETE FROM Site_Pages WHERE (Page_Name = @Page_Name_Get)" InsertCommand="Site_Pages_Insert"
InsertCommandType="StoredProcedure" SelectCommand="SELECT Page_Name, Page_Title, Page_Data, Last_Edit, Edit_By FROM Site_Pages"
UpdateCommand="Site_Pages_Update" UpdateCommandType="StoredProcedure">
<DeleteParameters>
<asp:Parameter Name="Page_Name_Get" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="Page_Name_N" Type="String" />
<asp:Parameter Name="Page_Title" Type="String" />
<asp:Parameter Name="Page_Data" Type="String" />
<asp:Parameter Name="Last_Edit" Type="String" />
<asp:Parameter Name="Edit_By" Type="String" />
<asp:Parameter Name="Temp1" Type="String" />
<asp:Parameter Name="Temp2" Type="String" />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Direction="ReturnValue" Name="RETURN_VALUE" Type="Int32" />
<asp:Parameter Name="Page_Name" Type="String" />
<asp:Parameter Name="Page_Title" Type="String" />
<asp:Parameter Name="Page_Data" Type="String" />
<asp:Parameter Name="Last_Edit" Type="String" />
<asp:Parameter Name="Edit_By" Type="String" />
</InsertParameters>
</asp:SqlDataSource>
<asp:GridView ID="GV_EditPages" runat="server" AutoGenerateColumns="False" BackColor="White"
BorderColor="#999999" BorderStyle="None" BorderWidth="1px" CellPadding="3" DataSourceID="DS_EditPages"
GridLines="Vertical" DataKeyNames="Page_Name,Page_Title,Page_Data,Last_Edit,Edit_By" ShowFooter="True" OnRowUpdating="GV_EditPages_RowUpdating">
<FooterStyle BackColor="#CCCCCC" ForeColor="Black" />
<RowStyle BackColor="#EEEEEE" ForeColor="Black" HorizontalAlign="Center" />
<Columns>
<asp:CommandField ButtonType="Image" CancelImageUrl="~/Site_ControlPanel/Images/delete.png"
EditImageUrl="~/Site_ControlPanel/Images/Edit.gif" ShowEditButton="True" UpdateImageUrl="~/Site_ControlPanel/Images/Save.gif" />
<asp:TemplateField HeaderText="Delete">
<FooterTemplate>
<asp:Button ID="BTN_Del" runat="server" OnClick="BTN_Del_Click" Text="Delete" />
</FooterTemplate>
<ItemTemplate>
<asp:CheckBox ID="CHKB_DelItems" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Page Filename" SortExpression="Page_Name">
<EditItemTemplate>
<asp:Label ID="lbl_EDT_PageName" runat="server" Text='<%# Bind("Page_Name") %>'></asp:Label>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label3" runat="server" Text='<%# Bind("Page_Name") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Page Title" SortExpression="Page_Title">
<EditItemTemplate>
<asp:TextBox ID="TXT_EDT_PageTitle" runat="server" Text='<%# Bind("Page_Title") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label4" runat="server" Text='<%# Bind("Page_Title") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Page Data" SortExpression="Page_Data">
<EditItemTemplate>
<FCKeditorV2:FCKeditor ID="PED_EDT_PageEditData" runat="server" AutoDetectLanguage="false"
BasePath="~/Site_Editor/" EnableSourceXHTML="true" Height="100px" ToolbarSet="Basic"
Value='<%# Eval("Page_Data") %>' Width="100%">
</FCKeditorV2:FCKeditor>
</EditItemTemplate>
<ItemTemplate>
<a id="ANK_ViewPage" target="_blank" href="<%# "../Themes/leanandgreen/Site/Default.aspx?pn=" & Eval("Page_Name") %>">View</a>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Last Edit date" SortExpression="Last_Edit">
<EditItemTemplate>
<asp:Label ID="lbl_EDT_Lastedit" runat="server" Text='<%# Date.Now.Year.ToString + "/" + Date.Now.Month.ToString + "/" + Date.Now.Day.ToString %>'></asp:Label>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# Bind("Last_Edit") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Edited By" SortExpression="Edit_By">
<EditItemTemplate>
<asp:Label ID="LBL_EDT_EditBy" runat="server" Text='<%# Bind("Edit_By") %>'></asp:Label>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("Edit_By") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
<PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" />
<SelectedRowStyle BackColor="#008A8C" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#000084" Font-Bold="False" Font-Italic="True" Font-Names="Times New Roman"
Font-Size="Medium" ForeColor="White" />
<AlternatingRowStyle BackColor="Gainsboro" />
</asp:GridView>
&nbsp;
<table>
<tr>
<td align="left" colspan="2">
<br />
<br />
<asp:Label ID="LBL_SerError" runat="server" Font-Bold="True" Font-Italic="True" ForeColor="Red"></asp:Label><br />
</td>
</tr>
<tr>
<td align="right">
<asp:Label ID="LBL_Pagefilename" runat="server" Text="Page Filename :"></asp:Label></td>
<td align="left">
<asp:TextBox ID="TXT_PageFilename" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td align="right">
<asp:Label ID="LBL_PageTitle" runat="server" Text="Page Title :"></asp:Label></td>
<td align="left">
<asp:TextBox ID="TXT_PageTitle" runat="server"></asp:TextBox></td>
</tr>
<tr>
<td align="right" valign="top">
<asp:Label ID="LBL_PageData" runat="server" Text="Page Data :"></asp:Label></td>
<td style="width: 700px">
<FCKeditorV2:FCKeditor ID="PED_PageData" runat="server" AutoDetectLanguage="false"
BasePath="~/Site_Editor/" EnableSourceXHTML="true" Height="400px" ToolbarSet="Default"
Value="&nbsp;" Width="100%">
</FCKeditorV2:FCKeditor>
</td>
</tr>
<tr>
<td align="right">
<asp:Label ID="LBL_Editdate" runat="server" Text="Last Edit date :"></asp:Label></td>
<td align="left">
<asp:Label ID="LBL_Sysdate" runat="server"></asp:Label></td>
</tr>
<tr>
<td align="right">
<asp:Label ID="LBL_Editedby" runat="server" Text="Edited by :"></asp:Label></td>
<td align="left">
<asp:Label ID="LBL_Username" runat="server" Text=""></asp:Label></td>
</tr>
<tr>
<td align="right">
</td>
<td>
<asp:Button ID="BTN_Insert" runat="server" Text="Insert new page" OnClientClick="EditPages.Inserted.value='Yes';"/>
</td>
</tr>
</table>
<input id="Inserted" type="hidden" runat="server" value='' />
</form>
</body>
</html>




البته کدهای java که برای چک کردن مقادیر در هنگام Insert است ممکنه درست جواب نده
ببینم چه میکنید

mostafa_sgh
سه شنبه 15 مرداد 1387, 02:32 صبح
سلام دوست عزیز

یه سری مشکلاتش حل شد :

1 - معرفی فیلد در DataKeyName
2 - تغییر Bind به Eval ( چون شما داخل کد مقدارها رو به پارامترها نسبت میدید )
* یه فوزولی هم کردم ( تغییر مقداردهی Last_Edit ) :لبخند:

و کاری که باید انجام بدید :

پروسیجرتون رو تو Visual Studio و یا Sql Server تست کنید و از عملکرد اون اطمینان حاصل کنید .

پیشنهاد :

داخل Table ی که دارید یه فیلد عددی تعریف کنید و اونو Primary Key ( کلید اصلی ) قرار بدید .

امیدوارم که دیگه مشکلی نداشته باشید .

a_true_2004
سه شنبه 15 مرداد 1387, 03:49 صبح
با تشکر از شما دوست عزیز به خاطر تلاشی که برای رفع مشکل من داشتید.
امروز که سیستمم ویروس گرفت و مدام Internet Explorer باز میکنه بعد از رفع مشکل دستورات شما رو انجام میدم ببینم چی میشه.
بازم ممنون...