Surviving Panda Ответов: 2

Запрос MS access между двумя столбцами


Hi!
I have an access database with forms. I created a query that would filter records between range. The criteria will be coming from a textbox.


Что я уже пробовал:

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

"SELECT TrainingType, Condensed FROM tblOTrainings WHERE LowerBound = " & .txtCJobLevel.Text & " BETWEEN LowerBound AND UpperBound"

Richard Deeming

Кроме того, у вас есть синтаксическая ошибка в вашем запросе:

WHERE LowerBound = ? BETWEEN LowerBound AND UpperBound

Вы хотите найти записи, где значение текстового поля находится между двумя столбцами?
WHERE ? BETWEEN LowerBound AND UpperBound

Surviving Panda

Да, это должно выглядеть так: "где ? Между Нижним и верхним " где ? это ввод из текстового поля. Как я буду параметризовать критерии с помощью промежуточного запроса?

2 Ответов

Рейтинг:
20

Richard Deeming

Используйте параметризованный запрос и исправьте синтаксическую ошибку:

Using connection As New OleDbConnection("...")
    Using command As New OleDbCommand("SELECT TrainingType, Condensed FROM tblOTrainings WHERE @CJobLevel BETWEEN LowerBound AND UpperBound", connection)
        command.Parameters.AddWithValue("@CJobLevel", txtCJobLevel.Text)
        
        Dim table As New DataTable()
        Dim da As New OleDbDataAdapter(command)
        da.Fill(table)
        ...
    End Using
End Using


Surviving Panda

Привет, ниже приведен мой код с использованием параметров

спицы.Открыть()
КМД = СN.CreateCommand
УМК.CommandText = " SELECT TrainingType, сжатый из tblOTrainings, где @CJobLevel между LowerBound и UpperBound"
УМК.Параметры.AddWithValue ("@CJobLevel", . txtCJobLevel. Text)
УМК.Метод executenonquery()

Дим таблицу в качестве нового объекта DataTable
Dim da как новый OleDbDataAdapter(cmd)
да.Заполнить(табл.)

Для каждого доктора, как datarow в ДТ.Строк
.dgCTraining.Строк.Добавить()
С frmPersonalTraining.dgCTraining.Строк(frmPersonalTraining.dgCTraining.Строк.Количество-1)
Клетки("тренировка").Value = dr ("TrainingType")
.Клеток("лайн").Значение = dr ("конденсированный")
Конец С
Следующий
спицы.Рядом()

Прав ли я, что после строки da.fill(table) я вставил код, который отображал бы результат в datagridview? Он по-прежнему имеет ошибку без значения.

Извините, если я задаю слишком много вопросов.

Richard Deeming

Самый простой способ, вероятно, состоит в том, чтобы использовать BindingSource чтобы привязать данные к сетке:
Как привязать данные к элементу управления Windows Forms DataGridView[^]

Вы также захотите удалить это cms.ExecuteNonQuery() линия, которая ничего не делает.

Dave Kreskowiak

Это может показаться глупым, но вы заменили "LowerBound" и "UpperBound" фактическими значениями или оставили этот текст в этом запросе без какого-либо определения того, что представляют собой "LowerBound" и "UpperBound"?

Richard Deeming

Я предполагал, что это имена столбцов в таблице. :)

Dave Kreskowiak

Поначалу я тоже так думал, но потом от этого стало разить "нубом". Я начал думать, что это работа copy'n'paste какого-то примера где-то.

Surviving Panda

Да, нижняя и верхняя границы-это имена столбцов в моей таблице.

Surviving Panda

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

Dave Kreskowiak

Если LowerBound и UpperBound являются фактическими именами столбцов в одной и той же таблице, запрос будет использовать значения в той же строке, что и вычисляемое значение.

Surviving Panda

Спасибо Ричарду за ответы на мои вопросы. У меня все еще нет большого опыта в использовании базы данных. Надеюсь, я смогу это выяснить. Большое вам спасибо!

Рейтинг:
10

Surviving Panda

Привет, Ричард и Дэйв, просто хочу сообщить вам, что мой код теперь работает. :) Спасибо за ваши ответы!

cn.Open()
 cmd = cn.CreateCommand
 cmd.CommandText = "SELECT Course, Condensed FROM tblOTrainings WHERE @CJobLevel BETWEEN LowerBound AND UpperBound"
 cmd.Parameters.AddWithValue("@CJobLevel", .txtOJobLevel.Text)

 Dim table As New DataTable("tblOTrainings")
 Dim da As New OleDbDataAdapter(cmd)
 da.Fill(table)
 .dgOTraining.DataSource = table