2014-04-28 153 views
2

我想寫一些相當簡單的ASP.NET代碼來操作SQL Server 2012數據庫中的數據。我已經做了一百次之前,但由於某種原因,這是行不通的,這讓我瘋狂。聲明後仍然'必須聲明標量變量'錯誤

我有下面的代碼。該頁面正確加載並顯示數據。我還可以通過修改textboxes中的值並點擊更新按鈕來成功更新記錄。但刪除按鈕不起作用 - 每次我點擊它,我得到錯誤必須聲明標量變量@PhoneNumberID。正如你所看到的,我已經將這個變量包含在了我的DeleteParameters中,並且它與我在UpdateParameters中聲明它的方式相同,這似乎工作正常!

<asp:Label ID="lblPersonID" runat="server" Text="2" /><br /><br /> 
<asp:ListView ID="lvEditPhoneNumbers" runat="server" DataSourceID="SQLEditPhoneNumbers" > 
    <ItemTemplate> 
     <asp:Label ID="lblPhoneNumberID" runat="server" Text='<%#Bind("PhoneNumberID")%>' /> 
     <asp:DropDownList ID="ddlEditPhoneNumberType" runat="server" DataSourceID="SQLPhoneNumberType" DataTextField="Description" DataValueField="ID" SelectedValue='<%#Bind("PhoneNumberTypeID")%>' /> 
     <asp:SqlDataSource ID="SQLPhoneNumberType" runat="server" ConnectionString="<%$ ConnectionStrings:ContactsConnectionString %>" 
      SelectCommand="SELECT * FROM [PhoneNumberType] WHERE [Deleted] = 0"></asp:SqlDataSource> 
     <asp:TextBox ID="txtEditPhoneNumber" runat="server" Text='<%#Bind("PhoneNumber")%>' CssClass="contactdetailseditfield" /> 
     <asp:ImageButton ID="btnDeletePhoneNumber" runat="server" ImageUrl="~/Images/trash-26.png" Width="15px" Height="15px" ToolTip="Delete this phone number" CommandName="Delete" /> 
     <asp:Button ID="btnUpdate" runat="server" Text="Update" CommandName="Update" /> 
    </ItemTemplate> 
</asp:ListView> 
<asp:SqlDataSource ID="SQLEditPhoneNumbers" runat="server" ConnectionString="<%$ ConnectionStrings:ContactsConnectionString %>" 
    SelectCommand="SELECT * FROM [PhoneNumbers] WHERE ([PersonID] = @PersonID) AND ([Deleted] = 0)" 
    UpdateCommand="UPDATE [PhoneNumber] SET [PhoneNumber] = @PhoneNumber, [PhoneNumberType] = @PhoneNumberTypeID WHERE ([ID] = @PhoneNumberID)" 
    DeleteCommand="UPDATE [PhoneNumber] SET [Deleted] = 1 WHERE ([ID] = @PhoneNumberID)" > 
    <SelectParameters> 
     <asp:ControlParameter ControlID="lblPersonID" Name="PersonID" PropertyName="Text" Type="String" /> 
    </SelectParameters> 
    <DeleteParameters> 
     <asp:Parameter Name="PhoneNumberID" Type="Int32" /> 
    </DeleteParameters> 
    <UpdateParameters> 
     <asp:Parameter Name="PhoneNumberID" Type="Int32" /> 
     <asp:Parameter Name="PhoneNumber" Type="String" /> 
     <asp:Parameter Name="PhoneNumberTypeID" Type="Int32" /> 
    </UpdateParameters>    
</asp:SqlDataSource> 

是的,我知道的是顯示的數據是不漂亮的方式 - 我把這個代碼出它應該出現在試圖弄清楚這是怎麼回事頁面。是的,我知道我已經在DeleteCommand中加入了UPDATE命令,但是我過去沒有遇到過問題(至少我認爲我有過),並且無論如何,如果我在命令中取出參數值並用明確聲明的值替換它。

+0

你沒有指定[**'DataKeyNames' **](http://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.listview.datakeynames(v = vs.110).aspx),所以它知道行的唯一標識符? – mellamokb

+0

我想過,但決定這是一個愚蠢的想法,因爲1)我是顯式傳遞唯一標識符(PhoneNumberID),2)SQLDataSource是從查詢中選擇而不是表。但我剛纔嘗試過,添加DataKeyNames屬性已修復它,所以謝謝!輸入它作爲答案,以便我可以接受它! –

回答

2

當您使用數據綁定控件的DeleteItem函數(如ListView)時,需要使用DataKeyNames屬性自動綁定要刪除的參數值。否則,即使你已經確定了PhoneNumberID爲您在DeleteCommand需要一個參數,它實際上沒有被提供一個值,所以它仍然被視爲不聲明:

<asp:ListView ID="lvEditPhoneNumbers" 
       runat="server" 
       DataSourceID="SQLEditPhoneNumbers" 
       DataKeyNames="PhoneNumberID"> 
       ^^^^^ add this