【问题标题】:DELETE statement causing exception in ASP web site在 ASP 网站中导致异常的 DELETE 语句
【发布时间】:2013-01-29 20:26:47
【问题描述】:

不知道为什么这不起作用并寻求任何帮助。我有一个正在构建的 ASP 网站。一个页面设置为主/详细页面,其中 GridView 用于显示表中的记录。带有 INSERT、UPDATE 和 DELETE 语句的 DetailView 绑定到我的 GridView 上的 SELECT 按钮。

INSERT 和 UPDATE 语句正常工作,但 DELETE 语句抛出异常。

这是处理异常的代码。

protected void DetailsView1_ItemDeleted(object sender, DetailsViewDeletedEventArgs e)
    {
        if (e.Exception != null)
        {
            lblError.Text = "A database error has occurred.<br /><br />" + "Message: " + e.Exception.Message;
            e.ExceptionHandled = true;
        }
        else if (e.AffectedRows == 0)
            lblError.Text = "Another user may have updated that product." + "<br />Please try again.";
        else
            GridView1.DataBind();
    }

抛出的异常是 e.AffectedRows 异常。

我不确定为什么我的表不接受 DELETE 语句,任何想法都将不胜感激。这是DetailView的代码

<asp:SqlDataSource ID="SqlDataSource2" runat="server" 
    ConflictDetection="CompareAllValues" 
    ConnectionString="<%$ ConnectionStrings:HalloweenConnectionString %>" 
    DeleteCommand="DELETE FROM [Products] WHERE [ProductID] = @original_ProductID AND [Name] = @original_Name AND [ShortDescription] = @original_ShortDescription AND [LongDescription] = @original_LongDescription AND [CategoryID] = @original_CategoryID AND (([ImageFile] = @original_ImageFile) OR ([ImageFile] IS NULL AND @original_ImageFile IS NULL)) AND [UnitPrice] = @original_UnitPrice AND [OnHand] = @original_OnHand" 
    InsertCommand="INSERT INTO [Products] ([ProductID], [Name], [ShortDescription], [LongDescription], [CategoryID], [ImageFile], [UnitPrice], [OnHand]) VALUES (@ProductID, @Name, @ShortDescription, @LongDescription, @CategoryID, @ImageFile, @UnitPrice, @OnHand)" 
    OldValuesParameterFormatString="original_{0}" 
    SelectCommand="SELECT [ProductID], [Name], [ShortDescription], [LongDescription], [CategoryID], [ImageFile], [UnitPrice], [OnHand] FROM [Products] WHERE ([ProductID] = @ProductID)" 
    UpdateCommand="UPDATE [Products] SET [Name] = @Name, [ShortDescription] = @ShortDescription, [LongDescription] = @LongDescription, [CategoryID] = @CategoryID, [ImageFile] = @ImageFile, [UnitPrice] = @UnitPrice, [OnHand] = @OnHand WHERE [ProductID] = @original_ProductID AND [Name] = @original_Name AND [ShortDescription] = @original_ShortDescription AND [LongDescription] = @original_LongDescription AND [CategoryID] = @original_CategoryID AND (([ImageFile] = @original_ImageFile) OR ([ImageFile] IS NULL AND @original_ImageFile IS NULL)) AND [UnitPrice] = @original_UnitPrice AND [OnHand] = @original_OnHand">
    <SelectParameters>
        <asp:ControlParameter ControlID="GridView1" Name="ProductID" 
            PropertyName="SelectedValue" Type="String" />
    </SelectParameters>
    <DeleteParameters>
        <asp:Parameter Name="original_ProductID" Type="String" />
        <asp:Parameter Name="original_Name" Type="String" />
        <asp:Parameter Name="original_ShortDescription" Type="String" />
        <asp:Parameter Name="original_LongDescription" Type="String" />
        <asp:Parameter Name="original_CategoryID" Type="String" />
        <asp:Parameter Name="original_ImageFile" Type="String" />
        <asp:Parameter Name="original_UnitPrice" Type="Decimal" />
        <asp:Parameter Name="original_OnHand" Type="Int32" />
    </DeleteParameters>
    <UpdateParameters>
        <asp:Parameter Name="Name" Type="String" />
        <asp:Parameter Name="ShortDescription" Type="String" />
        <asp:Parameter Name="LongDescription" Type="String" />
        <asp:Parameter Name="CategoryID" Type="String" />
        <asp:Parameter Name="ImageFile" Type="String" />
        <asp:Parameter Name="UnitPrice" Type="Decimal" />
        <asp:Parameter Name="OnHand" Type="Int32" />
        <asp:Parameter Name="original_ProductID" Type="String" />
        <asp:Parameter Name="original_Name" Type="String" />
        <asp:Parameter Name="original_ShortDescription" Type="String" />
        <asp:Parameter Name="original_LongDescription" Type="String" />
        <asp:Parameter Name="original_CategoryID" Type="String" />
        <asp:Parameter Name="original_ImageFile" Type="String" />
        <asp:Parameter Name="original_UnitPrice" Type="Decimal" />
        <asp:Parameter Name="original_OnHand" Type="Int32" />
    </UpdateParameters>
    <InsertParameters>
        <asp:Parameter Name="ProductID" Type="String" />
        <asp:Parameter Name="Name" Type="String" />
        <asp:Parameter Name="ShortDescription" Type="String" />
        <asp:Parameter Name="LongDescription" Type="String" />
        <asp:Parameter Name="CategoryID" Type="String" />
        <asp:Parameter Name="ImageFile" Type="String" />
        <asp:Parameter Name="UnitPrice" Type="Decimal" />
        <asp:Parameter Name="OnHand" Type="Int32" />
    </InsertParameters>
</asp:SqlDataSource>

【问题讨论】:

  • 你能先排除db的问题吗?即:您可以直接通过 SQL 运行该删除命令吗?
  • 实际的堆栈跟踪在这里会更有帮助。但是,正如 Kyle C 所提到的,验证针对您的数据库的查询是第一步......
  • 如果 ProductID 是唯一的,您可以简化 DELETE 和 UPDATE 中的 WHERE 子句。
  • @Brian 我认为不会有堆栈空间,因为受影响的行数为 0。因此,删除条件与任何记录都不匹配。
  • @jrummell OP 声明 The Exception thrown is the e.AffectedRows Exception.e.AffectedRows 不是例外。它到达那部分代码的事实意味着e.Exception = null

标签: c# asp.net sql-server detailsview


【解决方案1】:

通常我只会在删除时使用where 子句中的主键 (ProductID?)。删除语句可能在 where 条件下失败。

如果没有删除命令相关的业务规则,可以试试这个:

DeleteCommand="DELETE FROM [Products] WHERE [ProductID] = @original_ProductID" 

【讨论】:

  • 感谢您的回答,在 WHERE 子句的某个地方出现了问题。仍然不确定为什么...但是您的建议证明了删除命令仅通过指定主键即可工作。最后我从头开始重写了页面,第二次是一个魅力。作为菜鸟不能说为什么第一次没有工作(第二次尝试的代码看起来相同)但它确实有效,你的建议有助于缩小范围。谢谢大家的建议。
猜你喜欢
  • 2022-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多