Russian Qt Forum

Qt => Вопросы новичков => Тема начата: useruser от Октябрь 01, 2013, 20:00



Название: Подключение к Mysql
Отправлено: useruser от Октябрь 01, 2013, 20:00
Хочу выполнить запрос на удалённой базе

Код:
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "mydb");
db.setPort(3306);
db.setHostName("79.222.60.241");
db.setDatabaseName("base");
db.setUserName("user");
db.setPassword("123");
bool ok = db.open();

if(ok==true)
ui->label_3->setText("Соединение с базой установлено");
if(ok==false)
ui->label_3->setText("Ошибка подключения к БД");

QSqlQuery query;

query.exec("INSERT INTO records (record,time) VALUES ('1','1');");

Пишет ошибку QSqlQuery::exec: database not open. Несмотря на то, что "Соединение с базой установлено" (ok==true)
Запрос не выполняется - в базе-таблице не появляется запись. Удалённый доступ к бд открыт.
В чём тут ошибка?


Название: Re: Подключение к Mysql
Отправлено: Bepec от Октябрь 01, 2013, 20:03
А попробовать  выполнить запрос от имени db.exec() пробовали?


Название: Re: Подключение к Mysql
Отправлено: Alex Custov от Октябрь 01, 2013, 20:13
Цитировать
QSqlDatabase QSqlDatabase::addDatabase ( const QString & type, const QString & connectionName = QLatin1String( defaultConnection ) )
...
If connectionName is not specified, the new connection becomes the default connection

Цитировать
QSqlQuery::QSqlQuery ( const QString & query = QString(), QSqlDatabase db = QSqlDatabase() )
...
Constructs a QSqlQuery object using the SQL query and the database db. If db is not specified, or is invalid, the application's default database is used

Теперь проецируем это внимательно на код

Код
C++ (Qt)
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "mydb");
...
QSqlQuery query;


Название: Re: Подключение к Mysql
Отправлено: useruser от Октябрь 01, 2013, 20:41
Bepec - нет не пробовал. Попробую, но боюсь это не поможет. Тут что-то не так с подключением к БД.

Alex -я новичек и мало что понимаю.
Делал всё по статье http://habrahabr.ru/post/51650/
Часть ошибок исправил сам. Как исправить эту не знаю.
Так что скажите проще, что я не так сделал?


Название: Re: Подключение к Mysql
Отправлено: Old от Октябрь 01, 2013, 20:45
Уберите имя соединения из параметров addDatabase: mydb
Или добавьте его в параметры конструктора QSqlQuery.


Название: Re: Подключение к Mysql
Отправлено: useruser от Октябрь 01, 2013, 21:06
Old Большое cпасибо. Заработало. )
Ну и в догонку ещё вопрос - не подскажете по синтаксису, как вставить в SQL запрос переменные?
query.exec("INSERT INTO records (record,time) VALUES ('myvar1','myvar2');


Название: Re: Подключение к Mysql
Отправлено: gil9red от Октябрь 01, 2013, 22:08
Код:
query.exec(QString("INSERT INTO records (record,time) VALUES ('%1','%2')")
                           .arg(myvar1)
                           .arg(myvar2));


Название: Подключение к MySQL
Отправлено: malor от Октябрь 09, 2013, 15:38
Делал всё по статье http://habrahabr.ru/post/51650/
Часть ошибок исправил сам.

Какие там ещё ошибки? Кроме как с регистром букв (см. топик. error: 'QsqlDatabase' has not been declared (http://www.prog.org.ru/topic_25808_0.html)).


Название: Re: Подключение к Mysql
Отправлено: carrygun от Октябрь 10, 2013, 08:35
Код:
query.exec(QString("INSERT INTO records (record,time) VALUES ('%1','%2')")
                           .arg(myvar1)
                           .arg(myvar2));

Это, кстати, не лучший вариант. Помню год назад натыкался на определенные проблемы связанные с таким подходом. Лучше использовать bindValue() у QSqlQuery. Да и типы там автоматически определяются, не нужно писать всякие кавычки потом.

UPD: вспомнил в чем была проблема, выглядело примерно так:
Код
C++ (Qt)
QString var1("sur%2prise");
QString var2("text");
QString var3("some string %1 %2").arg(var1).arg(var2);
 
Что-то в таком духе.