2014-12-08 7 views
0

У меня есть следующий 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

+0

Что вы ожидаете? Сколько записей вы получаете при запуске этого запроса в msaccess и при запуске с помощью приложения? – DevelopmentIsMyPassion

+0

Какой тип [Дата заказа] в определении таблицы базы данных? – Steve

+0

[Дата заказа] - дата/время – Michael

ответ

2

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

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). Вместо этого, если вы преобразуете эти значения в строку, преобразование соответствует правилам вашей языковой среды, которые могут привести к тому, что строка несовместима с ожидаемым форматом вашего механизма базы данных (например, инверсия позиции значений месяцев и дней)