+16
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
QString QSqlResultPrivate::positionalToNamedBinding()
{
int n = sql.size();
QString result;
result.reserve(n * 5 / 4);
bool inQuote = false;
int count = 0;
for (int i = 0; i < n; ++i) {
QChar ch = sql.at(i);
if (ch == QLatin1Char('?') && !inQuote) {
result += qFieldSerial(count++);
} else {
if (ch == QLatin1Char('\''))
inQuote = !inQuote;
result += ch;
}
}
result.squeeze();
return result;
}
// Пример запроса:
// select * from some where d_t = "2012-11-08 12:00:00"
Словили сегодня вот такой глюк в кутишечке.
База данных отлично понимает строки и даты в двойных кавычках, все это даже работало какое-то время. Но когда попытались исполнить запрос с таймштампом в двойных кавычках (как в строке 25), начала возникать ошибка в духе "непонятные символы в дате". В одинарных же кавычках все работало. После копания в исходниках и гуглёжки выяснилась и причина - QtSql в упор не видит двойных кавычек, и пытается проставить в них именованные параметры (в нашем случае :00, :00)...
Если кому нужен быстрофикс - берем тут: https://bugreports.qt-project.org/browse/QTBUG-27159
Запостил: bormand,
08 Ноября 2012
bormand 08.11.2012 12:21 # +1
defecate-plusplus 08.11.2012 12:26 # 0
select * from some where foo = "Hello d'Artagnan!" and bar = 'trololo'
bormand 08.11.2012 12:29 # 0
Так там же:
Т.е. кавычки внутри других кавычек он нормально распарсит. А вот заэкранированные слешами... но это уже другая история.
defecate-plusplus 08.11.2012 12:35 # 0
форматирование в одну строку вскружило мне голову
а разве в sql они слешами экранируются?
давно не работал с ним, но помнится, что повторением - типа "" или ''
bormand 08.11.2012 12:38 # 0
roman-kashitsyn 08.11.2012 12:38 # 0
Steve_Brown 08.11.2012 13:33 # +1
bormand 08.11.2012 13:48 # 0
'это два '' апострофа'
'а это двойная " кавычка'
bormand 08.11.2012 12:46 # 0
Pifagor 24.08.2021 02:32 # 0
LHXzxZk 25.08.2021 05:45 # 0