Gridview не заполняется из базы данных доступа с запросом параметров - VB

У меня есть страница, на которой я пытаюсь заполнить gridview (gvClockings) нажатием кнопки на основе выбора в раскрывающемся списке (cbLocation) и даты от/до, введенной в текстовые поля из календаряextender (txtFrom и txtTo).

Я протестировал оператор SQL, и он получает ожидаемые результаты, если я запускаю его в Access (и у меня есть аналогичный SQL, отлично работающий с gridview в другой форме в этом решении), однако в этой форме независимо от того, что я выбираю в 3 управления, gridview не будет отображать никаких записей.

cbLocation заполняется в Page_Load, как показано ниже:

If Not Page.IsPostBack Then
        Dim ddl As DropDownList = cbLocation
        Dim ir As ListItem = New ListItem
        Dim ee As ListItem = New ListItem
        ir.Text = "IR Room"
        ir.Value = "IR Room"
        ee.Text = "Employee Exit"
        ee.Value = "Employee Exit"
        ddl.Items.Add(ir)
        ddl.Items.Add(ee)
    End If

Затем у меня есть приведенный ниже код для получения данных и заполнения сетки:

    Private Sub GetClockings(ByVal LLName As String, ByVal FromDate As String, ByVal ToDate As String)

    Dim conclock As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; DATA SOURCE=\\xxx.xx.xxx.xx\AccuFace\pspcms.mdb;Jet OLEDB:Database Password=xxxxx;")
    Dim daClocking As OleDbDataAdapter = New OleDbDataAdapter
    Dim selectSQL As String = "SELECT efrLog.LFirstName, efrLog.LLastName, efrLog.LDepartment, efrLog.LDate, efrLog.LTime, efrLog.LType, efrLog.LLName FROM efrLog WHERE (((efrLog.LDate) Between [@FROMDATE] And [@TODATE]) AND ((efrLog.LLName)=[@LLName])) ORDER BY efrLog.LDepartment, efrLog.LTime"
    Dim selectCMD As OleDbCommand = New OleDbCommand(selectSQL, conclock)
    daClocking.SelectCommand = selectCMD

    selectCMD.Parameters.AddWithValue("@LLName", LLName)
    selectCMD.Parameters.AddWithValue("@FROMDATE", FromDate)
    selectCMD.Parameters.AddWithValue("@TODATE", ToDate)

    Dim dsClockings As DataSet = New DataSet
    daClocking.Fill(dsClockings, "efrLog")

    If dsClockings.Tables("efrLog").Rows.Count > 0 Then
        gvClockings.DataSource = dsClockings.Tables("efrLog")
        gvClockings.DataBind()
    Else
        lblNotFound.Text = "No clockings found for this location"
        lblNotFound.Visible = True
        Exit Sub
    End If
End Sub

Приведенный выше код вызывается из Button_click, как показано ниже:

Dim LLName As String
    Dim FromDate As String = txtFrom.Text
    Dim ToDate As String = txtTo.Text


    If cbLocation.SelectedValue = "IR Room" Then
        LLName = "IR Room"
        GetClockings(LLName, FromDate, ToDate)
    End If

    If cbLocation.SelectedValue = "Employee Exit" Then
        LLName = "Employee Exit"
        GetClockings(LLName, FromDate, ToDate)
    End If

    lblLocation.Text = "Clocking report for " & cbLocation.SelectedValue.ToString() & " generated on " & Date.Now
    lblLocation.Visible = True

Я отлаживал локально, насколько это возможно (я использую базу данных доступа на удаленном сервере из IIS, поэтому получаю ошибки, связанные со строкой подключения/разрешениями, при попытке заполнить набор данных при локальном запуске. Я знаю, что это ужасная настройка, но это то, что Мне дали поработать, и я не знаю, как отлаживать удаленно) и, насколько я вижу, параметры получают правильные значения (см. Ниже)

Снимок экрана

Данные, которые я запрашиваю из базы данных, определенно существуют, поэтому я совершенно не понимаю, почему не заполняется gridview. Любая помощь будет принята с благодарностью. Спасибо


person Jimsan    schedule 24.05.2013    source источник


Ответы (1)


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

Старайтесь соблюдать порядок определения параметров в тексте команды таким образом

Dim selectSQL As String = "SELECT .....FROM ... WHERE " & _
                          "(((efrLog.LDate) Between [@FROMDATE] And [@TODATE]) AND " & _
                          "((efrLog.LLName)=[@LLName])) " & _
                          "ORDER BY efrLog.LDepartment, efrLog.LTime"

selectCMD.Parameters.AddWithValue("@FROMDATE", FromDate)
selectCMD.Parameters.AddWithValue("@TODATE", ToDate)
selectCMD.Parameters.AddWithValue("@LLName", LLName)
person Steve    schedule 24.05.2013
comment
Спасибо, Стив, сработало отлично. Я не знал, что это так. Спасибо за вашу помощь - person Jimsan; 24.05.2013