C++/Qt/QSqlDatabase
Содержание
Connect to MySql with QSqlDatabase, and do select, update, insert and delete
Foundations of Qt Development\Chapter13\sqltest\mysql\main.cpp
/*
* Copyright (c) 2006-2007, Johan Thelin
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither the name of APress nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#include <QApplication>
#include <QtSql>
#include <QtDebug>
int main( int argc, char **argv )
{
QApplication app( argc, argv );
QSqlDatabase db = QSqlDatabase::addDatabase( "QMYSQL" );
db.setHostName( "localhost" );
db.setDatabaseName( "qtbook" );
db.setUserName( "root" );
db.setPassword( "sa" );
if( !db.open() )
{
qDebug() << db.lastError();
qFatal( "Failed to connect." );
}
qDebug( "Connected!" );
QSqlQuery qry;
qry.prepare( "CREATE TABLE IF NOT EXISTS names (id INTEGER UNIQUE PRIMARY KEY, firstname VARCHAR(30), lastname VARCHAR(30))" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug() << "Table created!";
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (1, "John", "Doe")" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (2, "Jane", "Doe")" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (3, "James", "Doe")" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (4, "Judy", "Doe")" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (5, "Richard", "Roe")" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (6, "Jane", "Roe")" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (7, "John", "Noakes")" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (8, "Donna", "Doe")" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (9, "Ralph", "Roe")" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
// SALARIES
qry.prepare( "CREATE TABLE IF NOT EXISTS salaries (id INTEGER UNIQUE PRIMARY KEY, annual INTEGER)" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO salaries (id, annual) VALUES (1, 1000)" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO salaries (id, annual) VALUES (2, 900)" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO salaries (id, annual) VALUES (3, 900)" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO salaries (id, annual) VALUES (5, 1100)" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO salaries (id, annual) VALUES (6, 1000)" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO salaries (id, annual) VALUES (8, 1200)" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO salaries (id, annual) VALUES (9, 1200)" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "SELECT * FROM salaries" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
{
qDebug( "Selected!" );
QSqlRecord rec = qry.record();
int cols = rec.count();
QString temp;
for( int c=0; c<cols; c++ )
temp += rec.fieldName(c) + ((c<cols-1)?"\t":"");
qDebug() << temp;
while( qry.next() )
{
temp = "";
for( int c=0; c<cols; c++ )
temp += qry.value(c).toString() + ((c<cols-1)?"\t":"");
qDebug() << temp;
}
}
qry.prepare( "SELECT names.firstname, names.lastname, salaries.annual FROM names JOIN salaries ON names.id = salaries.id" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
{
qDebug( "Selected!" );
QSqlRecord rec = qry.record();
int cols = rec.count();
QString temp;
for( int c=0; c<cols; c++ )
temp += rec.fieldName(c) + ((c<cols-1)?"\t":"");
qDebug() << temp;
while( qry.next() )
{
temp = "";
for( int c=0; c<cols; c++ )
temp += qry.value(c).toString() + ((c<cols-1)?"\t":"");
qDebug() << temp;
}
}
qry.prepare( "SELECT names.firstname, names.lastname, salaries.annual FROM names LEFT JOIN salaries ON names.id = salaries.id" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
{
qDebug( "Selected!" );
QSqlRecord rec = qry.record();
int cols = rec.count();
QString temp;
for( int c=0; c<cols; c++ )
temp += rec.fieldName(c) + ((c<cols-1)?"\t":"");
qDebug() << temp;
while( qry.next() )
{
temp = "";
for( int c=0; c<cols; c++ )
temp += qry.value(c).toString() + ((c<cols-1)?"\t":"");
qDebug() << temp;
}
}
qry.prepare( "SELECT names.lastname, SUM(salaries.annual)/COUNT(*) AS "Average", MIN(salaries.annual) AS "Minimum", MAX(salaries.annual) AS "Maximum" FROM names LEFT JOIN salaries ON names.id = salaries.id GROUP BY names.lastname" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
{
qDebug( "Selected!" );
QSqlRecord rec = qry.record();
int cols = rec.count();
QString temp;
for( int c=0; c<cols; c++ )
temp += rec.fieldName(c) + ((c<cols-1)?"\t":"");
qDebug() << temp;
while( qry.next() )
{
temp = "";
for( int c=0; c<cols; c++ )
temp += qry.value(c).toString() + ((c<cols-1)?"\t":"");
qDebug() << temp;
}
}
// SALARIES
qry.prepare( "SELECT * FROM names" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
{
qDebug( "Selected!" );
QSqlRecord rec = qry.record();
int cols = rec.count();
for( int c=0; c<cols; c++ )
qDebug() << QString( "Column %1: %2" ).arg( c ).arg( rec.fieldName(c) );
for( int r=0; qry.next(); r++ )
for( int c=0; c<cols; c++ )
qDebug() << QString( "Row %1, %2: %3" ).arg( r ).arg( rec.fieldName(c) ).arg( qry.value(c).toString() );
}
qry.prepare( "SELECT firstname, lastname FROM names WHERE lastname = "Roe"" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
{
qDebug( "Selected!" );
QSqlRecord rec = qry.record();
int cols = rec.count();
for( int c=0; c<cols; c++ )
qDebug() << QString( "Column %1: %2" ).arg( c ).arg( rec.fieldName(c) );
for( int r=0; qry.next(); r++ )
for( int c=0; c<cols; c++ )
qDebug() << QString( "Row %1, %2: %3" ).arg( r ).arg( rec.fieldName(c) ).arg( qry.value(c).toString() );
}
qry.prepare( "SELECT firstname, lastname FROM names WHERE lastname = "Roe" ORDER BY firstname" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
{
qDebug( "Selected!" );
QSqlRecord rec = qry.record();
int cols = rec.count();
for( int c=0; c<cols; c++ )
qDebug() << QString( "Column %1: %2" ).arg( c ).arg( rec.fieldName(c) );
for( int r=0; qry.next(); r++ )
for( int c=0; c<cols; c++ )
qDebug() << QString( "Row %1, %2: %3" ).arg( r ).arg( rec.fieldName(c) ).arg( qry.value(c).toString() );
}
qry.prepare( "SELECT lastname, COUNT(*) as "members" FROM names GROUP BY lastname ORDER BY lastname" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
{
qDebug( "Selected!" );
QSqlRecord rec = qry.record();
int cols = rec.count();
for( int c=0; c<cols; c++ )
qDebug() << QString( "Column %1: %2" ).arg( c ).arg( rec.fieldName(c) );
for( int r=0; qry.next(); r++ )
for( int c=0; c<cols; c++ )
qDebug() << QString( "Row %1, %2: %3" ).arg( r ).arg( rec.fieldName(c) ).arg( qry.value(c).toString() );
}
qry.prepare( "UPDATE names SET firstname = "Nisse", lastname = "Svensson" WHERE id = 7" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Updated!" );
qry.prepare( "UPDATE names SET lastname = "Johnson" WHERE firstname = "Jane"" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Updated!" );
qry.prepare( "DELETE FROM names WHERE id = 7" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Deleted!" );
qry.prepare( "DELETE FROM names WHERE lastname = "Johnson"" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Deleted!" );
db.close();
return 0;
}
Operate Sqlite database with QSqlDatabase
Foundations of Qt Development\Chapter13\modelview\main.cpp
/*
* Copyright (c) 2006-2007, Johan Thelin
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither the name of APress nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#include <QApplication>
#include <QTableView>
#include <QtSql>
void relModel()
{
QSqlRelationalTableModel *model = new QSqlRelationalTableModel();
model->setTable( "names" );
model->setRelation( 0, QSqlRelation( "salaries", "id", "annual" ) );
model->select();
model->setHeaderData( 0, Qt::Horizontal, QObject::tr("Annual Pay") );
model->setHeaderData( 1, Qt::Horizontal, QObject::tr("First Name") );
model->setHeaderData( 2, Qt::Horizontal, QObject::tr("Last Name") );
QTableView *view = new QTableView();
view->setModel( model );
view->show();
}
void tabModel()
{
QSqlTableModel *model = new QSqlTableModel();
model->setTable( "names" );
model->setFilter( "lastname = "Doe"" );
model->select();
model->removeColumn( 0 );
QTableView *view = new QTableView();
view->setModel( model );
view->show();
}
void qryModel()
{
QSqlQueryModel *model = new QSqlQueryModel();
model->setQuery( "SELECT firstname, lastname FROM names" );
QTableView *view = new QTableView();
view->setModel( model );
view->show();
}
int main( int argc, char **argv )
{
QApplication app( argc, argv );
QSqlDatabase db = QSqlDatabase::addDatabase( "QSQLITE" );
db.setDatabaseName( ":memory:" );
if( !db.open() )
{
qDebug() << db.lastError();
qFatal( "Failed to connect." );
}
qDebug( "Connected!" );
QSqlQuery qry;
qry.prepare( "CREATE TABLE IF NOT EXISTS names (id INTEGER UNIQUE PRIMARY KEY, firstname VARCHAR(30), lastname VARCHAR(30))" );
qry.exec();
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (1, "John", "Doe")" );
qry.exec();
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (2, "Jane", "Doe")" );
qry.exec();
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (3, "James", "Doe")" );
qry.exec();
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (4, "Judy", "Doe")" );
qry.exec();
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (5, "Richard", "Roe")" );
qry.exec();
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (6, "Jane", "Roe")" );
qry.exec();
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (7, "John", "Noakes")" );
qry.exec();
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (8, "Donna", "Doe")" );
qry.exec();
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (:id, :firstname, :lastname)" );
qry.bindValue( ":id", 9 );
qry.bindValue( ":firstname", "Ralph" );
qry.bindValue( ":lastname", "Roe" );
qry.exec();
qry.prepare( "CREATE TABLE IF NOT EXISTS salaries (id INTEGER UNIQUE PRIMARY KEY, annual INTEGER)" );
qry.exec();
qry.prepare( "INSERT INTO salaries (id, annual) VALUES (1, 1000)" );
qry.exec();
qry.prepare( "INSERT INTO salaries (id, annual) VALUES (2, 900)" );
qry.exec();
qry.prepare( "INSERT INTO salaries (id, annual) VALUES (3, 900)" );
qry.exec();
qry.prepare( "INSERT INTO salaries (id, annual) VALUES (5, 1100)" );
qry.exec();
qry.prepare( "INSERT INTO salaries (id, annual) VALUES (6, 1000)" );
qry.exec();
qry.prepare( "INSERT INTO salaries (id, annual) VALUES (8, 1200)" );
qry.exec();
qry.prepare( "INSERT INTO salaries (id, annual) VALUES (9, 1200)" );
qry.exec();
relModel();
tabModel();
qryModel();
return app.exec();
}
Prepared statement
Foundations of Qt Development\Chapter13\sqltest\sqlite-mem\main.cpp
/*
* Copyright (c) 2006-2007, Johan Thelin
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither the name of APress nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#include <QApplication>
#include <QtSql>
#include <QtDebug>
int main( int argc, char **argv )
{
QApplication app( argc, argv );
QSqlDatabase db = QSqlDatabase::addDatabase( "QSQLITE" );
db.setDatabaseName( ":memory:" );
if( !db.open() )
{
qDebug() << db.lastError();
qFatal( "Failed to connect." );
}
qDebug( "Connected!" );
QSqlQuery qry;
qry.prepare( "CREATE TABLE IF NOT EXISTS names (id INTEGER UNIQUE PRIMARY KEY, firstname VARCHAR(30), lastname VARCHAR(30))" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug() << "Table created!";
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (1, "John", "Doe")" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (2, "Jane", "Doe")" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (3, "James", "Doe")" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (4, "Judy", "Doe")" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (5, "Richard", "Roe")" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (6, "Jane", "Roe")" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (7, "John", "Noakes")" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (8, "Donna", "Doe")" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO names (id, firstname, lastname) VALUES (:id, :firstname, :lastname)" );
qry.bindValue( ":id", 9 );
qry.bindValue( ":firstname", "Ralph" );
qry.bindValue( ":lastname", "Roe" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
// SALARIES
qry.prepare( "CREATE TABLE IF NOT EXISTS salaries (id INTEGER UNIQUE PRIMARY KEY, annual INTEGER)" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO salaries (id, annual) VALUES (1, 1000)" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO salaries (id, annual) VALUES (2, 900)" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO salaries (id, annual) VALUES (3, 900)" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO salaries (id, annual) VALUES (5, 1100)" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO salaries (id, annual) VALUES (6, 1000)" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO salaries (id, annual) VALUES (8, 1200)" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "INSERT INTO salaries (id, annual) VALUES (9, 1200)" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Inserted!" );
qry.prepare( "SELECT * FROM salaries" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
{
qDebug( "Selected!" );
QSqlRecord rec = qry.record();
int cols = rec.count();
QString temp;
for( int c=0; c<cols; c++ )
temp += rec.fieldName(c) + ((c<cols-1)?"\t":"");
qDebug() << temp;
while( qry.next() )
{
temp = "";
for( int c=0; c<cols; c++ )
temp += qry.value(c).toString() + ((c<cols-1)?"\t":"");
qDebug() << temp;
}
}
qry.prepare( "SELECT names.firstname, names.lastname, salaries.annual FROM names JOIN salaries ON names.id = salaries.id" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
{
qDebug( "Selected!" );
QSqlRecord rec = qry.record();
int cols = rec.count();
QString temp;
for( int c=0; c<cols; c++ )
temp += rec.fieldName(c) + ((c<cols-1)?"\t":"");
qDebug() << temp;
while( qry.next() )
{
temp = "";
for( int c=0; c<cols; c++ )
temp += qry.value(c).toString() + ((c<cols-1)?"\t":"");
qDebug() << temp;
}
}
qry.prepare( "SELECT names.firstname, names.lastname, salaries.annual FROM names LEFT JOIN salaries ON names.id = salaries.id" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
{
qDebug( "Selected!" );
QSqlRecord rec = qry.record();
int cols = rec.count();
QString temp;
for( int c=0; c<cols; c++ )
temp += rec.fieldName(c) + ((c<cols-1)?"\t":"");
qDebug() << temp;
while( qry.next() )
{
temp = "";
for( int c=0; c<cols; c++ )
temp += qry.value(c).toString() + ((c<cols-1)?"\t":"");
qDebug() << temp;
}
}
qry.prepare( "SELECT names.lastname, SUM(salaries.annual)/COUNT(*) AS "Average", MIN(salaries.annual) AS "Minimum", MAX(salaries.annual) AS "Maximum" FROM names LEFT JOIN salaries ON names.id = salaries.id GROUP BY names.lastname" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
{
qDebug( "Selected!" );
QSqlRecord rec = qry.record();
int cols = rec.count();
QString temp;
for( int c=0; c<cols; c++ )
temp += rec.fieldName(c) + ((c<cols-1)?"\t":"");
qDebug() << temp;
while( qry.next() )
{
temp = "";
for( int c=0; c<cols; c++ )
temp += qry.value(c).toString() + ((c<cols-1)?"\t":"");
qDebug() << temp;
}
}
// SALARIES
qry.prepare( "SELECT * FROM names" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
{
qDebug( "Selected!" );
QSqlRecord rec = qry.record();
int cols = rec.count();
for( int c=0; c<cols; c++ )
qDebug() << QString( "Column %1: %2" ).arg( c ).arg( rec.fieldName(c) );
for( int r=0; qry.next(); r++ )
for( int c=0; c<cols; c++ )
qDebug() << QString( "Row %1, %2: %3" ).arg( r ).arg( rec.fieldName(c) ).arg( qry.value(c).toString() );
}
qry.prepare( "SELECT firstname, lastname FROM names WHERE lastname = "Roe"" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
{
qDebug( "Selected!" );
QSqlRecord rec = qry.record();
int cols = rec.count();
for( int c=0; c<cols; c++ )
qDebug() << QString( "Column %1: %2" ).arg( c ).arg( rec.fieldName(c) );
for( int r=0; qry.next(); r++ )
for( int c=0; c<cols; c++ )
qDebug() << QString( "Row %1, %2: %3" ).arg( r ).arg( rec.fieldName(c) ).arg( qry.value(c).toString() );
}
qry.prepare( "SELECT firstname, lastname FROM names WHERE lastname = "Roe" ORDER BY firstname" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
{
qDebug( "Selected!" );
QSqlRecord rec = qry.record();
int cols = rec.count();
QString temp;
for( int c=0; c<cols; c++ )
temp += rec.fieldName(c) + ((c<cols-1)?"\t":"");
qDebug() << temp;
while( qry.next() )
{
temp = "";
for( int c=0; c<cols; c++ )
temp += qry.value(c).toString() + ((c<cols-1)?"\t":"");
qDebug() << temp;
}
}
qry.prepare( "SELECT lastname, COUNT(*) as "members" FROM names GROUP BY lastname ORDER BY lastname" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
{
qDebug( "Selected!" );
QSqlRecord rec = qry.record();
int cols = rec.count();
for( int c=0; c<cols; c++ )
qDebug() << QString( "Column %1: %2" ).arg( c ).arg( rec.fieldName(c) );
for( int r=0; qry.next(); r++ )
for( int c=0; c<cols; c++ )
qDebug() << QString( "Row %1, %2: %3" ).arg( r ).arg( rec.fieldName(c) ).arg( qry.value(c).toString() );
}
qry.prepare( "UPDATE names SET firstname = "Nisse", lastname = "Svensson" WHERE id = 7" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Updated!" );
qry.prepare( "UPDATE names SET lastname = "Johnson" WHERE firstname = "Jane"" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Updated!" );
qry.prepare( "DELETE FROM names WHERE id = 7" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Deleted!" );
qry.prepare( "DELETE FROM names WHERE lastname = "Johnson"" );
if( !qry.exec() )
qDebug() << qry.lastError();
else
qDebug( "Deleted!" );
db.close();
return 0;
}
Set up QSqlDatabase
#include <QtGui>
#include <QtSql>
#include <QDebug>
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("url.example.com");
db.setDatabaseName("databaseName");
db.setUserName("user");
db.setPassword("pass");
if (!db.open()) {
qDebug() << db.lastError();
return1;
}
Using sql database from Qt
/****************************************************************************
**
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial Usage
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU General Public License version 3.0 requirements will be
** met: http://www.gnu.org/copyleft/gpl.html.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
** $QT_END_LICENSE$
**
****************************************************************************/
#include <QtGui>
#include <QtSql>
#include <iostream>
using namespace std;
QString tr(const char *text)
{
return QApplication::translate(text, text);
}
void QSqlDatabase_snippets()
{
{
QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
db.setHostName("acidalia");
db.setDatabaseName("customdb");
db.setUserName("mojito");
db.setPassword("J0a1m8");
bool ok = db.open();
Q_UNUSED(ok);
}
{
QSqlDatabase db = QSqlDatabase::database();
}
}
void QSqlField_snippets()
{
#if 0
{
QSqlField field("age", QVariant::Int);
field.setValue(QPixmap()); // WRONG
}
#endif
{
QSqlField field("age", QVariant::Int);
field.setValue(QString("123")); // casts QString to int
}
{
QSqlQuery query;
QSqlRecord record = query.record();
QSqlField field = record.field("country");
}
}
void doSomething(const QString &)
{
}
void QSqlQuery_snippets()
{
{
// typical loop
QSqlQuery query("SELECT country FROM artist");
while (query.next()) {
QString country = query.value(0).toString();
doSomething(country);
}
}
{
// field index lookup
QSqlQuery query("SELECT * FROM artist");
int fieldNo = query.record().indexOf("country");
while (query.next()) {
QString country = query.value(fieldNo).toString();
doSomething(country);
}
}
{
// named with named
QSqlQuery query;
query.prepare("INSERT INTO person (id, forename, surname) "
"VALUES (:id, :forename, :surname)");
query.bindValue(":id", 1001);
query.bindValue(":forename", "Bart");
query.bindValue(":surname", "Simpson");
query.exec();
}
{
// positional with named
QSqlQuery query;
query.prepare("INSERT INTO person (id, forename, surname) "
"VALUES (:id, :forename, :surname)");
query.bindValue(0, 1001);
query.bindValue(1, "Bart");
query.bindValue(2, "Simpson");
query.exec();
}
{
// positional 1
QSqlQuery query;
query.prepare("INSERT INTO person (id, forename, surname) "
"VALUES (?, ?, ?)");
query.bindValue(0, 1001);
query.bindValue(1, "Bart");
query.bindValue(2, "Simpson");
query.exec();
}
{
// positional 2
QSqlQuery query;
query.prepare("INSERT INTO person (id, forename, surname) "
"VALUES (?, ?, ?)");
query.addBindValue(1001);
query.addBindValue("Bart");
query.addBindValue("Simpson");
query.exec();
}
{
// stored
QSqlQuery query;
query.prepare("CALL AsciiToInt(?, ?)");
query.bindValue(0, "A");
query.bindValue(1, 0, QSql::Out);
query.exec();
int i = query.boundValue(1).toInt(); // i is 65
Q_UNUSED(i);
}
QSqlQuery query;
{
// examine with named binding
QMapIterator<QString, QVariant> i(query.boundValues());
while (i.hasNext()) {
i.next();
cout << i.key().toAscii().data() << ": "
<< i.value().toString().toAscii().data() << endl;
}
}
{
// examine with positional binding
QList<QVariant> list = query.boundValues().values();
for (int i = 0; i < list.size(); ++i)
cout << i << ": " << list.at(i).toString().toAscii().data() << endl;
}
}
void QSqlQueryModel_snippets()
{
{
QSqlQueryModel *model = new QSqlQueryModel;
model->setQuery("SELECT name, salary FROM employee");
model->setHeaderData(0, Qt::Horizontal, tr("Name"));
model->setHeaderData(1, Qt::Horizontal, tr("Salary"));
QTableView *view = new QTableView;
view->setModel(model);
view->show();
view->setEditTriggers(QAbstractItemView::NoEditTriggers);
}
QSqlQueryModel model;
model.setQuery("SELECT * FROM employee");
int salary = model.record(4).value("salary").toInt();
Q_UNUSED(salary);
{
int salary = model.data(model.index(4, 2)).toInt();
Q_UNUSED(salary);
}
for (int row = 0; row < model.rowCount(); ++row) {
for (int col = 0; col < model.columnCount(); ++col) {
qDebug() << model.data(model.index(row, col));
}
}
}
class MyModel : public QSqlQueryModel
{
public:
QVariant data(const QModelIndex &item, int role) const;
int m_specialColumnNo;
};
QVariant MyModel::data(const QModelIndex &item, int role) const
{
if (item.column() == m_specialColumnNo) {
// handle column separately
}
return QSqlQueryModel::data(item, role);
}
void QSqlTableModel_snippets()
{
QSqlTableModel *model = new QSqlTableModel;
model->setTable("employee");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();
model->removeColumn(0); // don"t show the ID
model->setHeaderData(0, Qt::Horizontal, tr("Name"));
model->setHeaderData(1, Qt::Horizontal, tr("Salary"));
QTableView *view = new QTableView;
view->setModel(model);
view->show();
{
QSqlTableModel model;
model.setTable("employee");
QString name = model.record(4).value("name").toString();
}
}
void sql_intro_snippets()
{
{
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("bigblue");
db.setDatabaseName("flightdb");
db.setUserName("acarlson");
db.setPassword("1uTbSbAs");
bool ok = db.open();
Q_UNUSED(ok);
}
{
QSqlDatabase firstDB = QSqlDatabase::addDatabase("QMYSQL", "first");
QSqlDatabase secondDB = QSqlDatabase::addDatabase("QMYSQL", "second");
}
{
QSqlDatabase defaultDB = QSqlDatabase::database();
QSqlDatabase firstDB = QSqlDatabase::database("first");
QSqlDatabase secondDB = QSqlDatabase::database("second");
}
{
// SELECT1
QSqlQuery query;
query.exec("SELECT name, salary FROM employee WHERE salary > 50000");
while (query.next()) {
QString name = query.value(0).toString();
int salary = query.value(1).toInt();
qDebug() << name << salary;
}
}
{
// FEATURE
QSqlQuery query;
int numRows;
query.exec("SELECT name, salary FROM employee WHERE salary > 50000");
QSqlDatabase defaultDB = QSqlDatabase::database();
if (defaultDB.driver()->hasFeature(QSqlDriver::QuerySize)) {
numRows = query.size();
} else {
// this can be very slow
query.last();
numRows = query.at() + 1;
}
}
{
// INSERT1
QSqlQuery query;
query.exec("INSERT INTO employee (id, name, salary) "
"VALUES (1001, "Thad Beaumont", 65000)");
}
{
// NAMED BINDING
QSqlQuery query;
query.prepare("INSERT INTO employee (id, name, salary) "
"VALUES (:id, :name, :salary)");
query.bindValue(":id", 1001);
query.bindValue(":name", "Thad Beaumont");
query.bindValue(":salary", 65000);
query.exec();
}
{
// POSITIONAL BINDING
QSqlQuery query;
query.prepare("INSERT INTO employee (id, name, salary) "
"VALUES (?, ?, ?)");
query.addBindValue(1001);
query.addBindValue("Thad Beaumont");
query.addBindValue(65000);
query.exec();
}
{
// UPDATE1
QSqlQuery query;
query.exec("UPDATE employee SET salary = 70000 WHERE id = 1003");
}
{
// DELETE1
QSqlQuery query;
query.exec("DELETE FROM employee WHERE id = 1007");
}
{
// TRANSACTION
QSqlDatabase::database().transaction();
QSqlQuery query;
query.exec("SELECT id FROM employee WHERE name = "Torild Halvorsen"");
if (query.next()) {
int employeeId = query.value(0).toInt();
query.exec("INSERT INTO project (id, name, ownerid) "
"VALUES (201, "Manhattan Project", "
+ QString::number(employeeId) + ")");
}
QSqlDatabase::database().commit();
}
{
// SQLQUERYMODEL1
QSqlQueryModel model;
model.setQuery("SELECT * FROM employee");
for (int i = 0; i < model.rowCount(); ++i) {
int id = model.record(i).value("id").toInt();
QString name = model.record(i).value("name").toString();
qDebug() << id << name;
}
}
{
// SQLTABLEMODEL1
QSqlTableModel model;
model.setTable("employee");
model.setFilter("salary > 50000");
model.setSort(2, Qt::DescendingOrder);
model.select();
for (int i = 0; i < model.rowCount(); ++i) {
QString name = model.record(i).value("name").toString();
int salary = model.record(i).value("salary").toInt();
qDebug() << name << salary;
}
}
{
// SQLTABLEMODEL2
QSqlTableModel model;
model.setTable("employee");
for (int i = 0; i < model.rowCount(); ++i) {
QSqlRecord record = model.record(i);
double salary = record.value("salary").toInt();
salary *= 1.1;
record.setValue("salary", salary);
model.setRecord(i, record);
}
model.submitAll();
// SQLTABLEMODEL3
int row = 1;
int column = 2;
model.setData(model.index(row, column), 75000);
model.submitAll();
// SQLTABLEMODEL4
model.insertRows(row, 1);
model.setData(model.index(row, 0), 1013);
model.setData(model.index(row, 1), "Peter Gordon");
model.setData(model.index(row, 2), 68500);
model.submitAll();
model.removeRows(row, 5);
model.submitAll();
}
}
class XyzResult : public QSqlResult
{
public:
XyzResult(const QSqlDriver *driver)
: QSqlResult(driver) {}
~XyzResult() {}
protected:
QVariant data(int /* index */) { return QVariant(); }
bool isNull(int /* index */) { return false; }
bool reset(const QString & /* query */) { return false; }
bool fetch(int /* index */) { return false; }
bool fetchFirst() { return false; }
bool fetchLast() { return false; }
int size() { return 0; }
int numRowsAffected() { return 0; }
QSqlRecord record() const { return QSqlRecord(); }
};
class XyzDriver : public QSqlDriver
{
public:
XyzDriver() {}
~XyzDriver() {}
bool hasFeature(DriverFeature /* feature */) const { return false; }
bool open(const QString & /* db */, const QString & /* user */,
const QString & /* password */, const QString & /* host */,
int /* port */, const QString & /* options */)
{ return false; }
void close() {}
QSqlResult *createResult() const { return new XyzResult(this); }
};
int main(int argc, char **argv)
{
QApplication app(argc, argv);
QSqlDatabase_snippets();
QSqlField_snippets();
QSqlQuery_snippets();
QSqlQueryModel_snippets();
QSqlTableModel_snippets();
XyzDriver driver;
XyzResult result(&driver);
}