Vb.net 代码隐藏中的InsertCommand给出错误

Vb.net 代码隐藏中的InsertCommand给出错误,vb.net,sql-insert,detailsview,Vb.net,Sql Insert,Detailsview,这可能是一个非常愚蠢的错误,但gridview的状态和发生/更改的时间总是让我搞混了。 我有一个作为输入的detailsview。页脚中有一个“新建”按钮,可将dv置于插入模式。我想执行输入检查,以便aspx页面中的asp:sqldatasource最小,并且检查是在代码隐藏中完成的。该方法可以采用的一条路径构造insertcommand,根据需要添加参数,并向数据库添加和条目,但另一条路径只是向标签发出错误消息并结束该方法。当出现此路径时,IE中会出现一个调试器弹出窗口,提示“除非指定了in

这可能是一个非常愚蠢的错误,但gridview的状态和发生/更改的时间总是让我搞混了。
我有一个作为输入的detailsview。页脚中有一个“新建”按钮,可将dv置于插入模式。我想执行输入检查,以便aspx页面中的asp:sqldatasource最小,并且检查是在代码隐藏中完成的。该方法可以采用的一条路径构造insertcommand,根据需要添加参数,并向数据库添加和条目,但另一条路径只是向标签发出错误消息并结束该方法。当出现此路径时,IE中会出现一个调试器弹出窗口,提示“除非指定了insertcommand,否则datasource[datasource]不支持插入”
详细视图:


24小时制

数据源:



代码隐藏方法:

Protected Sub-dvInsertInterrupt_row命令(ByVal sender作为对象,ByVal e作为DetailsViewCommandEventArgs)处理dvInsertInterrupt.itemcand
尝试
如果e.CommandName=“插入”,则
Dim accountNumber As Integer=DirectCast(dvInsertInterrupt.Rows(0)、Cells(1)、Controls(1)、DropDownList)。SelectedValue
Dim startDate As DateTime=DirectCast(dvInsertInterrupt.Rows(1)、Cells(1)、控件(1)、日历)。选择日期
Dim milTime As String=DirectCast(dvInsertInterrupt.Rows(2).Cells(1).控件(1),TextBox).Text
作为整数的Dim hr=0
Dim min作为整数=0
暗启动为日期时间
Dim hours As Integer=DirectCast(dvInsertInterrupt.Rows(3)、Cells(1)、Controls(1)、DropDownList)。SelectedValue
Dim endDate作为日期时间
将消息设置为字符串=“”
如果是数字(milTime),则
如果milTime.Length小于4,则
选择Case milTime.Length
病例<2例
milTime=“000”&milTime.ToString
病例<3例
milTime=“00”&milTime.ToString
其他情况
milTime=“0”&milTime.ToString
结束选择
hr=左侧(米尔蒂姆,2)
最小值=右侧(最小值,2)
其他的
hr=左侧(米尔蒂姆,2)
最小值=右侧(最小值,2)
如果结束
如果hr<0或hr>23,则
message=“小时必须介于0和23之间”
DirectCast(dvInsertInterrupt.Rows(2).单元格(1).控件(1),文本框)。Text=“”
其他的
如果最小值<0或最小值>59,则
message=“分钟数必须介于0和59之间”
DirectCast(dvInsertInterrupt.Rows(2).单元格(1).控件(1),文本框)。Text=“”
其他的
开始=新日期时间(开始日期年、开始日期月、开始日期日、小时、分钟、0)
endDate=start.AddHours(小时)
如果结束
如果结束
其他的
message=“仅输入数值”
DirectCast(dvInsertInterrupt.Rows(2).单元格(1).控件(1),文本框)。Text=“”
如果结束
如果未检查中断(帐号、开始、结束日期),则
sqldsInsertInterrupt.InsertCommand=“插入中断(CustomerAccountNumber、StartDate、Hours、EndDate、Approved、SecondNotificationSent)值(@accountNumber、@StartDate、@Hours、@EndDate、0,0)”
sqldsInsertInterrupt.InsertParameters.Add(“accountNumber”,accountNumber)
sqldsInsertInterrupt.InsertParameters.Add(“startDate”,start)
sqldsInsertInterrupt.InsertParameters.Add(“小时”,小时)
sqldsInsertInterrupt.InsertParameters.Add(“endDate”,endDate)
其他的
lblInsertMessage.Text=“此时已安排了中断!”
如果结束
如果结束
特例
lblInsertMessage.Text=“**错误**-”&ex.ToString&“**”
最后
结束尝试
端接头

可以在此处设置您的命令
SelectCommand=“SELECT*FROM Interrupt”InsertCommand=“???????”/>
并在以后添加参数值。可能是你在设置之前运行了一些东西。基本上,时机不对。很难理解,因为isI很抱歉代码太乱了,但是如果我把INSERT语句放在aspx代码中,那么它就不会在后面的代码中经过输入验证了,是吗?它只需按原样接收输入并尝试插入到dbNo中,这与代码混乱无关。它是关于在调用序列中的正确位置进行编码。如果您将
插入。(@…,@…
预先设置。您的SqlDataSource具有事件[.Inserting-在插入操作之前发生。因此,在此事件中,将代码放置在设置参数和值的位置。查看发生了什么。您的代码似乎没有在正确的事件中。
    <asp:DetailsView ID="dvInsertInterrupt" runat="server" AutoGenerateRows="false" DataSourceID="sqldsInsertInterrupt" CssClass="table table-striped table-bordered">
    <Fields>
    <asp:TemplateField HeaderText="Customer" InsertVisible="true" HeaderStyle-CssClass="col-xs-3 field-label active">
    <InsertItemTemplate>
    <asp:DropDownList ID="ddlNames" runat="server" DataSourceID="sqldsNames" DataTextField="Name" DataValueField="AccountNumber" CssClass="col-md-9 form-control" />
    </InsertItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Start Date" InsertVisible="true" HeaderStyle-CssClass="col-xs-3 field-label active">
    <InsertItemTemplate>
    <asp:Calendar ID="calStartDate" runat="server" CssClas="col-md-9 form-control" />
    </InsertItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Start Time" InsertVisible="true" HeaderStyle-CssClass="col-xs-3 field-label active">
    <InsertItemTemplate>
    <asp:TextBox ID="txtStartTime" runat="server" MaxLength="4" /><asp:Label ID="lblInfo" runat="server"><small> 24-Hour Format</small></asp:Label>
    </InsertItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Duration" InsertVisible="true" HeaderStyle-CssClass="col-xs-3 field-label active">
    <InsertItemTemplate>
    <asp:DropDownList ID="ddlHours" runat="server" CssClass="col-md-9 form-control">
    <asp:ListItem Text="2" Value="2" />
    <asp:ListItem Text="3" Value="3" />
    <asp:ListItem Text="4" Value="4" />
    <asp:ListItem Text="5" Value="5" />
    <asp:ListItem Text="6" Value="6" />
    <asp:ListItem Text="7" Value="7" />
    <asp:ListItem Text="8" Value="8" Selected="True" />
    </asp:DropDownList>
    </InsertItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField ShowHeader="false" HeaderStyle-CssClass="field-label col-xs-3 active">
    <ItemTemplate>
    <asp:LinkButton ID="lbNew" runat="server" CausesValidation="false" CommandName="New" Text="New Interrupt" CssClass="btn btn-primary" />
    </ItemTemplate>
    <InsertItemTemplate>
    <asp:LinkButton ID="lbInsert" runat="server" CausesValidation="false" CommandName="Insert" Text="Insert" CssClass="btn btn-primary" />
    <asp:LinkButton ID="lbCancel" runat="server" CausesValidation="false" CommandName="Cancel" Text="Cancel" CssClass="btn btn-default" />
</InsertItemTemplate>
    </asp:TemplateField>
    </Fields>
    </asp:DetailsView>
<asp:SqlDataSource ID="sqldsInsertInterrupt" runat="server" ConnectionString="<%$ ConnectionStrings:WebTestConnectionString %>"
        SelectCommand="SELECT * FROM Interrupt" InsertCommand="" />
Protected Sub dvInsertInterrupt_RowCommand(ByVal sender As Object, ByVal e As DetailsViewCommandEventArgs) Handles dvInsertInterrupt.ItemCommand
        Try
            If e.CommandName = "Insert" Then
                Dim accountNumber As Integer = DirectCast(dvInsertInterrupt.Rows(0).Cells(1).Controls(1), DropDownList).SelectedValue
                Dim startDate As DateTime = DirectCast(dvInsertInterrupt.Rows(1).Cells(1).Controls(1), Calendar).SelectedDate
                Dim milTime As String = DirectCast(dvInsertInterrupt.Rows(2).Cells(1).Controls(1), TextBox).Text
                Dim hr As Integer = 0
                Dim min As Integer = 0
                Dim start As DateTime
                Dim hours As Integer = DirectCast(dvInsertInterrupt.Rows(3).Cells(1).Controls(1), DropDownList).SelectedValue
                Dim endDate As DateTime
                Dim message As String = ""

                If IsNumeric(milTime) Then
                    If milTime.Length < 4 Then
                        Select Case milTime.Length
                            Case Is < 2
                                milTime = "000" & milTime.ToString
                            Case Is < 3
                                milTime = "00" & milTime.ToString
                            Case Else
                                milTime = "0" & milTime.ToString
                        End Select
                        hr = Left(milTime, 2)
                        min = Right(milTime, 2)
                    Else
                        hr = Left(milTime, 2)
                        min = Right(milTime, 2)
                    End If

                    If hr < 0 Or hr > 23 Then
                        message = "Hour must be between 0 and 23"
                        DirectCast(dvInsertInterrupt.Rows(2).Cells(1).Controls(1), TextBox).Text = ""
                    Else
                        If min < 0 Or min > 59 Then
                            message = "Minutes must be between 0 and 59"
                            DirectCast(dvInsertInterrupt.Rows(2).Cells(1).Controls(1), TextBox).Text = ""
                        Else
                            start = New DateTime(startDate.Year, startDate.Month, startDate.Day, hr, min, 0)
                            endDate = start.AddHours(hours)
                        End If
                    End If
                Else
                    message = "Enter numeric values only"
                    DirectCast(dvInsertInterrupt.Rows(2).Cells(1).Controls(1), TextBox).Text = ""
                End If

                If Not CheckForInterrupt(accountNumber, start, endDate) Then
                    sqldsInsertInterrupt.InsertCommand = "INSERT INTO Interrupt (CustomerAccountNumber, StartDate, Hours, EndDate, Approved, SecondNotificationSent) VALUES (@accountNumber, @startDate, @hours, @endDate, 0, 0)"
                    sqldsInsertInterrupt.InsertParameters.Add("accountNumber", accountNumber)
                    sqldsInsertInterrupt.InsertParameters.Add("startDate", start)
                    sqldsInsertInterrupt.InsertParameters.Add("hours", hours)
                    sqldsInsertInterrupt.InsertParameters.Add("endDate", endDate)
                Else
                    lblInsertMessage.Text = "There is already an interrupt scheduled at that time!"

                End If

            End If
        Catch ex As Exception
            lblInsertMessage.Text = "**Error** - " & ex.ToString & " **"
        Finally
        End Try
    End Sub