Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ошибка при выполнении запроса 
:(
    Опции темы
chesterfielda
Дата 30.7.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 13.7.2009

Репутация: нет
Всего: нет



Добрый день, работаю с БД
почему-то на запрос 
Код

int auct_id=2;
model->setQuery("SELECT zakazchik.id,LPU.Name_LPU,LPU.INN,LPU.KPP,LPU.OGRN "
        "FROM zakazchik INNER JOIN LPU ON zakazchik.rf_LPUID=LPU.Cod "
        "WHERE zakazchik.rf_auctID="+auct_id+"");

выдает ошибку:
             error: invalid operands of types `const char*' and `const char[1]' to binary `operator+'
но если написать 
Код

QSting auct_id=2;
model->setQuery("SELECT zakazchik.id,LPU.Name_LPU,LPU.INN,LPU.KPP,LPU.OGRN "
        "FROM zakazchik INNER JOIN LPU ON zakazchik.rf_LPUID=LPU.Cod "
        "WHERE zakazchik.rf_auctID="+auct_id+"");

то все работает
и как быть??все-таки zakazchik.rf_auctID числовое поле,а не строковое
PM MAIL   Вверх
Romikgy
Дата 30.7.2009, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7325
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: нет
Всего: 146



C++ не умеет сам приводить типы
сделай что то типа 
 
Код

int auct_id=2;
char str[200]={0};
sprintf(str,"%d",(auct_id));
QSting squery="SELECT zakazchik.id,LPU.Name_LPU,LPU.INN,LPU.KPP,LPU.OGRN "
        "FROM zakazchik INNER JOIN LPU ON zakazchik.rf_LPUID=LPU.Cod "
        "WHERE zakazchik.rf_auctID="+str+"";

model->setQuery(squery);



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
SABROG
Дата 30.7.2009, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Код

int auct_id=2;
model->setQuery(QString("SELECT zakazchik.id,LPU.Name_LPU,LPU.INN,LPU.KPP,LPU.OGRN "
        "FROM zakazchik INNER JOIN LPU ON zakazchik.rf_LPUID=LPU.Cod "
        "WHERE zakazchik.rf_auctID=%0").arg(auct_id));


Код

int auct_id=2;
QSqlQuery query;
query.prepare("SELECT zakazchik.id,LPU.Name_LPU,LPU.INN,LPU.KPP,LPU.OGRN "
        "FROM zakazchik INNER JOIN LPU ON zakazchik.rf_LPUID=LPU.Cod "
        "WHERE zakazchik.rf_auctID=?");
query.addBindValue(auct_id);
model->setQuery(query);



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
ecspertiza
Дата 30.7.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



В принципе уже всё написано но можно ещё и так

Код

int auct_id=2;
model->setQuery("SELECT zakazchik.id,LPU.Name_LPU,LPU.INN,LPU.KPP,LPU.OGRN "
        "FROM zakazchik INNER JOIN LPU ON zakazchik.rf_LPUID=LPU.Cod "
        "WHERE zakazchik.rf_auctID="+QString::number(auct_id)+"");

 


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
Любитель
Дата 30.7.2009, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 16
Всего: 92



Самый правильный вариант - второй. Заниматся конкатенцией SQL-а из строк (когда достаточно параметризованного запроса) - это извращение. Единственное - в зависимости от СУБД синтаксис задания параметров (в SQL запросе) может различаться.


--------------------
PM MAIL ICQ Skype   Вверх
SABROG
Дата 30.7.2009, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Кроме того с конкатенацией строк возникает "дыра" - SQL Injection.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Любитель
Дата 30.7.2009, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 16
Всего: 92



В общем случае нет. Что возникает всегда - проблема читабельности кода и снижение производительности.


--------------------
PM MAIL ICQ Skype   Вверх
SABROG
Дата 30.7.2009, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(Любитель @ 30.7.2009,  17:46)
В общем случае нет. Что возникает всегда - проблема читабельности кода и снижение производительности.

Это смотря какой общий случай. Если доступ к базе данных разграничен средствами программы, а не SQL сервера, то у "знающих" пользователей могут появится права, которых быть не должно. Например у меня на работе программа (не моя) предоставляет возможность управлять бухгалтерией, просматривать и редактировать историю действий (кто во сколько зашел в программу, чего делал на протяжении всего дня, когда завершил работу и т.п.), проставлять специальный аттрибут на заявки типа "оплачено", естественно у обычных пользователей нет возможности открывать формы с таблицами где идет работа с такими данными. Это, в первую очередь, финансовый вопрос, куда обычные сотрудники не должны лезть или даже видеть.

В общем, не зависимо от программы, лучше взять за правило не конкатенировать строки для создания SQL запросов. А если выбора нет, то читать на тему экранирования управляющих символов к конкретной БД SQL и валидации введеных данных.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Любитель
Дата 30.7.2009, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 16
Всего: 92



Да эт всё понятно.. В запросе топикстартера инъекции неоткуда взяться smile Ибо значение зашито в коде. А так - зависит от того, контролируется ли значение пользователем или нет. Ну и плюс действительно есть и олдскульные методы борьбы путём экранирования.

Если я говорю, что "в общем случае нет" - значит существуют случаи, когда это не так smile

Впрочем ладно - идём дальше. Нормальных ORM на С++ нет, да и вряд ли будут. Поэтому запросы так или иначе пишутся в 99% случаев явно. Но (!) запросы в коде - это тоже зло. В любом виде. С точки зрения maintainability. Поэтому, для достаточно крупногго проекта лучше использовать хранимки smile Впрочем, для маленьких приложений - достаточно вынести в ресурсы или даже просто в отдельный файл. 


--------------------
PM MAIL ICQ Skype   Вверх
SABROG
Дата 30.7.2009, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(Любитель @  30.7.2009,  21:58 Найти цитируемый пост)
достаточно вынести в ресурсы или даже просто в отдельный файл.

Я так и делаю обычно. Плохо только то, что приходится изобретать велосипед в виде формата такого файла. Конечно врятли кто будет писать серьезное приложения с использованием sqlite, но он хранимки не поддерживает (по крайней мере пару лет назад не держал, как щас не знаю). Но даже если использовать хранимые процедуры, то им же надо параметры передавать, а это опять формирование SQL запроса.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Любитель
Дата 30.7.2009, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 16
Всего: 92



Цитата(SABROG @  30.7.2009,  23:00 Найти цитируемый пост)
по крайней мере пару лет назад не держал, как щас не знаю

SQLite3 не поддерживает точно и не будет. Если там когда-то хранимки и будут (хотя ИМХО SQLite не для того придумывали), то это повлечёт изменение мажорного номера версии.

Цитата(SABROG @  30.7.2009,  23:00 Найти цитируемый пост)
то им же надо параметры передавать, а это опять формирование SQL запроса. 

Да не, это понятно. Просто запрос тривиален - такой запрос вполне можно пихать прямо в код. Всё бизнес-логика запроса в самой хранимке.

А вообще - мы отвлеклись от темы. Я, конечно, не против этой темы, просто тема топика была более узкая. Если кому-то интересно продолжить эту тему - вынесу в отдельный топ.


--------------------
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1442 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.