Access число содержит синтаксическую ошибку в выражении запроса

Студворк — интернет-сервис помощи студентам

Здравствуйте. есть таблица ЕжедОтчет с полями: Код(число — счетчик, ключевое),ТабНомер(число),дата(дата, краткий формат), ЧасовВОтчете(число). Сделал форму, где вводится ТабНомер сотрудника(выбирается из поля со списком) и дата вводится в поле, формат которого я настроил как краткий формат даты. Задача в следующем: вывести количество часов, на которое выбранный сотрудник отчитался на введенную дату. Делал вывод часов по нажатию кнопки на форме:

Visual Basic
1
2
3
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("SELECT SUM(ЧасовВОтчете) AS ИТОГЧас FROM ЕжедОтчет Where (ТабНомер=" & Me.Сотрудники & ")AND(Дата=" & Me.Поле7 & ")")
Поле3 = rs.Fields(0).Value

Компилятор ругается при нажатии на кнопку:Run-time error ‘3075’:Число содержит синтаксическую ошибку в выражении запроса ‘(ТабНомер=7348)AND(Дата=27.02.2014’
По виду ошибки, вроде бы скобку теряет в конце выражения… пытался и так:

Visual Basic
1
...& ")AND(Дата=" & Me.Поле7 & "))")

. Ругается так:Run-time error ‘3075’:Число содержит синтаксическую ошибку в выражении запроса ‘(ТабНомер=7348)AND(Дата=27.02.2014))’.В чем баг получается? помогите пожалуйста

В общем, проблема была в датах и оно решается если писать не так напрямую как я, а через AddWithValue что-то типа:

command1.CommandText = "INSERT INTO Телепрограммы (Телеканал, [Название телепередачи], Тип, Жанр, Дата, [Время начала передачи], [Длительность передачи], [Время окончания]) Values (@Телеканал, @Название_телепередачи, @Тип, @Жанр, @Дата, @Время_начала_передачи, @Длительность_передачи, @Время_окончания)";
    command1.Parameters.AddWithValue("@Телеканал", comboBox1.SelectedIndex + 1);
                command1.Parameters.AddWithValue("@Название_телепередачи", textBox2.Text);
                command1.Parameters.AddWithValue("@Тип", textBox3.Text);
                command1.Parameters.AddWithValue("@Жанр", textBox4.Text);
                command1.Parameters.AddWithValue("@Дата", textBox5.Text);
                command1.Parameters.AddWithValue("@Время_начала_передачи", textBox6.Text);
                command1.Parameters.AddWithValue("@Длительность_передачи", textBox7.Text);
                command1.Parameters.AddWithValue("@Время_окончания", textBox8.Text);

I’m using a MS Access database. I want to get first and last records that are in between 2 dates. But I get error when using a BETWEEN operator:

Syntax error in number in query expression ‘Datum_k BETWEEN 3.4.2017. AND 3.4.2017.’.

My code:

private void GetPrviZadnjiBrojRacuna()
{
    OleDbCommand commandOD = new OleDbCommand("SELECT Dokument FROM DnevniPromet WHERE (Datum_k BETWEEN " + datumOd + " AND " + datumDo + ") ORDER BY [Datum_k] ASC", dataModel.CS);
    OleDbCommand commandDO = new OleDbCommand("SELECT Dokument FROM DnevniPromet WHERE [Datum_k] >= " + datumOd + " AND [Datum_k] <= " + datumDo + " ORDER BY [Datum_k] DESC", dataModel.CS);

    try
    {
        dataModel.DT.Clear();
        OleDbDataAdapter ODbDA = new OleDbDataAdapter(commandOD);

        if (!dataModel.CS.State.Equals(ConnectionState.Open))
        {
            dataModel.CS.Open();
        }

        // GET OD 
        ODbDA.Fill(dataModel.DT);
        odRacuna = dataModel.DT.Rows[0].ToString();

        // GET DO
        ODbDA.SelectCommand = commandDO; 
        dataModel.DT.Clear();
        ODbDA.Fill(dataModel.DT);

        doRacuna = dataModel.DT.Rows[0].ToString();

        dataModel.CS.Close();
        dataModel.DataLoaded = true;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

marc_s's user avatar

marc_s

729k174 gold badges1327 silver badges1455 bronze badges

asked Apr 3, 2017 at 11:48

solujic's user avatar

4

Addressing two issues with your code snippet:

  • You should never use string interpolation to build a query. This lends itself to SQL injection. Many, many topics surrounding this. I suggest you read up.
  • You have missed the ' single quotes around your date strings.

Using parameterised queries, you can kill two birds with one stone:

OleDbCommand commandOD = new OleDbCommand(@"
    SELECT Dokument
    FROM DnevniPromet
    WHERE (Datum_k BETWEEN @datumOd AND @datumDo)
    ORDER BY [Datum_k] ASC", dataModel.CS);

commandOD.Parameters.AddRange(new OleDbParameter[]
{
    new OleDbParameter("@datumOd", datumOd),
    new OleDbParameter("@datumDo", datumDo)
});

solujic's user avatar

solujic

9041 gold badge16 silver badges42 bronze badges

answered Apr 3, 2017 at 11:57

Chris Pickford's user avatar

Chris PickfordChris Pickford

8,6125 gold badges42 silver badges73 bronze badges

2

 

Alexban65

Пользователь

Сообщений: 102
Регистрация: 08.09.2018

Попытка к бегству

#1

11.09.2018 15:25:13

Приветствую уважаемых форумчан!
Не могу в WHERE сравнить даты в запросе, выдает сообщение  » Число содержит синтаксическую ошибку в выражении запроса ‘Cdate(BegProekt>01.01.201)’ «.
Проверил содержание переменной DateBeg — все верно, тип Date, содержит значение 01.01.2018.
Однако в сообщение дата обозвана числом и почему то обрезана справа до 01.01.201 — выглядит подозрительно.
И почему ошибка именно синтаксическая — непонятно…
Перебрал варианты которые знал — не помогло…
Помогите разобраться, не могу понять где ошибся в строке:

Код
rs.Open "SELECT * FROM Itog WHERE CDate(BegProekt) >" & DateBeg & " ORDER BY 1", cn, adOpenDynamic, adLockBatchOptimistic

Сам текст, вроде ничего подозрительного

Код
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)

Dim DateBeg As String

DateBeg = UserForm.TextBox1
MsgBox TypeName(DateBeg)
MsgBox DateBeg

cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & Worksheets("Config").Cells(3, 2) & "Project.mdb; Jet OLEDB:Database;"
cn.Open ConnectionString

DateBeg = CDate(UserForm.TextBox1)
MsgBox TypeName(DateBeg)
MsgBox DateBeg

rs.Open "SELECT * FROM Itog WHERE CDate(BegProekt) >" & DateBeg & ", cn, adOpenDynamic, adLockBatchOptimistic
 'rs.Open "SELECT * FROM Itog WHERE BegProekt >" & CDate(UserForm.TextBox1) & ", cn, adOpenDynamic, adLockBatchOptimistic'

End Sub

Изменено: Alexban6511.09.2018 15:26:14

Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.

 

_Boroda_

Пользователь

Сообщений: 1496
Регистрация: 27.07.2013

Контакты см. в профиле

#2

11.09.2018 15:30:14

Код
"SELECT * FROM " & Itog & " WHERE " & CDate(BegProekt) & " >" & DateBeg ...

Itog и BegProekt — это переменные? а Вы их вовнутрь кавычек суете

Изменено: _Boroda_11.09.2018 15:31:57

Скажи мне, кудесник, любимец ба’гов…

 

Alexban65

Пользователь

Сообщений: 102
Регистрация: 08.09.2018

Попытка к бегству

Itog — это таблица.
BegProekt — это поле из Itog
Без дат эта строка работает.

Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.

 

_Boroda_

Пользователь

Сообщений: 1496
Регистрация: 27.07.2013

Контакты см. в профиле

Itog — допустим
А вот как Вы берете CDate внутри текста — вот это мне непонятно

Скажи мне, кудесник, любимец ба’гов…

 

БМВ

Модератор

Сообщений: 21653
Регистрация: 28.12.2016

Excel 2013, 2016

_Boroda_, Александр CDate(BegProekt) это SQL операция.
Alexban65, а вы уверены, что она нужна?

Изменено: БМВ11.09.2018 16:02:20

По вопросам из тем форума, личку не читаю.

 

_Boroda_

Пользователь

Сообщений: 1496
Регистрация: 27.07.2013

Контакты см. в профиле

#6

11.09.2018 15:57:28

Цитата
БМВ написал:
_Boroda_ , а вы уверены, что она нужна?

Нет, конечно не уверен. Тем более, что в тексте

Цитата
Alexban65 написал:
‘Cdate(BegProekt>01.01.201)’

не только год порезан, но и скобка не на месте

И вообще — почему ко мне вопрос-то?

Изменено: _Boroda_11.09.2018 15:57:55

Скажи мне, кудесник, любимец ба’гов…

 

Alexban65

Пользователь

Сообщений: 102
Регистрация: 08.09.2018

Попытка к бегству

#7

11.09.2018 15:57:49

Я пробовал различные варианты- и без CDate внутри проблемной строки.

Код
rs.Open "SELECT * FROM Itog WHERE BegProekt >" & DateBeg & " ORDER BY 1", cn, adOpenDynamic, adLockBatchOptimistic

Переменная собиралась вот так: DateBeg = CDate(UserForm.TextBox1)

Ошибка и так выдавала: ‘BegProekt>01.01.201)’

Изменено: Alexban6511.09.2018 16:02:28

Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.

 

_Boroda_

Пользователь

Сообщений: 1496
Регистрация: 27.07.2013

Контакты см. в профиле

Alexban65, а не пробовали DateBeg  без Cdate? Или вовнутрь решеток его? И в английский формат даты?

Скажи мне, кудесник, любимец ба’гов…

 

БМВ

Модератор

Сообщений: 21653
Регистрация: 28.12.2016

Excel 2013, 2016

_Boroda_, Александр, прошу прощения, не то имя вставил в сообщении выше, не вам адресовал вопрос. Исправил.

По вопросам из тем форума, личку не читаю.

 

Alexban65

Пользователь

Сообщений: 102
Регистрация: 08.09.2018

Попытка к бегству

DateBeg — это текстовое значение из текстбокса. CDate делает его датой, поскольку его с датой и надо сравнивать.
Про решетки — где их ставить, попробую.
Формат даты пробовал разный  — с точками и с слешем.
Возможно собака порылась где то в этом районе…))

PS. Можно сделать резуме что с правой частью вроде нормально — надо разбираться с левой, где дата обрезана

Сделал так DateBeg = «01/09/2018»
Ошибки нет, но и реакции никакой — рекордсет видимо пустой

Изменено: Alexban6511.09.2018 16:15:20

Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.

 

_Boroda_

Пользователь

Сообщений: 1496
Регистрация: 27.07.2013

Контакты см. в профиле

#11

11.09.2018 16:23:02

Цитата
Alexban65 написал:
DateBeg — это текстовое значение из текстбокса. CDate делает его датой, поскольку его с датой и надо сравнивать

Ну, про это нам рассказывать, думаю, не стОит, поверьте, мы в курсе  :D

Цитата
Alexban65 написал:
Про решетки — где их ставить, попробую.

вот здесь: #01.09.2018# или #09.01.2018#

Цитата
Alexban65 написал:
Сделал так DateBeg = «01/09/2018»

попробуйте

Цитата
_Boroda_ написал:
в английский формат даты?

«09.01.2018»

Скажи мне, кудесник, любимец ба’гов…

 

Alexban65

Пользователь

Сообщений: 102
Регистрация: 08.09.2018

Попытка к бегству

#12

11.09.2018 16:26:15

Перебрал вариант, с вариантами…)))

Код
DateBeg = "#09/01/2018#" 'CDate(UserForm.TextBox1)
DateBeg = CDate(DateBeg)

Выдало «Несоотвествие типов данных»(ожидаемо…)

И такой, английсикй вариант, не помог

Код
DateBeg = "09.01.2018" 'CDate(UserForm.TextBox1)
DateBeg = CDate(DateBeg)
MsgBox TypeName(DateBeg)

Изменено: Alexban6511.09.2018 16:30:19

Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.

 

БМВ

Модератор

Сообщений: 21653
Регистрация: 28.12.2016

Excel 2013, 2016

Alexban65, что за данные в источнике? От этого отталкивайтесь

По вопросам из тем форума, личку не читаю.

 

Alexban65

Пользователь

Сообщений: 102
Регистрация: 08.09.2018

Попытка к бегству

Источник  в первую очередь проверил. Это поле  — дата и время, то есть тип данных дата.
Хотя меня время смущает — может быть маленькое несоответствие.
Может на пути из Акцесса в Ексель что то на лету происходит?

В запросе взял два поля с типом дата  из источника — все нормально, между собой в запросе работают.

Изменено: Alexban6511.09.2018 16:39:39

Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.

 

БМВ

Модератор

Сообщений: 21653
Регистрация: 28.12.2016

Excel 2013, 2016

WHERE BegProekt >» & СDate(DateBeg)  пробовали?

По вопросам из тем форума, личку не читаю.

 

Alexban65

Пользователь

Сообщений: 102
Регистрация: 08.09.2018

Попытка к бегству

#16

11.09.2018 16:44:58

Да, в этой части CDate ставил — и справа и слева, и одновременно.
И даже CDate(UserForm.TextBox1)….
Стоп.
С одним амперсендом???????
Ругается, если так

Код
rs.Open "SELECT * FROM Itog WHERE BegProekt<" & CDate(DateBeg) 

Изменено: Alexban6511.09.2018 16:52:31

Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.

 

БМВ

Модератор

Сообщений: 21653
Регистрация: 28.12.2016

Excel 2013, 2016

Вы б проверили что у вас в результате за строка выходит дебагером.
а также RS — это у вас что за объект? От куда он сразу с .OPEN берется?

Изменено: БМВ11.09.2018 16:53:47

По вопросам из тем форума, личку не читаю.

 

Alexban65

Пользователь

Сообщений: 102
Регистрация: 08.09.2018

Попытка к бегству

Так у меня дебагер на эту проблемную строку и показывает.
А как посмотреть дебагером, что с этой строкой не такк — опыта еще нет.
Да и сомневаюсь что дебагер будет разбирать строку.
Но будем пробовать…

Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.

 

БМВ

Модератор

Сообщений: 21653
Регистрация: 28.12.2016

Excel 2013, 2016

#19

11.09.2018 17:03:25

Alexban65, ну если не знаете как посмотреть что даст ваша текстовая конструкция
«SELECT * FROM Itog WHERE CDate(BegProekt) >» & DateBeg & » ORDER BY 1″
то

Код
debug.print "SELECT * FROM Itog WHERE BegProekt >" & Cdate(DateBeg) & " ORDER BY 1"

Изменено: БМВ11.09.2018 17:03:57

По вопросам из тем форума, личку не читаю.

 

Alexban65

Пользователь

Сообщений: 102
Регистрация: 08.09.2018

Попытка к бегству

#20

11.09.2018 17:20:30

Конструкция не работает, rs.Open мешает(это рекордсет).

Код
Debug.Print rs.Open "SELECT * FROM Itog WHERE BegProekt >" & CDate(DateBeg) & "", cn, adOpenDynamic, adLockBatchOptimistic

Изменено: Alexban6511.09.2018 17:21:25

Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.

 

Alexban65

Пользователь

Сообщений: 102
Регистрация: 08.09.2018

Попытка к бегству

Пошел читать литературу — может наведет на умные мысли…))

Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.

 

БМВ

Модератор

Сообщений: 21653
Регистрация: 28.12.2016

Excel 2013, 2016

Alexban65,  то что это рекордсэт я понимаю, просто на маленьком экране не увидел параметров сперва и СN пропустил,
но вот указывать его в дебаге не писал.

По вопросам из тем форума, личку не читаю.

 

ivanok_v2

Пользователь

Сообщений: 712
Регистрация: 19.08.2018

#23

11.09.2018 17:46:08

Alexban65, вам сначало нужно понять, в каком формате как данные дат хранятся в БД (Напр.2018-08-01 или 01/08/2018 или 01.08.18)
потом нужно написать свою функцию которая дату будет преврящать в строку в нужном формате
например

Код
with vba
   DateBeg$=.day(.now) & "/" & .month(.now) & "/" & .year(.now)
end with


а в запросе не забудьте скобки одинарные.

Код
"SELECT * FROM Itog WHERE BegProekt >'" & Cdate(DateBeg) & "' ORDER BY 1"

 и все у вас получиться.

Изменено: ivanok_v211.09.2018 17:47:44

 

БМВ

Модератор

Сообщений: 21653
Регистрация: 28.12.2016

Excel 2013, 2016

#24

11.09.2018 18:05:08

ivanok_v2,

Цитата
Alexban65 написал:
Это поле  — дата и время, то есть тип данных дата.

допускаю, что это может быть и текст, но ТС пишет что дата
Почему не просто Format(Date, «YYYY-MM-DD HH:MM:SS») или подобное?
про одинарные «скобки» да, могут потребоваться, только это не скобки.

По вопросам из тем форума, личку не читаю.

 

ivanok_v2

Пользователь

Сообщений: 712
Регистрация: 19.08.2018

#25

11.09.2018 18:16:08

Цитата
БМВ написал:
только это не скобки.

главное что б поняли причину.
В таких случаях лучше писать запрос в аксесе, а потом запрос собирать по аналогии в вба

Изменено: ivanok_v211.09.2018 18:16:47

 

Alexban65

Пользователь

Сообщений: 102
Регистрация: 08.09.2018

Попытка к бегству

#26

11.09.2018 18:27:06

Попробовал так:

Код
rs.Open "SELECT * FROM Itog WHERE BegProekt >" & DateBeg & " AND BegProekt is not null ", cn, adOpenDynamic, adLockBatchOptimistic

сообщение  » Число содержит синтаксическую ошибку в выражении запроса ‘Cdate(BegProekt>01.01.2018 AND BegProekt IS NOT NUL )’ «.
Опять откусил справа символ от NULL…
Ох, неспроста это…
Чудес не бывает, ошибка скорее всего перед глазами,  на виду…)))
Сходил в источник(ACCESS), открыл таблицу, поглядел формат — дата стоит в формате 25.09.2018, то есть штатно.
Функция возвращает значение, сначала попробую подставить константу типа «01.08.2018»…
Поставил

Код
& CDate("01.08.2018") & 

 — ругается, а  как оформить правильно константу я не знаю пока…((
Хотя, если я правильно понимаю, одинарные кавычки это признак строковой переменной.
Составил запрос в акцесе, выбрал все поля с типом дата, попробую собрать его в екселе, будем смотреть, пробовать…

Изменено: Alexban6511.09.2018 18:43:32

Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#27

11.09.2018 18:44:19

Доброе время суток

Цитата
Alexban65 написал:
открыл таблицу, поглядел формат — дата стоит в формате 25.09.2018, то есть штатно.

Ваш SQL запрос — это текстовая строка. Дата в этой строке, как константа,

должна быть в соответствующем формате

, а не так как вам показывают в таблице (это зависит от региональных настроек).

 

Alexban65

Пользователь

Сообщений: 102
Регистрация: 08.09.2018

Попытка к бегству

#28

11.09.2018 18:47:52

Цитата
Андрей VG написал:
Доброе время сутокЦитата Alexban65  написал:открыл таблицу, поглядел формат — дата стоит в формате 25.09.2018, то есть штатно.Ваш SQL запрос — это текстовая строка. Дата в этой строке, как константа,  должна быть в соответствующем формате , а не так как вам показывают в таблице (это зависит от региональных настроек).

Спасибо, ценная инфа для понимания

Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#29

11.09.2018 18:55:51

Цитата
Alexban65 написал:
написал:открыл таблицу, поглядел формат — дата стоит в формате 25.09.2018

Переключите локаль на штатовский английский будет 09/25/2018 — и что, в чём доказательство? Правильный формат даты в запросе.

Код
"#" & Format$(Date, "mm/dd/yyyy") & "#"

Изменено: Андрей VG11.09.2018 18:58:31
(А вот откуда лишняя открывающая скобка?)

 

Alexban65

Пользователь

Сообщений: 102
Регистрация: 08.09.2018

Попытка к бегству

#30

11.09.2018 22:29:47

Андрей VG,

Цитата
Андрей VG написал:
Переключите локаль на штатовский английский будет 09/25/2018 — и что, в чём доказательство? Правильный формат даты в запросе.

Код
"#" & Format$(Date, "mm/dd/yyyy") & "#"

Такая конструкция в WHERE, в моем запросе, привела DateBeg к виду #08/01/2018#,  отрабатывает без ошибок, recordcet создается и кладется на лист.
Самостоятельно, новичку, такое отработать очень даже проблематично, если не сказать больше…
Вот такой получился работоспособный вид:

Код
DateBeg=CDate(UserForm.TextBox1)
DateBeg = "#" & Format$(DateBeg, "mm/dd/yyyy") & "#"
'MsgBox TypeName(DateBeg)'
'MsgBox DateBeg'
rs.Open "SELECT * FROM Itog WHERE BegProekt >" & DateBeg & "  ", cn, adOpenDynamic, adLockBatchOptimistic

Премного благодарен всем за участие и внимание.
И особенно — за терпение…;-)
Всех вам благ, друзья…))

Изменено: Alexban6511.09.2018 22:31:19

Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.

В общем, проблема была в датах и оно решается если писать не так напрямую как я, а через AddWithValue что-то типа:

command1.CommandText = "INSERT INTO Телепрограммы (Телеканал, [Название телепередачи], Тип, Жанр, Дата, [Время начала передачи], [Длительность передачи], [Время окончания]) Values (@Телеканал, @Название_телепередачи, @Тип, @Жанр, @Дата, @Время_начала_передачи, @Длительность_передачи, @Время_окончания)";
    command1.Parameters.AddWithValue("@Телеканал", comboBox1.SelectedIndex + 1);
                command1.Parameters.AddWithValue("@Название_телепередачи", textBox2.Text);
                command1.Parameters.AddWithValue("@Тип", textBox3.Text);
                command1.Parameters.AddWithValue("@Жанр", textBox4.Text);
                command1.Parameters.AddWithValue("@Дата", textBox5.Text);
                command1.Parameters.AddWithValue("@Время_начала_передачи", textBox6.Text);
                command1.Parameters.AddWithValue("@Длительность_передачи", textBox7.Text);
                command1.Parameters.AddWithValue("@Время_окончания", textBox8.Text);

Возможно, вам также будет интересно:

  • Abbyy finereader ошибка при обращении к файлу конец файла
  • Abbyy finereader ошибка при конвертации
  • Abbyy finereader ошибка на сервере
  • Abbyy finereader ошибка драйвера устройства kyocera
  • Abbyy finereader код ошибки 250

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии