Не удалось преобразовать значение параметра из строки в DateTime (Visual Studio для доступа к базе данных)

#string #vb.net #visual-studio #datetime #ms-access

#строка #vb.net #visual-studio #datetime #ms-access

Вопрос:

Я пытаюсь создать программу Visual Studio, которая будет добавлять одну новую запись в базу данных Access при каждом нажатии кнопки. Информация, которая вводится в разные столбцы в базе данных access, зависит от того, какие флажки установлены. Теперь я получаю эту ошибку:

введите описание изображения здесь

Сначала я думал, что ошибка связана с неправильно выбранным типом данных в моей базе данных, однако я изменил типы, как показано ниже, и все еще есть ошибки.

введите описание изображения здесь

Я потерялся, потому что думал, что правильно преобразовал даты в строки. Вот мой код для справки. Спасибо за помощь.

 Private Sub InputInformation(sender As System.Object, e As System.EventArgs) Handles ImporttBUT.Click

        Dim strSql = "Insert Into [DataCollection] (
           
            [M/Y Of LOG],
            [TIME OF LOG],
            [USER],
            [STOCK NUMBER],
            [MISSED PART],
            [NOT IN EPICOR],
            [MISSED BUYOUT],
            [MISSED NON STOCK ITEM],
            [MISSED STOCK ITEM],
            [MISSED AUTOMATED],
            [MISSING PRINTS AFTER QUANTITY],
            [MISSED PRINT NOT SENT TO CHAD],
            OTHER,
            [ADDED MISSING DIMENSION],
            [FIXED DIMENSION]
            )
            Values ( @M_YLog, @TimeLog, @User, @StockNumber, @MissedPart, @NotEpicor, MissedBuyout, @MissedNonStock, @MissedStock, @MissedAutomated, @MissedPrints, @NotSent, @Other, @MissingDimension, @FixedDimension);"

        Using con As New OleDb.OleDbConnection(My.Settings.Database1ConnectionString),
            cmdSQL As New OleDbCommand(strSql, con)

            With cmdSQL.Parameters

                .Add("@M_YLog", OleDbType.VarChar, 100).Value = Me.MonthList2021.SelectedItem
                .Add("@TimeLog", OleDbType.VarChar, 100).Value = DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss")
                .Add("@User", OleDbType.VarChar, 100).Value = UserName
                .Add("@StockNumber", OleDbType.Date, 100).Value = ""
                .Add("@MissedPart", OleDbType.VarChar, 100)
                If MissedPartCHKB.Checked Then
                    cmdSQL.Parameters("@MissedPart").Value = MissedPartCHKB.Text
                Else
                    cmdSQL.Parameters("@MissedPart").Value = "NEATOL"
                End If
                .Add("@NotEpicor", OleDbType.VarChar, 100)
                If NotInEpicorCHKB.Checked Then
                    cmdSQL.Parameters("@NotEpicor").Value = NotInEpicorCHKB.Text
                Else
                    cmdSQL.Parameters("@NotEpicor").Value = "NEATOL"
                End If
                .Add("@MissedBuyout", OleDbType.VarChar, 100)
                If MissedBuyoutCHKB.Checked = True Then
                    cmdSQL.Parameters("@MissedBuyout").Value = MissedBuyoutCHKB.Text
                Else
                    cmdSQL.Parameters("@MissedBuyout").Value = "NEATOL"
                End If
                .Add("@MissedNonStock", OleDbType.VarChar, 100)
                If NonStockCHKB.Checked = True Then
                    cmdSQL.Parameters("@MissedNonStock").Value = NonStockCHKB.Text
                Else
                    cmdSQL.Parameters("@MissedNonStock").Value = "NEATOL"
                End If
                .Add("@MissedStock", OleDbType.VarChar, 100)
                If MissedSTKItemCHKB.Checked = True Then
                    cmdSQL.Parameters("@MissedStock").Value = MissedSTKItemCHKB.Text
                Else
                    cmdSQL.Parameters("@MissedStock").Value = "NEATOL"
                End If
                .Add("@MissedAutomated", OleDbType.VarChar, 100)
                If MissedAutomatedPartCHKB.Checked = True Then
                    cmdSQL.Parameters("@MissedAutomated").Value = MissedAutomatedPartCHKB.Text
                Else
                    cmdSQL.Parameters("@MissedAutomated").Value = "NEATOL"
                End If
                .Add("@MissedPrints", OleDbType.VarChar, 100)
                If MissingPrintAfterQTYCHKB.Checked = True Then
                    cmdSQL.Parameters("@MissedPrints").Value = MissingPrintAfterQTYCHKB.Text
                Else
                    cmdSQL.Parameters("@MissedPrints").Value = "NEATOL"
                End If
                .Add("@NotSent", OleDbType.VarChar, 100)
                If MissedPrintsNOTSentChadCHKB.Checked = True Then
                    cmdSQL.Parameters("@NotSent").Value = MissedPrintsNOTSentChadCHKB.Text
                Else
                    cmdSQL.Parameters("@NotSent").Value = "NEATOL"
                End If
                .Add("@Other", OleDbType.VarChar, 100)
                If OtherCHKB.Checked = True Then
                    cmdSQL.Parameters("@Other").Value = OtherTXTB.Text
                Else
                    cmdSQL.Parameters("@Other").Value = "NEATOL"
                End If
                .Add("@MissingDimension", OleDbType.VarChar, 100)
                If AddedMissingDimCHKB.Checked = True Then
                    cmdSQL.Parameters("@MissingDimension").Value = AddedMissingDimCHKB.Text
                Else
                    cmdSQL.Parameters("@MissingDimension").Value = "NEATOL"
                End If
                .Add("@FixedDimension", OleDbType.VarChar, 100)
                If FixedDimensionCHKB.Checked = True Then
                    cmdSQL.Parameters("@FixedDimension").Value = FixedDimensionCHKB.Text
                Else
                    cmdSQL.Parameters("@FixedDimension").Value = "NEATOL"
                End If
            End With
            con.Open()
            cmdSQL.ExecuteNonQuery()
        End Using
        ResetControls()
    End Sub
    Private Sub ResetControls()
        Dim lstChkBx As New List(Of CheckBox) From {MissedPartCHKB, MissedAutomatedPartCHKB, NotInEpicorCHKB, NonStockCHKB, MissedSTKItemCHKB, MissedBuyoutCHKB, MissedPrintsNOTSentChadCHKB, MissingPrintAfterQTYCHKB, AddedMissingDimCHKB, FixedDimensionCHKB, OtherCHKB}
        For Each chk As CheckBox In lstChkBx
            chk.Checked = False
        Next
        OtherTXTB.Text = ""
        ' eventually change the month list to automatically select based on the current date
        'If this is a ListBox
        MonthList2021.SelectedIndex = -1
    End Sub
 

Спасибо за помощь!

Комментарии:

1. Что здесь происходит: «.Add(«@StockNumber», OleDbType.Date, 100).Value = «»»

2. @AndrewMortimer Ну, в конечном итоге этот текст будет автоматически заполнен из открытой программы, но у меня это еще не настроено, поэтому пока он пуст.

3. Я также изменил . дата в .varchar

Ответ №1:

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

Таким образом, измените тип данных на DateTime и попробуйте:

 .Add("@TimeLog", OleDbType.Date).Value = DateTime.Now
 

Комментарии:

1. Как вы думаете, стоит ли явно указывать, что тип данных в таблице необходимо изменить?

2. Я так думаю. Похоже, что вопрошающий изменил его с DateTime на Short Text ; действительно, плохой ход.

3. @gustav думал, что это было причиной ошибки, мой плохой.