ASP.NET - какого черта вызывает эту ошибку приведения

Есть приложение asp.net и пишу операции вставки, обновления и удаления для просмотра подробностей

Моя вставка работает отлично, теперь я пытаюсь сделать обновление, но я получаю YSOD, когда нажимаю кнопку обновления. В форме есть только одна дата, и для вставки и редактирования используется один и тот же шаблон. Ниже приведена трассировка asp и стека, и из того, что я вижу, на данный момент ее нет ни в одной из моих подводных лодок:

<asp:DetailsView ID="dvInvoice" runat="server" Height="50px" Width="250px" DataSourceID="odsInvoices" AutoGenerateRows="False" DataKeyNames="ID">
        <Fields>
            <asp:TemplateField HeaderText="ID" InsertVisible="False" SortExpression="ID">
                <EditItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Eval("ID") %>'></asp:Label>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("ID") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="TripNo" SortExpression="TripNo">
                <EditItemTemplate>
                    <asp:TextBox ID="txtTripNo" runat="server" Text='<%# Bind("TripNo") %>'></asp:TextBox>
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:TextBox ID="txtTripNo" runat="server" Text='<%# Bind("TripNo") %>'></asp:TextBox>
                    <asp:RequiredFieldValidator ValidationGroup="vDetailErrors"
                        CssClass="ErrorClass" ID="rfvTripNo" runat="server"
                        ErrorMessage="An trip no must entered"
                        ControlToValidate="txtTripNo"
                        Display="Dynamic">
                    </asp:RequiredFieldValidator>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label2" runat="server" Text='<%# Bind("TripNo") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="TypeID" SortExpression="TypeID">
                                    <InsertItemTemplate>
                    <asp:DropDownList ID="ddLineTypes"
                        runat="server"
                        SelectedValue='<%# Bind("TypeID")%>'
                        DataSourceID="odsLineTypes"
                        DataTextField="TypeDesc"
                        DataValueField="TypeID"
                        AppendDataBoundItems="True" AutoPostBack="True" OnSelectedIndexChanged="Type_Change"
                         >
                        <asp:ListItem Value="-1" Selected="True">Select a Type</asp:ListItem>
                    </asp:DropDownList>
                    <br />
                    <asp:CompareValidator ID="cvLineTypes" runat="server"
                        ControlToValidate="ddLineTypes" CssClass="ErrorClass"
                        ErrorMessage="Please Select a Type"
                        ValidationGroup="vDetailErrors" ValueToCompare="-1" Operator="NotEqual"
                        Display="Dynamic"></asp:CompareValidator>
                    <asp:ObjectDataSource ID="odsLineTypes" runat="server" OldValuesParameterFormatString="original_{0}" TypeName="LineTypesBLL" SelectMethod="GetLineTypes">
                        <SelectParameters>
                            <asp:Parameter DefaultValue="True" Name="InvOnly" Type="Boolean" />
                        </SelectParameters>
                    </asp:ObjectDataSource>
                </InsertItemTemplate>
                <EditItemTemplate>
                    <asp:DropDownList ID="ddLineTypes"
                        runat="server"
                        SelectedValue='<%# Session("CurrType")%>'
                        DataSourceID="odsLineTypes"
                        DataTextField="TypeDesc"
                        DataValueField="TypeID"
                        AppendDataBoundItems="True" AutoPostBack="True" OnSelectedIndexChanged="Type_Change"
                         >
                    </asp:DropDownList>
                    <br />
                    <asp:CompareValidator ID="cvLineTypes" runat="server"
                        ControlToValidate="ddLineTypes" CssClass="ErrorClass"
                        ErrorMessage="Please Select a Type"
                        ValidationGroup="vDetailErrors" ValueToCompare="-1" Operator="NotEqual"
                        Display="Dynamic"></asp:CompareValidator>
                    <asp:ObjectDataSource ID="odsLineTypes" runat="server" OldValuesParameterFormatString="original_{0}" TypeName="LineTypesBLL" SelectMethod="GetLineTypes">
                        <SelectParameters>
                            <asp:Parameter DefaultValue="True" Name="InvOnly" Type="Boolean" />
                        </SelectParameters>
                    </asp:ObjectDataSource>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label3" runat="server" Text='<%# Bind("TypeID") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="VendorID" SortExpression="VendorID">
                                    <EditItemTemplate>
                    <asp:DropDownList ID="ddVendors"
                        runat="server"
                        SelectedValue='<%# Bind("VendorID")%>'
                        DataSourceID="odsVendors"
                        DataTextField="Name"
                        DataValueField="VendorID"
                        AppendDataBoundItems="True"
                        AutoPostBack ="True">
                        <asp:ListItem Value="-1">Select a Vendor</asp:ListItem>
                    </asp:DropDownList>
                    <br />
                    <asp:CompareValidator ID="cvVendors" runat="server"
                        ControlToValidate="ddVendors" CssClass="ErrorClass"
                        ErrorMessage="Please Select a Vendor"
                        ValidationGroup="vDetailErrors" ValueToCompare="-1" Operator="NotEqual"
                        Display="Dynamic"></asp:CompareValidator>
                    <asp:ObjectDataSource ID="odsVendors" runat="server" OldValuesParameterFormatString="original_{0}" SelectMethod="GetVendors" TypeName="VendorsBLL"></asp:ObjectDataSource>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label4" runat="server" Text='<%# Bind("VendorID") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="InvNo" SortExpression="InvNo">
                                  <EditItemTemplate>
                    <asp:TextBox ID="txtInvNo" runat="server" Text='<%# Bind("InvNo") %>'></asp:TextBox>
                    <asp:RequiredFieldValidator ValidationGroup="vDetailErrors"
                        CssClass="ErrorClass" ID="rfvInvNo" runat="server"
                        ErrorMessage="An invoice number must be entered"
                        ControlToValidate="txtInvNo"
                        Display="Dynamic">
                    </asp:RequiredFieldValidator>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label5" runat="server" Text='<%# Bind("InvNo") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="InvAmount" SortExpression="InvAmount">
                                   <EditItemTemplate>
                    <asp:TextBox ID="txtInvAmount" runat="server" Text='<%# Bind("InvAmount") %>'></asp:TextBox>
                    <br />
                    <asp:RequiredFieldValidator ValidationGroup="vDetailErrors"
                        CssClass="ErrorClass" ID="rfvInvAmount" runat="server"
                        ErrorMessage="An invoice amount must be entered"
                        ControlToValidate="txtInvAmount"
                        Display="Dynamic"></asp:RequiredFieldValidator>
                    <br />
                    <asp:CompareValidator ValidationGroup="vDetailErrors"
                        CssClass="ErrorClass" ID="cvInvAmount" runat="server"
                        ControlToValidate="txtInvAmount"
                        ErrorMessage="A numeric Invoice Amount MUST be entered"
                        Operator="DataTypeCheck" Type="Currency"
                        Display="Dynamic"></asp:CompareValidator>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label6" runat="server" Text='<%# Bind("InvAmount") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="InvDate" SortExpression="InvDate">
                                   <EditItemTemplate>
                    <asp:TextBox ID="txtInvDate" runat="server" Text='<%# Bind("InvDate") %>'></asp:TextBox>
                    <br />
                    <asp:RequiredFieldValidator ValidationGroup="vDetailErrors"
                        CssClass="ErrorClass" ID="rfvInvDate" runat="server"
                        ErrorMessage="An invoice date must be entered"
                        ControlToValidate="txtInvDate"
                        Display="Dynamic">
                    </asp:RequiredFieldValidator>
                    <br />
                    <asp:CustomValidator ValidationGroup="vDetailErrors"
                        CssClass="ErrorClass"
                        ID="cvInvDate" runat="server"
                        ErrorMessage="A valid date within the last two years and no later than next year must be entered"
                        OnServerValidate="cvInvDate_ServerValidate" ControlToValidate="txtInvDate"
                        Display="Dynamic">
                    </asp:CustomValidator>
                </EditItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label7" runat="server" Text='<%# Bind("InvDate") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:CommandField CausesValidation="true" ShowEditButton="true" ShowInsertButton="true" ValidationGroup="vDetailErrors" />
        </Fields>
    </asp:DetailsView>
    <p>
        <asp:ObjectDataSource ID="odsInvoices" runat="server" InsertMethod="AddInvoice" OldValuesParameterFormatString="original_{0}" SelectMethod="GetInvoicesByTripNo" TypeName="InvoicesBLL" UpdateMethod="UpdateInvoice">
            <InsertParameters>
                <asp:ControlParameter ControlID="dvInvoice" Name="TripNo" PropertyName="SelectedValue" Type="String" />
                <asp:ControlParameter ControlID="dvInvoice" Name="TypeID" PropertyName="SelectedValue" Type="Int32" />
                <asp:ControlParameter ControlID="dvInvoice" Name="VendorID" PropertyName="SelectedValue" Type="Int32" />
                <asp:ControlParameter ControlID="dvInvoice" Name="InvNo" PropertyName="SelectedValue" Type="String" />
                <asp:ControlParameter ControlID="dvInvoice" Name="InvAmount" PropertyName="SelectedValue" Type="Decimal" />
                <asp:ControlParameter ControlID="dvInvoice" Name="InvDate" PropertyName="SelectedValue" Type="DateTime" />
                <asp:Parameter Name="ID" Type="Int32" />
            </InsertParameters>
            <SelectParameters>
                <asp:ControlParameter ControlID="txtLoadNo" Name="TripNo" PropertyName="Text" Type="String" />
            </SelectParameters>

            <UpdateParameters>
                <asp:ControlParameter ControlID="dvInvoice" Name="TripNo" PropertyName="SelectedValue" Type="String" />
                <asp:ControlParameter ControlID="dvInvoice" Name="TypeID" PropertyName="SelectedValue" Type="Int32" />
                <asp:ControlParameter ControlID="dvInvoice" Name="VendorID" PropertyName="SelectedValue" Type="Int32" />
                <asp:ControlParameter ControlID="dvInvoice" Name="InvNo" PropertyName="SelectedValue" Type="String" />
                <asp:ControlParameter ControlID="dvInvoice" Name="InvAmount" PropertyName="SelectedValue" Type="Decimal" />
                <asp:ControlParameter ControlID="dvInvoice" Name="InvDate" PropertyName="SelectedValue" Type="DateTime" />
                <asp:ControlParameter ControlID="dvInvoice" Name="original_ID" PropertyName="SelectedValue" Type="Int32" />
            </UpdateParameters>

        </asp:ObjectDataSource>

Ошибка YSOD

Неверное приведение от 'Int32' до 'DateTime'. Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.InvalidCastException: недопустимое приведение от "Int32" к "DateTime".

Ошибка источника:

Во время выполнения текущего веб-запроса было сгенерировано необработанное исключение. Информация о происхождении и местоположении исключения может быть идентифицирована с помощью трассировки стека исключений ниже.

Трассировки стека:

[InvalidCastException: Invalid cast from 'Int32' to 'DateTime'.]
   System.Int32.System.IConvertible.ToDateTime(IFormatProvider provider) +134
   System.Convert.ChangeType(Object value, TypeCode typeCode, IFormatProvider provider) +519
   System.Web.UI.WebControls.Parameter.GetValue(Object value, String defaultValue, TypeCode type, Boolean convertEmptyStringToNull, Boolean ignoreNullableTypeChanges) +126
   System.Web.UI.WebControls.Parameter.GetValue(Object value, Boolean ignoreNullableTypeChanges) +63
   System.Web.UI.WebControls.Parameter.get_ParameterValue() +40
   System.Web.UI.WebControls.ParameterCollection.GetValues(HttpContext context, Control control) +247
   System.Web.UI.WebControls.ObjectDataSourceView.ExecuteUpdate(IDictionary keys, IDictionary values, IDictionary oldValues) +1440
   System.Web.UI.DataSourceView.Update(IDictionary keys, IDictionary values, IDictionary oldValues, DataSourceViewOperationCallback callback) +87
   System.Web.UI.WebControls.DetailsView.HandleUpdate(String commandArg, Boolean causesValidation) +1091
   System.Web.UI.WebControls.DetailsView.HandleEvent(EventArgs e, Boolean causesValidation, String validationGroup) +425
   System.Web.UI.WebControls.DetailsView.OnBubbleEvent(Object source, EventArgs e) +89
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
   System.Web.UI.WebControls.DetailsViewRow.OnBubbleEvent(Object source, EventArgs e) +80
   System.Web.UI.Control.RaiseBubbleEvent(Object source, EventArgs args) +37
   System.Web.UI.WebControls.LinkButton.OnCommand(CommandEventArgs e) +121
   System.Web.UI.WebControls.LinkButton.RaisePostBackEvent(String eventArgument) +156
   System.Web.UI.WebControls.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +9642338
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1724

1 ответ

Решение

Ваши настройки для InsertParameters и UpdateParameters неверны.

В источнике данных объекта ваш ControlID="dvInvoice" и PropertyName = "SelectedValue". Это выбранное значение - это DataKey для DetailsView, который является ID (DataKeyNames = "ID"). Итак, у вас есть все свойства, установленные для получения данных из идентификатора, который является Int, а не datetime.

Вы можете посмотреть подробнее в Свойство DetailsView.SelectedValue и Свойство ControlParameter.PropertyName здесь.

Другие вопросы по тегам