clausont5 Ответов: 4

[Решено] несоответствие типов данных в выражении критериев


Это должно быть легко, но я что-то упускаю и работаю над этим уже два дня.

Я пытаюсь вставить дату/время в короткий формат даты (дата/время ММ / ДД/гггг) в базу данных access и каждый раз получаю "несоответствие типа данных в выражении критериев". Если я закомментирую "startday", то получу" No value Given", чего я и ожидал.

Любая помощь здесь будет очень признательна.

Заранее спасибо

Я использую здесь главную страницу, если это имеет какое-то значение в данном случае. :- О : - О
Вот полный код за исключением строки подключения, которую я изменил:
Sub CrossPage_FirstPage()
        Dim strConn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=MyConnectionString"
        Dim MyCon As New OleDbConnection(strConn)
        Dim MySqlDelete As String = "delete from problemdefinition"
        Dim MySqlInsert As String = "INSERT INTO problemdefinition (memberage, sex, spouseage, numberchildren, countyid, zipcoderange, startday, dayscov) VALUES (@memberage, @sex, @spouseage, @numberchildren, @countyid, @zipcoderange, @startday, @DaysCov)"
        'Dim MySqlInsert As String = "INSERT INTO problemdefinition (client, memberage, spouseage, numberchildren, County,zipcode, startcoverage) VALUES ('" & txtName.Text & "'," & txtAge.Text & "," & txtSpouseAge.Text & "," & txtNumberChildren.Text & ")"
        Dim textboxName As TextBox = Me.PreviousPage.Master.FindControl("menu2").FindControl("txtName")
        Dim MyDate As String = DirectCast(Me.PreviousPage.Master.FindControl("menu2").FindControl("txtCalendar1"), TextBox).Text
        Dim cmd As New OleDbCommand(MySqlDelete, MyCon)
        With cmd.Parameters
            '.Add(New OleDbParameter("@client", textboxName.Text))
            '.Add(New OleDbParameter("@memberage", DirectCast(Me.PreviousPage.Master.FindControl("ContentPlaceHolder1").FindControl("txtname"), TextBox).Text))
            .Add(New OleDbParameter("@memberage", DirectCast(Me.PreviousPage.Master.FindControl("menu2").FindControl("txtAge"), TextBox).Text))
            .Add(New OleDbParameter("@sex", DirectCast(Me.PreviousPage.Master.FindControl("menu2").FindControl("rbgGender1"), RadioButtonList).Text))
            .Add(New OleDbParameter("@spouseage", DirectCast(Me.PreviousPage.Master.FindControl("menu2").FindControl("txtSpouseAge"), TextBox).Text))
            .Add(New OleDbParameter("@numberchildren", DirectCast(Me.PreviousPage.Master.FindControl("menu2").FindControl("txtNumberChildren"), TextBox).Text))
            .Add(New OleDbParameter("@countyid", DirectCast(Me.PreviousPage.Master.FindControl("menu2").FindControl("lblhidden1"), Label).Text))
            .Add(New OleDbParameter("@zipcoderange", DirectCast(Me.PreviousPage.Master.FindControl("menu2").FindControl("drpZip1"), TextBox).Text))
            '.Add(New OleDbParameter("@deductible", DirectCast(Me.PreviousPage.Master.FindControl("menu2").FindControl("DrpDed1"), DropDownList).SelectedItem.Value))
            '.Add(New OleDbParameter("@startday", DirectCast(Me.PreviousPage.Master.FindControl("menu2").FindControl("txtCalendar1"), TextBox).Text))
            .Add(New OleDbParameter("@DaysCov", DirectCast(Me.PreviousPage.Master.FindControl("menu2").FindControl("txtNumDays1"), TextBox).Text))
            .Add(New OleDbParameter("@startday", "CDate('" + MyDate + "')"))
        End With
        
        Dim result As Integer = -1
        'Use a variable to hold the SQL statement.


        If MyCon.State = ConnectionState.Closed Then
            MyCon.Open()
            cmd.CommandText = MySqlDelete
            result = cmd.ExecuteNonQuery()
            MyCon.Close()
        End If
        'If result <> -1 Then
        If MyCon.State = ConnectionState.Closed Then
            MyCon.Open()
            cmd.CommandText = MySqlInsert
            cmd.ExecuteNonQuery()
            MyCon.Close()
        End If
        'End If

        Dim StartCov As String = DirectCast(Me.PreviousPage.Master.FindControl("menu2").FindControl("txtCalendar1"), TextBox).Text

        
    End Sub

4 Ответов

Рейтинг:
2

clausont5

Я обнаружил проблему: я объявил текстовое поле строкой, а не датой.
Эту нить можно закрыть - на нее ответят.


Henry Minute

Если вы пометите этот ответ как таковой (если можете, не уверены, что действительно можете пометить один из своих собственных ответов??) он удалит вопрос из списка "активных". :)

Рейтинг:
2

OriginalGriff

Во-первых, используйте параметры.AddWithValue вместо параметров.Добавить-чем позже амортизируется.

Во-вторых, вместо чтения даты из текстового поля в строку используйте DateTime.Вместо этого попробуйте преобразовать его в DateTime-затем вы можете использовать его непосредственно с "startday" вместо использования преобразования CDate. Это также означает, что вы можете гораздо лучше контролировать формат даты и сообщать о проблемах с ним, прежде чем пытаться вставить его в базу данных.


Рейтинг:
2

clausont5

Спасибо за предложение, но, по-видимому, я не знаю, как его использовать .AddWithValue как при попытке изменить .add to .AddWithValue, это дает мне ошибку bc30455 аргумент не указан.
Будет использовать DateTime.TryParseExact, будет ли это вставлять дату в базу данных в формате "ММ/ДД/гггг"? Если да, то как мне его использовать?
Я не настолько опытен, как вы можете сказать.
Спасибо


Рейтинг:
1

Manfred Rudolf Bihy

Проблема в том, что OleDBCommand не работает с именованными параметрами.
Вместо этого вы должны вставить вопросительный знак. Когда вы добавляете параметры через:

myOleDBCmd.Parameters.Add(Object obj, SqlDBType sqltype)

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

Это дело связано с вашим:
Как хранить jpeg в Access 2007[^]

с уважением,

Манфрд