无法让RowUpdate事件处理程序显示GridView

时间:2018-03-31 04:24:57

标签: c# asp.net

我遇到的问题是当我运行代码时遇到此错误:

  

“无法将值NULL插入列'OnHand',表中   'C:\用户\ UNKNOWN \ DESKTOP \ XEX14PRODUCTRECEIPT \ XEX14PRODUCTRECEIPT \ APP_DATA \ HALLOWEEN.MDF.dbo.Products';   列不允许空值。 UPDATE失败“

当我将OnHand值编辑为空或null时,会发生这种情况,但我应该得到我在CodeBehind中创建的错误“发生了数据库错误”。

造成这种情况的原因是什么?

谢谢!

GridView的CodeBehind

    public partial class Default : System.Web.UI.Page
{
    protected void grdProducts_SelectedIndexChanged(object sender, EventArgs e)
    {
        grdProducts.HeaderRow.TableSection = TableRowSection.TableHeader;
    }
    protected void grdProducts_RowUpdated(object sender, GridViewUpdatedEventArgs e)
    {
        if (e.Exception == null)
        {
            lblError.Text = "A databse error has occured. " + "Message: " + e.Exception.Message;
            e.ExceptionHandled = true;
            e.KeepInEditMode = true;

        }
        else if (e.AffectedRows == 0)
        {
            lblError.Text = "Another user may have updated that category. " + "Please try again ";
        }
    }
}

}

Default.aspx的

div class="container">
<header class="jumbotron"><%-- image set in site.css --%></header>
<main>
    <form id="form1" runat="server" class="form-horizontal">

        <div class="row">
            <div class="col-xs-12">
                <asp:GridView ID="grdProducts" runat="server" AllowPaging="True" 
                    AutoGenerateColumns="False" DataKeyNames="ProductID" DataSourceID="SqlDataSource1" 
                    CssClass="table table-bordered table-condensed" OnSelectedIndexChanged="grdProducts_SelectedIndexChanged">
                    <Columns>
                        <asp:BoundField DataField="ProductID" HeaderText="ID" SortExpression="ProductID"
                            ReadOnly="True">
                            <HeaderStyle CssClass="col-sm-2" />
                        </asp:BoundField>
                        <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" ReadOnly="True">
                            <HeaderStyle CssClass="col-sm-6" />
                        </asp:BoundField>
                        <asp:BoundField DataField="OnHand" HeaderText="On Hand" SortExpression="OnHand">
                            <HeaderStyle CssClass="col-sm-2 text-right" />
                            <ItemStyle CssClass="text-right" />
                        </asp:BoundField>
                        <asp:CommandField ShowEditButton="True" />
                    </Columns>
                    <HeaderStyle CssClass="bg-halloween" />
                    <AlternatingRowStyle CssClass="altRow" />
                    <EditRowStyle CssClass="warning" />
                    <PagerStyle CssClass="bg-halloween" HorizontalAlign="Center" />
                </asp:GridView>
                <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
                    ConnectionString="<%$ ConnectionStrings:HalloweenConnection %>" 
                    SelectCommand="SELECT ProductID, Name, OnHand FROM Products" 
                    UpdateCommand="UPDATE Products SET OnHand = @OnHand WHERE (ProductID = @ProductID)">
                    <UpdateParameters>
                        <asp:Parameter Name="OnHand" />
                        <asp:Parameter Name="ProductID" />
                    </UpdateParameters>
                </asp:SqlDataSource>    
            </div>  
        </div>

        <div class="row">
            <div class="col-xs-12">
                <p><asp:Label ID="lblError" runat="server"  
                    CssClass="text-danger" EnableViewState="false"></asp:Label></p>
                <asp:ValidationSummary ID="ValidationSummary1" runat="server" 
                    HeaderText="Please correct the following errors:" CssClass="text-danger" />
            </div>
        </div>
    </form>
</main>

1 个答案:

答案 0 :(得分:1)

由于参照完整性,或者因为列不支持其中的信息为NULL,因此通常会在数据库中发生类似这样的事情。

在关系数据库中,您希望确保您更新的信息有效,因为可以在一个表到另一个表中使用这些数据。在这种情况下,更改一个表的信息将更改许多表,并且具有NULL值将有点像在几个表中有空白。

我不完全确定否则..你也可能想要使用&#39; try / catch&#39;阻止捕获Sqlexception而不是if/else。在try catch块中,你可以使用if / else来测试异常。

如:

try
{
    //Whatever command you have executing your sql statement
}
catch(SqlException e)
{
    Console.WriteLine("An error occurred: " + e.ToString());
}

我确保您拥有验证输入的代码,确保程序不会在未验证其插入数据库内的正确信息类型的情况下尝试执行代码。