2 votes

Impossible d'obtenir le gestionnaire d'événements RowUpdate pour afficher l'erreur pour GridView

Le problème que j'ai est que lorsque j'exécute le code, je rencontre ceci erreur :

"Impossible d'insérer la valeur NULL dans la colonne 'OnHand', tableau ' C:\USERS\UNKNOWN\DESKTOP\XEX14PRODUCTRECEIPT\XEX14PRODUCTRECEIPT\APP_DATA\HALLOWEEN.MDF.dbo.Products ' ; n'autorise pas les valeurs nulles. UPDATE échoue"

Cela se produit lorsque je modifie la valeur de OnHand en rien ou en null, mais je suis censé obtenir l'erreur que j'ai créée dans le CodeBehind "A database error has occurred".

Quelle en est la cause ?

Merci !

CodeBehind pour GridView

    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>

1voto

Jamin Points 754

Typiquement, quelque chose comme cela se produit dans une base de données en raison de l'intégrité référentielle, ou parce que la colonne ne supporte pas les informations qu'elle contient pour être NULL.

Dans les bases de données relationnelles, vous devez vous assurer que les informations que vous mettez à jour sont valides, car les données peuvent être utilisées d'une table à l'autre. Dans ce cas, la modification des informations d'une table modifiera de nombreuses tables et la présence d'une valeur NULL reviendrait à avoir des blancs dans plusieurs tables.

Je ne suis pas tout à fait sûr du contraire il se peut aussi que vous souhaitiez utiliser un bloc "try/catch" pour attraper une Sqlexception plutôt qu'une if/else . À l'intérieur du bloc try catch, vous pouvez avoir un if/else pour tester l'exception.

Quelque chose comme :

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

Je m'assurerais que vous disposez d'un code validant l'entrée, garantissant que le programme ne tente pas d'exécuter un code sans avoir vérifié que le type d'information à insérer dans la base de données est correct.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X