[ MarkoBalkan @ 04.02.2009. 12:35 ] @
Code:

#include "mainwindow.h"
#include <QtGui/QLabel>
#include <QtGui/QApplication>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlerror>
#include <QtSql/QSqlquery>
#include <QtGui/QMessagebox>
#include <QtSql/QMYSQLDRIVER>



MainWindow::MainWindow(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
}


void MainWindow::spremanje()
{


QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("proba");
db.setUserName("root");
db.setPassword("123");

QSqlQuery q;
q.exec("insert into druga(id,id1,a) values(1,1,a)");

}



ovo je code za qt i mysql.

javi grešku expected ')' before '*' token
c:/qt/qtcreator/qt/include/qtsql/drivers/mysql/qsql_mysql.h
te mi podcrta include <mysql.h> u file-u qsql_mysql.h

ako umjesto #include <QtSql/QMYSQLDRIVER>
stavim
#include <QtSql/QSQLDRIVER>

onda mi kompajlira bez greške
međutim kod izvršavanja dobim


Starting C:/Documents and Settings/Marko/My Documents/qt/sds/debug/sds.exe
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC3 QODBC
QSqlQuery::exec: database not open


pa bi molio za malu pomoć
[ nikomak @ 04.02.2009. 16:38 ] @
Mysql plugin nije buildovan za doticnu qt varijantu. To kaze i ovde

Code:

 QSqlDatabase: available drivers: QSQLITE QODBC3 QODBC


Rekonfigurisi qt i omoguci mysql driver, kopiraj mysql headere i lib u qt src/lib dir i rebuilduj qt.
[ MarkoBalkan @ 04.02.2009. 22:44 ] @
radim prema ovim uputama
http://doc.trolltech.com/4.0/sql-driver.html#qmysql

i kad ukucam nmake, ništa.

verzija mysql servera je 5.1.26
[ karas @ 05.02.2009. 08:09 ] @
Imas li u project fajlu (onaj koji se generise sa qmake) liniju
Code:

QT += sql

[ MarkoBalkan @ 05.02.2009. 10:05 ] @
Citat:
karas: Imas li u project fajlu (onaj koji se generise sa qmake) liniju
Code:

QT += sql



imam.
u folderu src/sql imam neke o file-ove.
napravio build fileova u sql folderu.
[ MarkoBalkan @ 05.02.2009. 10:31 ] @
Citat:
MarkoBalkan: radim prema ovim uputama
http://doc.trolltech.com/4.0/sql-driver.html#qmysql

i kad ukucam nmake, ništa.

verzija mysql servera je 5.1.26





s time da mi je ovo prvi put prošlo do nmake, a poslije više neće.
[ karas @ 05.02.2009. 11:17 ] @
Qt koristim samo pod Linuksom. Pitao sam zato sto kod mene nema te linije pa moram rucno da je ubacim.
MySQL je podignut na portu 3306?
[ MarkoBalkan @ 05.02.2009. 11:40 ] @
Citat:
karas
MySQL je podignut na portu 3306?


tako je.
[ MarkoBalkan @ 05.02.2009. 21:42 ] @
dajte pomognite oko kompajliranja mysql modula za C++/QT.

već sam lud.

dali netko može kompajlirat i poslat finalne file-ove na email?
[ MarkoBalkan @ 06.02.2009. 09:19 ] @
dali mysql mora biti u C:\ ?

jer meni je instaliran u program files, da nije to možda problem?
[ karas @ 06.02.2009. 10:41 ] @
Da li Qt vidi putanju do MySQL-a? Mozda je tu problem.
[ MarkoBalkan @ 06.02.2009. 11:13 ] @
Citat:
karas: Da li Qt vidi putanju do MySQL-a? Mozda je tu problem.



gdje se to podešava?
[ karas @ 06.02.2009. 12:06 ] @
Ne znam pod Windows-om kako to ide, pod Linuksom se zadaju parametri za configure koliko se secam.
[ MarkoBalkan @ 06.02.2009. 13:15 ] @
Citat:
karas: Ne znam pod Windows-om kako to ide, pod Linuksom se zadaju parametri za configure koliko se secam.


u windowsima

cd C:\Qt\4.4.3

u tom folderu postoji configure koji se pozove.

jel možeš reći kako ide na linuxu?
[ karas @ 06.02.2009. 13:53 ] @
Sad pricam napamet jer mi je to kod kuce a i samo jednom sam instalirao, ali ide kao i za ostale biblioteke:
Code:

./configure --path /usr/local/qt-4.3 --plugin-sql-mysql --mysql-path putanja
make
make install

Dakle, configure podesi putanju gde bi da drzis sam Qt, gde je MySQL (ako nije na standardnoj putanji) i sl. E sad posto si pod windowsom moras da imas instaliran i gmake, verovatno >2.81, kod mene sve to vec postoji na sistemu.
Kako si uopste instalirao pod Windowsom, da li si koristio configure ili ide na neki drugi nacin? Da li ti je pre radilo pa je prestalo posle promene MySQL instalacije?
[ MarkoBalkan @ 06.02.2009. 14:05 ] @
Citat:
karas: Sad pricam napamet jer mi je to kod kuce a i samo jednom sam instalirao, ali ide kao i za ostale biblioteke:
Code:

./configure --path /usr/local/qt-4.3 --plugin-sql-mysql --mysql-path putanja
make
make install

Dakle, configure podesi putanju gde bi da drzis sam Qt, gde je MySQL (ako nije na standardnoj putanji) i sl. E sad posto si pod windowsom moras da imas instaliran i gmake, verovatno >2.81, kod mene sve to vec postoji na sistemu.
Kako si uopste instalirao pod Windowsom, da li si koristio configure ili ide na neki drugi nacin? Da li ti je pre radilo pa je prestalo posle promene MySQL instalacije?



make uredno radi.instalirao sam qt open source, skinuo msi, a ne source.mada i taj sadrži source.
i napravio mi sam build svega.

hvala, probat ću
[ MarkoBalkan @ 06.02.2009. 14:47 ] @
imam instaliran borland rad studio i sad ga make j... od tog.
u environment variables imam sve podešeno kako treba.

danas ili sutra ide format diska pa ćemo vidjeti, a probat ću i na linuxu podesiti.
[ nikomak @ 06.02.2009. 18:27 ] @
Uh, uh, koliko problema, a sasvim je jednostavno :) Evo ja sam iskompajlirao mysql plugin bez problema i saljem ga uz poruku. Raspakovati 4 fajla iz arhive u c:\qtcreator\qt\plugins\sqldrivers direktorijum, jer koliko vidim iz prethodnih poruka koristi se qtcreator i verzija qt-a koja ide uz njega.

Takodje je potrebno da libmysql.dll bude "vidljiv" Qt-u. Najjednostavnije resenje je iskopirati libmysql.dll u c:\qtcreator\qt\bin, ili je moguce dodati u PATH env varijablu dir u kome se ovaj dll nalazi. Dalje, qtcreator dolazi sa kompletnim mingw toolchain-om, koji se nalazi u c:\qtcreator\mingw, pa ako je potrebno rekonfigurisati i rekompajlirati qt treba koristiti mingw32-make, umesto make.

Ako neko zeli da koristi MS kompajler da build-uje qt i koristi Visual studio, vise detalja moze pronaci ovde http://www.elitesecurity.org/t325380-0#1967661
Moram jos spomenuti da verzije Qt-a vece od 4.4.0 ne zahtevaju skoro nikakvo patch-ovanje i/ili intervencije da bi se iskompajlirale pomocu MS kompajlera.
[ MarkoBalkan @ 06.02.2009. 19:36 ] @
Citat:
nikomak

Takodje je potrebno da libmysql.dll bude "vidljiv" Qt-u. Najjednostavnije resenje je iskopirati libmysql.dll u c:\qtcreator\qt\bin, ili je moguce dodati u PATH env varijablu dir u kome se ovaj dll nalazi. Dalje, qtcreator dolazi sa kompletnim mingw toolchain-om, koji se nalazi u c:\qtcreator\mingw, pa ako je potrebno rekonfigurisati i rekompajlirati qt treba koristiti mingw32-make, umesto make.



iskopira se limmysql i onda kompajliranje prolazi?
[ MarkoBalkan @ 06.02.2009. 21:25 ] @
Code:


#include <QtGui/QLabel>
#include <QtGui/QApplication>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlerror>
#include <QtSql/QSqlquery>
#include <QtGui/QMessagebox>

void MainWindow::spremanje()
{


QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setPort(3306);
db.setDatabaseName("proba");
db.setUserName("root");
db.setPassword("123");
QSqlQuery query(db);
db.open("root","123");
query.exec("insert into druga(id,id1,a) values(1,1,ss)");
db.close();


}








trebam popravak ovog koda da mi radi.aplikacija se ruši.pojavi se debug prozr visual studi-a za debugiranje.
radim po knjizi.
koristim qt creator.
[ karas @ 07.02.2009. 08:02 ] @
Šta vraća db.open() - true ili false? (Pošto si već ranije postavio username i password, možeš da koristiš open() bez argumenata.)
[ MarkoBalkan @ 07.02.2009. 09:19 ] @
Code:

void MainWindow::spremanje()
{


QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setPort(3306);
db.setDatabaseName("proba");
db.setUserName("root");
db.setPassword("123");

bool ok=db.open("root","123");
if(ok)
{
QSqlQuery query(db);
query.prepare("insert into druga(id,id1,a) values(:id,:id1,:a)");
query.bindValue(":id","3424");
query.bindValue(":id1","343");
query.bindValue(":a","agdfg");
query.exec();


}
}




ne prolazi otvaranje.
[ karas @ 07.02.2009. 10:27 ] @
Šta podrazumevaš pod root korisnikom, tj. da li je root definisan na MySql-u ili pod Linuxom/Windowsom?
[ MarkoBalkan @ 07.02.2009. 10:39 ] @
baza je na windowsima, na localhostu.
root je user baze., a 123 password.
QT i QT creator su također na toj mašini.

linuxa imam na drugoj kanti.
[ karas @ 07.02.2009. 12:55 ] @
Ako ne možeš da se uloguješ iz Qt-a, možeš li iz konzole da se uloguješ ali kada NISI root, dakle prolazi li nešto poput
Code:

mysql -hlocalhost -uroot -p123 proba

Takodje, kad staviš
Code:

cout << db.databaseName().toStdString() << ", " << db.driverName().toStdString() << endl;

odmah posle setovanja parametara, ispisuje li dobre parametre?
[ MarkoBalkan @ 07.02.2009. 13:48 ] @
Code:


void MainWindow::spremanje()
{


QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setPort(3306);
db.setDatabaseName("proba");
db.setUserName("root");
db.setPassword("123");

bool ok=db.open("root","123");

if(ok)
{
QSqlQuery query(db);
QMessageBox::critical(0,QObject::tr("aa"),db.databaseName().toAscii());
query.prepare("insert into druga(ID,ID1,a) values(:id,:id1,:a)");

query.bindValue(":id","3424");
query.bindValue(":id1","343");
query.bindValue(":a","agdfg");
query.exec();

}
}




ovo je code, radi, ja budala, druga tablica mi je bila vezana relacijom na prvu.ta druga je bila detail.

sve radi.na ovoj bazi sam nešto testirao, pa zaboravio na relaciju.

hvala svima.
[ MarkoBalkan @ 08.02.2009. 21:51 ] @
sad imam dalje pitanja.
izvršim query, recimo da imam select.

u dizajneru na formu stavi tableView.

kako povezati query sa tablemodel i tableview.


tj. da podatke iz query-a dodijelim tablemodel-u?
[ karas @ 09.02.2009. 05:37 ] @
Ako u bazi imaš npr. tabelu emails(personId INT, address VARCHAR(32)) onda je možeš pročitati sa
Code:

QSqlTableModel* emailsModel = new QSqlTableModel(0, db);
emailsModel->setTable("emails");
emailsModel->setHeaderData(1, Qt::Horizontal, "Address");// postavlja ime kolone koje se prikazuje nezavisno od onog u bazi
emailsModel->select();

a prikazati sa
Code:

QTableView* emailsView = new QTableView;
emailsView->setModel(emailsModel);
emailsView->show();

Dok se budeš igrao sa čitanjem i pisanjem po bazi, izbegavaj NULL vrednosti u poljima. Trenutno pokušavam da nađem rešenje za brisanje redova koji imaju u nekoj koloni NULL jer primeri koji se koriste u dokumentaciji i knjigama ne rade!?
[ MarkoBalkan @ 09.02.2009. 10:43 ] @
Citat:
karas: Ako u bazi imaš npr. tabelu emails(personId INT, address VARCHAR(32)) onda je možeš pročitati sa
Code:

QSqlTableModel* emailsModel = new QSqlTableModel(0, db);
emailsModel->setTable("emails");
emailsModel->setHeaderData(1, Qt::Horizontal, "Address");// postavlja ime kolone koje se prikazuje nezavisno od onog u bazi
emailsModel->select();

a prikazati sa
Code:

QTableView* emailsView = new QTableView;
emailsView->setModel(emailsModel);
emailsView->show();

Dok se budeš igrao sa čitanjem i pisanjem po bazi, izbegavaj NULL vrednosti u poljima. Trenutno pokušavam da nađem rešenje za brisanje redova koji imaju u nekoj koloni NULL jer primeri koji se koriste u dokumentaciji i knjigama ne rade!?


a dali postoji mogučnost da prikažem query u table view-u?

da ne koristim qsqltablemodel.
[ MarkoBalkan @ 09.02.2009. 11:34 ] @
radi usporedbe. u QT-u, prikaz od milijun redova izvršava se u 3-4 sekunde, dok kod .net-a treba 30 s i još sve zablokira.
[ karas @ 09.02.2009. 11:40 ] @
Ako te ne mrzi, probaj
Code:

emailsModel->removeRow(0)

prvo na recordu koji nema NULL vrednost ni u jednoj koloni a onda isto to na recordu koji u jednoj koloni ima NULL vrednost. Da li je obrisao red iz tabele koji ima NULL?
[ MarkoBalkan @ 09.02.2009. 12:04 ] @
Citat:
karas: Ako te ne mrzi, probaj
Code:

emailsModel->removeRow(0)

prvo na recordu koji nema NULL vrednost ni u jednoj koloni a onda isto to na recordu koji u jednoj koloni ima NULL vrednost. Da li je obrisao red iz tabele koji ima NULL?


meni null vrijednosti prikazuje u tableview.

a šta ako hoću sa tablemodel prirodno spojiti dvije tablice ?

f
[ MarkoBalkan @ 09.02.2009. 12:18 ] @
uspio sam.

Code:

void MainWindow::spremanje()

{


QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setPort(3306);
db.setDatabaseName("proba");
db.setUserName("root");
db.setPassword("123");

bool ok=db.open("root","123");
if(ok)
{

QSqlQueryModel *a=new QSqlQueryModel();
a->setQuery("select * from prva,druga where prva.id=druga.id1");


ui.tableView->setModel(a);
ui.tableView->show();



}
}

[ karas @ 09.02.2009. 12:19 ] @
A da li ih brise iz tabele u bazi?
S obzirom da u dokumentaciji kaze
Citat:

The QSqlTableModel class provides an editable data model for a single database table

pretpostavljam da nije predvidjena za JOIN-ove.
[ karas @ 09.02.2009. 12:21 ] @
Prikazao, a editovanje?
[ MarkoBalkan @ 09.02.2009. 12:34 ] @
Citat:
karas: Prikazao, a editovanje?


ne znam.

sad pitanje, a sta ako umjesto QSqlQueryModel želim koristiti QSqlQuery?

i rezultat prikazati u tableview?

qsqlquery mi treba zbog procedura, mada čujem od ljudi da procedure nisu baš potrebne, da se svi query-i mogu stavit u jednu klasu.

a drugo ako nam treba neki zbroj računa kroz godinu ili nešto slično, a upit bi trajao dugo, mislim da je bolje zbrajat u hodu.
[ MarkoBalkan @ 09.02.2009. 12:40 ] @
pozivanje procedure.odlično radi.a ako trebaju i parametri, samo se navedu u zagradi kod imena procedure.
samo još moram probati sa out parametrima.

Code:

void MainWindow::spremanje()

{


QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setPort(3306);
db.setDatabaseName("proba");
db.setUserName("root");
db.setPassword("123");

bool ok=db.open("root","123");
if(ok)
{

QSqlQueryModel *a=new QSqlQueryModel();
a->setQuery("call procedura()");


ui.tableView->setModel(a);
ui.tableView->show();



}
}

[ MarkoBalkan @ 09.02.2009. 12:57 ] @
dokumentacija je dobra ali nije za početnike.
primjeri su dobri ali su pisani na razini za profesionalce, nema jednostavnijih primjera.
zbog tako loše dokumentacije za početnike mi moramo otkrivati toplu vodu no forumu.
[ MarkoBalkan @ 10.02.2009. 10:31 ] @
Code:

void MainWindow::spremanje()

{


QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setPort(3306);
db.setDatabaseName("proba");
db.setUserName("root");
db.setPassword("123");

bool ok=db.open("root","123");
if(ok)
{
QSqlQuery query;

query.exec("call marko(1)");


QSqlQueryModel *a=new QSqlQueryModel();
a->setQuery(query);


ui.tableView->setModel(a);
ui.tableView->show();
db.close();


}
}




kako koristiti bind value za poziv procedure?
[ MarkoBalkan @ 10.02.2009. 10:55 ] @
kako ide spajanje stringova?

[ icobh @ 10.02.2009. 16:32 ] @
String + String
[ miroslavgojic @ 30.07.2010. 09:34 ] @
moze li mi neko pomoci oko povlacena podataka iz MySql bazu u QT aplikaciju
i isto tako u slanju podataka u bazu kao i o samom nacinu realizacije Qt aplikacije i MySql baze

za sada imam smo konektor koji radi ... a sad treba da idem dalje ali nikako mi ne ide da povucem podatke ili da ih vratim u bazu

inace koristim Linux Ubuntu 10 sa MySql 5 i Qt4

[ karas @ 30.07.2010. 15:26 ] @
Evo jednostavnog primera koji pravi tabele, puni ih i cita:
Code (cpp):

/*

mysql.cpp
---------

Compile with
     /usr/local/qt-4.6.3/bin/qmake -project -o mysql.pro
     /usr/local/qt-4.6.3/bin/qmake
     make

*/



#include <QtSql>
#include <iostream>
#include <cstdlib>

using std::cout;
using std::cerr;
using std::endl;


int main()
{
     QString sql;
     bool status;

     QSqlDatabase connection = QSqlDatabase::addDatabase("QMYSQL");
     connection.setHostName("localhost");
     connection.setPort(3306);
     connection.setDatabaseName("test");
     if (!connection.open())
     {
          cerr << "cannot connect to database!" << connection.lastError().text().toStdString() << endl;
          exit(EXIT_FAILURE);
     }

     QSqlQuery query(connection);

     status = query.exec("DROP TABLE IF EXISTS phone");
     if (!status)
          cerr << "cannot drop 'phone' table!" << endl;

     status = query.exec("DROP TABLE IF EXISTS person");
     if (!status)
          cerr << "cannot drop 'person' table!" << endl;

     sql =
          "CREATE TABLE person"
          "("
               "id INT AUTO_INCREMENT PRIMARY KEY, "
               "surname VARCHAR(32), "
               "name VARCHAR(32), "
               "nickname varchar(16)"
          ") "
          "ENGINE=InnoDB DEFAULT CHARSET=utf8";
     status = query.exec(sql);
     if (!status)
          cerr << "cannot create 'person' table!" << endl;

     sql =
          "CREATE TABLE phone"
          "("
               "id INT AUTO_INCREMENT PRIMARY KEY, "
               "person INT, "
               "phone_number VARCHAR(32) NOT NULL, "
               "FOREIGN KEY(person) REFERENCES person(id)"
          ") "
          "ENGINE=InnoDB";
     status = query.exec(sql);
     if (!status)
          cerr << "cannot create 'phone' table!" << endl;

     sql = "INSERT INTO person(surname, name, nickname) VALUES('Smith', 'Jonathan', 'Joe')";
     status = query.exec(sql);
     if (!status)
          cerr << "cannot insert into 'person' table!" << endl;

     sql = "INSERT INTO person(surname, name, nickname) VALUES('Duval', 'Jean-Luc', '')";
     status = query.exec(sql);
     if (!status)
          cerr << "cannot insert into 'person' table!" << endl;

     sql = QString("INSERT INTO person(surname, name, nickname) VALUES('Petrovi") + QChar(0x107) + QString("', 'Petar', NULL)");
     status = query.exec(sql);
     if (!status)
          cerr << "cannot insert into 'person' table!" << endl;

     sql = "SELECT surname, name, nickname FROM person";
     status = query.exec(sql);
     if (!status)
          cerr << "cannot select from 'person' table!" << endl;
     else
          while (query.next())
               cout << query.value(0).toString().toStdString() << "," << query.value(1).toString().toStdString() << "," <<
                    query.value(2).toString().toStdString() << endl;

     sql = "INSERT INTO phone(person, phone_number) VALUES(3, '38111987654')";
     status = query.exec(sql);
     if (!status)
          cerr << "cannot insert into 'phone' table!" << endl;

     sql = "SELECT person, phone_number FROM phone";
     status = query.exec(sql);
     if (!status)
          cerr << "cannot select from 'phone' table!" << endl;
     else
          while (query.next())
               cout << query.value(0).toString().toStdString() << "," << query.value(1).toString().toStdString() << "," << endl;

     return EXIT_SUCCESS;
}