Как получить набор данных из запроса?

У меня есть следующий запрос SQL в MS Access / VB.net:

    Dim sql = "SELECT [Product Name], [Customer Name], [Group Associated], [Customer Address], [Product Price], [Current Stock], [Date Ordered], [Volume Purchased] FROM (torder INNER JOIN tproducts ON tproducts.Product_ID = torder.Product_ID) INNER JOIN tcustomer ON torder.Customer_ID = tcustomer.Customer_ID WHERE torder.[Date Ordered] Between #" & StartOfTimePeriod & "# And #" & Today & "#;"
    conn.Open()
    Dim dataAdapter As New OleDbDataAdapter(sql, conn)
    Dim ds As New DataSet()
    dataAdapter.Fill(ds, "torder")
    conn.Close()
    DataGridView.DataSource = ds
    DataGridView.DataMember = "torder"

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

http://prntscr.com/5eh4ge

http://prntscr.com/5eh4ai

1 ответ

Не разбрасывайте значения даты и времени. Используйте параметризованный запрос.

Dim sql = "SELECT [Product Name], [Customer Name], [Group Associated], " & _
          "[Customer Address], [Product Price], [Current Stock], [Date Ordered], " & _
          "[Volume Purchased] " & _
          "FROM (torder INNER JOIN tproducts ON tproducts.Product_ID = torder.Product_ID) " & _
          "INNER JOIN tcustomer ON torder.Customer_ID = tcustomer.Customer_ID " & _
          "WHERE torder.[Date Ordered] >= ? And torder.[Date Ordered] <= ?"

Dim dataAdapter As New OleDbDataAdapter(sql, conn)
Dim p1 = new OleDbParameter() With 
{
    .ParameterName = "@p1",
    .OleDbType = OleDbType.Date,
    .Value = StartOfTimePeriod
}
Dim p1 = new OleDbParameter() With 
{
    .ParameterName = "@p2",
    .OleDbType = OleDbType.Date,
    .Value = DateTime.Today.AddMinutes(1339)
}
dataAdapter.SelectCommand.Parameters.Add(p1)
dataAdapter.SelectCommand.Parameters.Add(p2)
....

Таким образом, правильная интерпретация ваших значений DateTime - это задание, передаваемое ядру базы данных вместе с фактическими значениями DateTime (я предполагаю, что StartOfTimePeriod является переменной DateTime). Вместо этого, если вы преобразуете эти значения в строку, преобразование будет следовать правилам вашей языковой среды, которые могут создать строку, несовместимую с ожидаемым форматом вашего механизма базы данных (например, инверсия положения значений месяцев и дней)

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