Ошибка при получении дат в базе данных (BETWEEN Clause | VB.NET | OLE) - PullRequest
0 голосов
/ 07 декабря 2009

Перед тем, как немного времени, я использовал код для получения дат между двумя датами из базы данных (столбец с датами дд / мм / гг), я думаю, что это хорошо работает в первый раз, код:

      Dim b As New Date
            Dim a As Integer
            a = Val(tx2.Text)
            b = System.DateTime.Today
            b = b.AddDays(-a)

             MsgBox(b)
 Conn.Open()
  SQLstr = " Select * from tb where lastvstart BETWEEN #01/01/1800# AND #" & b & "#"
 Dim DataAdapter1 As New OleDbDataAdapter(SQLstr, Conn)
   DataSet1.Clear()

        DataAdapter1.Fill(DataSet1, "Tb")
        Conn.Close()

как вы видите, код позволяет пользователю вставить число и минус оно формирует сегодняшнюю дату, затем вычисляет желаемую дату, после чего я использую предложение BETWEEN, чтобы получить все даты между ними

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

Ответы [ 2 ]

2 голосов
/ 07 декабря 2009

Если вы посмотрите на сгенерированную строку SQL, содержит ли она ожидаемую дату? Я бы предположил, что база данных требует, чтобы она следовала определенному формату (либо dd/MM/yyyy, либо MM/dd/yyyy с учетом жестко закодированной даты в запросе) Может ли быть так, что ваш день и месяц меняются местами, когда строковая версия даты создается и вставляется в ваш SQL-запрос?

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

Обновление
Вот пример использования параметризованного запроса через OLE DB к базе данных Access:

Using connection As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""C:\path\file.mdb""")
    Using cmd As New OleDbCommand("select * from tb where lastvstart BETWEEN ? AND ?", connection)

        Dim param As OleDbParameter

        ' add first date '
        param = New OleDbParameter()
        param.DbType = DbType.Date
        param.Value = New DateTime(1800, 1, 1)
        cmd.Parameters.Add(param)

        'add second date '
        param = New OleDbParameter()
        param.DbType = DbType.Date
        param.Value = DateTime.Today.AddDays(-a)
        cmd.Parameters.Add(param)
        cmd.Parameters.Add(New OleDbParameter())

        connection.Open()
        Using adapter As New OleDbDataAdapter(cmd)
            Using ds As New DataSet()
                adapter.Fill(ds)
                Console.WriteLine(ds.Tables(0).Rows.Count)
            End Using ' DataSet ' 
        End Using ' OleDbDataAdapter '
    End Using ' OleDbCommand '
End Using ' OleDbConnection ' 
1 голос
/ 07 декабря 2009

Вы не можете изменить Sqlstr на

SQLstr = " Select * from tb where lastvstart <= '" & b.ToString("dd MMM yyyy") & "'";

РЕДАКТИРОВАТЬ, изменение на основе БД

Используйте эту строку и проверьте, работает ли она

SQLstr = " Select * from tb where lastvstart <= #" & b.ToString("dd MMM yyyy") & "#";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...