Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 取消a";删除“;事件if";DELETE语句与引用约束“冲突”;_C#_Asp.net_Entity Framework_Events - Fatal编程技术网

C# 取消a";删除“;事件if";DELETE语句与引用约束“冲突”;

C# 取消a";删除“;事件if";DELETE语句与引用约束“冲突”;,c#,asp.net,entity-framework,events,C#,Asp.net,Entity Framework,Events,我使用的是System.Data.EntityClient而不是简单的System.Data.SqlClient 我是实体框架的新手,所以请原谅我的无知,请不要提供神秘的回答,因为我没有必要的背景信息来理解它们 我已经做了几个小时的研究,找不到解决我问题的正确答案组合 问题是: 当触发“删除”事件时,页面抛出此错误: DELETE语句与引用约束冲突 我想捕获这个错误,让它在页面上填充一个标签,上面写着 无法删除此客户 我的ASP页面: <asp:Content ID="Content2"

我使用的是
System.Data.EntityClient
而不是简单的
System.Data.SqlClient

我是实体框架的新手,所以请原谅我的无知,请不要提供神秘的回答,因为我没有必要的背景信息来理解它们

我已经做了几个小时的研究,找不到解决我问题的正确答案组合

问题是:

当触发“删除”事件时,页面抛出此错误:

DELETE语句与引用约束冲突

我想捕获这个错误,让它在页面上填充一个标签,上面写着

无法删除此客户

我的ASP页面:

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<p>
    <asp:DetailsView ID="CustomerDetail" runat="server" 
        DataSourceID="CustomerSqlDataSource" Height="50px" 
        Width="215px" Visible="False" AutoGenerateRows="False" 
        OnModeChanged="CustomerDetail_ModeChanged">
        <Fields>
            <asp:BoundField DataField="FirstName" HeaderText="First Name:" />
            <asp:BoundField DataField="LastName" HeaderText="Last Name:" />
            <asp:BoundField DataField="City" HeaderText="City:" />
            <asp:BoundField DataField="State" HeaderText="State" />
            <asp:CommandField ShowInsertButton="True" />
        </Fields>
    </asp:DetailsView>
</p>
<asp:Button ID="NewCustomerButton" runat="server" Text="New Customer" OnClick="NewCustomerButton_Click" />
<p>
    <asp:Label ID="DeleteLabel" runat="server" Text="" Visible="false"/>
    <asp:GridView ID="CustomerGrid" runat="server" AutoGenerateColumns="False" 
        DataKeyNames="CustomerId" DataSourceID="CustomerSqlDataSource" 
        OnSelectedIndexChanged="CustomerGrid_SelectedIndexChanged" >
        <Columns>
            <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
            <asp:BoundField DataField="FirstName" HeaderText="FirstName" SortExpression="FirstName" />
            <asp:BoundField DataField="LastName" HeaderText="LastName" SortExpression="LastName" />
            <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
            <asp:BoundField DataField="State" HeaderText="State" SortExpression="State" />
        </Columns>
    </asp:GridView>
    <br />

    <br />
    <asp:SqlDataSource ID="CustomerSqlDataSource" runat="server" 
        ConnectionString="<%$ ConnectionStrings:ITP236-InventoryConnectionString %>" 
        DeleteCommand="DELETE FROM [Customer] WHERE [CustomerId] = @CustomerId" 
        InsertCommand="INSERT INTO [Customer] ([FirstName], [LastName], [City], [State]) 
                        VALUES (@FirstName, @LastName, @City, @State)" 
        SelectCommand="SELECT [CustomerId], [FirstName], [LastName], [City], [State] FROM [Customer]" 
        UpdateCommand="UPDATE [Customer] 
                        SET [FirstName] = @FirstName, [LastName] = @LastName, [City] = @City, [State] = @State 
                        WHERE [CustomerId] = @CustomerId" OnDeleted="CustomerSqlDataSource_Deleted">
        <DeleteParameters>
            <asp:Parameter Name="CustomerId" Type="Int32" />
        </DeleteParameters>
        <InsertParameters>
            <asp:Parameter Name="FirstName" Type="String" />
            <asp:Parameter Name="LastName" Type="String" />
            <asp:Parameter Name="City" Type="String" />
            <asp:Parameter Name="State" Type="String" />
        </InsertParameters>
        <UpdateParameters>
            <asp:Parameter Name="FirstName" Type="String" />
            <asp:Parameter Name="LastName" Type="String" />
            <asp:Parameter Name="City" Type="String" />
            <asp:Parameter Name="State" Type="String" />
            <asp:Parameter Name="CustomerId" Type="Int32" />
        </UpdateParameters>
    </asp:SqlDataSource>

</p>
==============================================================================

在美国东部时间上午11:41编辑以包含整个错误。虽然我知道问题是什么, 我只是试图在错误显示之前捕获它,并将其恢复到正常状态 页面上有一个标签,标签上写着“客户无法删除”

============================================================================== “/”应用程序中出现服务器错误

DELETE语句与引用约束“FK_SalesOrder_Customer”冲突。冲突发生在数据库“ITP236库存”、表“dbo.SalesOrder”、列“CustomerId”中。 声明已终止

描述:执行当前web请求期间发生未处理的异常。请查看堆栈跟踪以了解有关错误的更多信息以及错误在代码中的起源

异常详细信息:System.Data.SqlClient.SqlException:DELETE语句与引用约束“FK_SalesOrder_Customer”冲突。冲突发生在数据库“ITP236库存”、表“dbo.SalesOrder”、列“CustomerId”中。 声明已终止

源错误:

在执行当前web请求期间生成了未经处理的异常。有关异常的起源和位置的信息可以使用下面的异常堆栈跟踪来识别

堆栈跟踪:

[SqlException(0x80131904):DELETE语句与引用约束“FK_SalesOrder_Customer”冲突。冲突发生在数据库“ITP236库存”、表“dbo.SalesOrder”、列“CustomerId”中。 该声明已终止。] System.Data.SqlClient.SqlConnection.OnError(SqlException异常,布尔breakConnection,Action
1 wrapCloseInAction)+1767866
System.Data.SqlClient.SqlInternalConnection.OneError(SqlException异常,布尔断开连接,操作
1 wrapCloseInAction)+5352418 System.Data.SqlClient.TdsParser.throweexception和warning(TdsParserStateObject stateObj,布尔调用方连接锁,布尔异步关闭)+244 System.Data.SqlClient.TdsParser.TryRun(RunBehavior RunBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean&dataReady)+1691 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds、RunBehavior、String ResetOptions String)+269 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior、RunBehavior RunBehavior、Boolean returnStream、Boolean async、Int32超时、任务和任务、Boolean asyncWrite、SqlDataReader ds)+1406 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior RunBehavior、Boolean returnStream、String方法、TaskCompletionSource
1完成、Int32超时、任务和任务、Boolean asyncWrite)+177
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource
1 completion,String methodName,Boolean sendToPipe,Int32超时,Boolean asyncWrite)+205 System.Data.SqlClient.SqlCommand.ExecuteNonQuery()+160 System.Web.UI.WebControls.SqlDataSourceView.ExecuteDbCommand(DbCommand命令,DataSourceOperation操作)+380 System.Web.UI.WebControls.SqlDataSourceView.executeElete(IDictionary键、IDictionary旧值)+568 System.Web.UI.DataSourceView.Delete(IDictionary键、IDictionary旧值、DataSourceViewOperationCallback)+84 System.Web.UI.WebControl.GridView.HandleDelete(GridViewRow,Int32 rowIndex)+930 System.Web.UI.WebControls.GridView.HandleEvent(EventArgs e、Boolean causesValidation、String validationGroup)+974 System.Web.UI.WebControl.GridView.RaisePostBackEvent(String eventArgument)+205 System.Web.UI.WebControl.GridView.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)+13 System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl,String eventArgument)+13 System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)+9671830 System.Web.UI.Page.ProcessRequestMain(布尔includeStagesBeforeAsyncPoint,布尔includeStagesAfterAsyncPoint)+1724


版本信息:Microsoft.NET Framework版本:4.0.30319;ASP.NET版本:4.0.30319.34237

您收到的错误是由于违反了外键约束。
Customer
表的主键在某个其他表的外键约束中引用。无法删除该客户,因为其他一些表依赖于该客户

protected void CustomerSqlDataSource_Deleted(object sender, SqlDataSourceStatusEventArgs e)
{
     try {
         if (e.ExceptionHandled == false)
         {
         e.Command.Cancel();
         DeleteLabel.Visible = true;
         DeleteLabel.Text = "This Customer cannot be deleted";
     }
     catch {
       // do your thing here when error occurs
     }
}
例如,如果有一个
Orders
表有一个
CustomerId
列,该列引用了您试图删除的客户,该怎么办?客户订购产品,因此没有客户订单就不可能存在。在这种情况下,请尝试更改DELETE语句:

DELETE FROM [Customer] WHERE [CustomerId] = @CustomerId
AND NOT EXISTS (SELECT * FROM [Orders] AS o WHERE o.[CustomerId]=@CustomerId)
这将防止删除拥有订单的客户。您可以在
Deleted
事件中处理此问题,如下所示:

protected void CustomerSqlDataSource_Deleted(object sender, SqlDataSourceStatusEventArgs e)
{
    if (e.AffectedRows == 0)
    {
        DeleteLabel.Visible = true;
        DeleteLabel.Text = "This Customer cannot be deleted because it has orders";
    }
}

您可以通过选中
e.exception!=空
而不是protected void CustomerSqlDataSource_Deleted(object sender, SqlDataSourceStatusEventArgs e) { if (e.AffectedRows == 0) { DeleteLabel.Visible = true; DeleteLabel.Text = "This Customer cannot be deleted because it has orders"; } }