Здравствуйте. есть таблица ЕжедОтчет с полями: Код(число — счетчик, ключевое),ТабНомер(число),дата(дата, краткий формат), ЧасовВОтчете(число). Сделал форму, где вводится ТабНомер сотрудника(выбирается из поля со списком) и дата вводится в поле, формат которого я настроил как краткий формат даты. Задача в следующем: вывести количество часов, на которое выбранный сотрудник отчитался на введенную дату. Делал вывод часов по нажатию кнопки на форме:
Visual Basic | ||
|
Компилятор ругается при нажатии на кнопку:Run-time error ‘3075’:Число содержит синтаксическую ошибку в выражении запроса ‘(ТабНомер=7348)AND(Дата=27.02.2014’
По виду ошибки, вроде бы скобку теряет в конце выражения… пытался и так:
Visual Basic | ||
|
. Ругается так: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
729k174 gold badges1327 silver badges1455 bronze badges
asked Apr 3, 2017 at 11:48
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
9041 gold badge16 silver badges42 bronze badges
answered Apr 3, 2017 at 11:57
Chris PickfordChris Pickford
8,6125 gold badges42 silver badges73 bronze badges
2
Alexban65 Пользователь Сообщений: 102 Попытка к бегству |
#1 11.09.2018 15:25:13 Приветствую уважаемых форумчан!
Сам текст, вроде ничего подозрительного
Изменено: Alexban65 — 11.09.2018 15:26:14 Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины. |
||||
_Boroda_ Пользователь Сообщений: 1496 Контакты см. в профиле |
#2 11.09.2018 15:30:14
Itog и BegProekt — это переменные? а Вы их вовнутрь кавычек суете Изменено: _Boroda_ — 11.09.2018 15:31:57 Скажи мне, кудесник, любимец ба’гов… |
||
Alexban65 Пользователь Сообщений: 102 Попытка к бегству |
Itog — это таблица. Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины. |
_Boroda_ Пользователь Сообщений: 1496 Контакты см. в профиле |
Itog — допустим Скажи мне, кудесник, любимец ба’гов… |
БМВ Модератор Сообщений: 21653 Excel 2013, 2016 |
_Boroda_, Александр CDate(BegProekt) это SQL операция. Изменено: БМВ — 11.09.2018 16:02:20 По вопросам из тем форума, личку не читаю. |
_Boroda_ Пользователь Сообщений: 1496 Контакты см. в профиле |
#6 11.09.2018 15:57:28
Нет, конечно не уверен. Тем более, что в тексте
не только год порезан, но и скобка не на месте И вообще — почему ко мне вопрос-то? Изменено: _Boroda_ — 11.09.2018 15:57:55 Скажи мне, кудесник, любимец ба’гов… |
||||
Alexban65 Пользователь Сообщений: 102 Попытка к бегству |
#7 11.09.2018 15:57:49 Я пробовал различные варианты- и без CDate внутри проблемной строки.
Переменная собиралась вот так: DateBeg = CDate(UserForm.TextBox1) Ошибка и так выдавала: ‘BegProekt>01.01.201)’ Изменено: Alexban65 — 11.09.2018 16:02:28 Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины. |
||
_Boroda_ Пользователь Сообщений: 1496 Контакты см. в профиле |
Alexban65, а не пробовали DateBeg без Cdate? Или вовнутрь решеток его? И в английский формат даты? Скажи мне, кудесник, любимец ба’гов… |
БМВ Модератор Сообщений: 21653 Excel 2013, 2016 |
_Boroda_, Александр, прошу прощения, не то имя вставил в сообщении выше, не вам адресовал вопрос. Исправил. По вопросам из тем форума, личку не читаю. |
Alexban65 Пользователь Сообщений: 102 Попытка к бегству |
DateBeg — это текстовое значение из текстбокса. CDate делает его датой, поскольку его с датой и надо сравнивать. PS. Можно сделать резуме что с правой частью вроде нормально — надо разбираться с левой, где дата обрезана Сделал так DateBeg = «01/09/2018» Изменено: Alexban65 — 11.09.2018 16:15:20 Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины. |
_Boroda_ Пользователь Сообщений: 1496 Контакты см. в профиле |
#11 11.09.2018 16:23:02
Ну, про это нам рассказывать, думаю, не стОит, поверьте, мы в курсе
вот здесь: #01.09.2018# или #09.01.2018#
попробуйте
«09.01.2018» Скажи мне, кудесник, любимец ба’гов… |
||||||||
Alexban65 Пользователь Сообщений: 102 Попытка к бегству |
#12 11.09.2018 16:26:15 Перебрал вариант, с вариантами…)))
Выдало «Несоотвествие типов данных»(ожидаемо…) И такой, английсикй вариант, не помог
Изменено: Alexban65 — 11.09.2018 16:30:19 Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины. |
||||
БМВ Модератор Сообщений: 21653 Excel 2013, 2016 |
Alexban65, что за данные в источнике? От этого отталкивайтесь По вопросам из тем форума, личку не читаю. |
Alexban65 Пользователь Сообщений: 102 Попытка к бегству |
Источник в первую очередь проверил. Это поле — дата и время, то есть тип данных дата. В запросе взял два поля с типом дата из источника — все нормально, между собой в запросе работают. Изменено: Alexban65 — 11.09.2018 16:39:39 Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины. |
БМВ Модератор Сообщений: 21653 Excel 2013, 2016 |
WHERE BegProekt >» & СDate(DateBeg) пробовали? По вопросам из тем форума, личку не читаю. |
Alexban65 Пользователь Сообщений: 102 Попытка к бегству |
#16 11.09.2018 16:44:58 Да, в этой части CDate ставил — и справа и слева, и одновременно.
Изменено: Alexban65 — 11.09.2018 16:52:31 Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины. |
||
БМВ Модератор Сообщений: 21653 Excel 2013, 2016 |
Вы б проверили что у вас в результате за строка выходит дебагером. Изменено: БМВ — 11.09.2018 16:53:47 По вопросам из тем форума, личку не читаю. |
Alexban65 Пользователь Сообщений: 102 Попытка к бегству |
Так у меня дебагер на эту проблемную строку и показывает. Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины. |
БМВ Модератор Сообщений: 21653 Excel 2013, 2016 |
#19 11.09.2018 17:03:25 Alexban65, ну если не знаете как посмотреть что даст ваша текстовая конструкция
Изменено: БМВ — 11.09.2018 17:03:57 По вопросам из тем форума, личку не читаю. |
||
Alexban65 Пользователь Сообщений: 102 Попытка к бегству |
#20 11.09.2018 17:20:30 Конструкция не работает, rs.Open мешает(это рекордсет).
Изменено: Alexban65 — 11.09.2018 17:21:25 Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины. |
||
Alexban65 Пользователь Сообщений: 102 Попытка к бегству |
Пошел читать литературу — может наведет на умные мысли…)) Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины. |
БМВ Модератор Сообщений: 21653 Excel 2013, 2016 |
Alexban65, то что это рекордсэт я понимаю, просто на маленьком экране не увидел параметров сперва и СN пропустил, По вопросам из тем форума, личку не читаю. |
ivanok_v2 Пользователь Сообщений: 712 |
#23 11.09.2018 17:46:08 Alexban65, вам сначало нужно понять, в каком формате как данные дат хранятся в БД (Напр.2018-08-01 или 01/08/2018 или 01.08.18)
а в запросе не забудьте скобки одинарные.
и все у вас получиться. Изменено: ivanok_v2 — 11.09.2018 17:47:44 |
||||
БМВ Модератор Сообщений: 21653 Excel 2013, 2016 |
#24 11.09.2018 18:05:08 ivanok_v2,
допускаю, что это может быть и текст, но ТС пишет что дата По вопросам из тем форума, личку не читаю. |
||
ivanok_v2 Пользователь Сообщений: 712 |
#25 11.09.2018 18:16:08
главное что б поняли причину. Изменено: ivanok_v2 — 11.09.2018 18:16:47 |
||
Alexban65 Пользователь Сообщений: 102 Попытка к бегству |
#26 11.09.2018 18:27:06 Попробовал так:
сообщение » Число содержит синтаксическую ошибку в выражении запроса ‘Cdate(BegProekt>01.01.2018 AND BegProekt IS NOT NUL )’ «.
— ругается, а как оформить правильно константу я не знаю пока…(( Изменено: Alexban65 — 11.09.2018 18:43:32 Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины. |
||||
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#27 11.09.2018 18:44:19 Доброе время суток
Ваш SQL запрос — это текстовая строка. Дата в этой строке, как константа, должна быть в соответствующем формате , а не так как вам показывают в таблице (это зависит от региональных настроек). |
||
Alexban65 Пользователь Сообщений: 102 Попытка к бегству |
#28 11.09.2018 18:47:52
Спасибо, ценная инфа для понимания Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины. |
||
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#29 11.09.2018 18:55:51
Переключите локаль на штатовский английский будет 09/25/2018 — и что, в чём доказательство? Правильный формат даты в запросе.
Изменено: Андрей VG — 11.09.2018 18:58:31 |
||||
Alexban65 Пользователь Сообщений: 102 Попытка к бегству |
#30 11.09.2018 22:29:47 Андрей VG,
Такая конструкция в WHERE, в моем запросе, привела DateBeg к виду #08/01/2018#, отрабатывает без ошибок, recordcet создается и кладется на лист.
Премного благодарен всем за участие и внимание. Изменено: Alexban65 — 11.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);