You are on page 1of 4

QT Eitimi - 5 : Veritaban - I

nder Arslan <onder@xcoders.net>


Srm 1.0

zet Bu belge qt renimi iin bir dizi eklinde hazrlanmtr. C++ ve sql bilmek n kouldur. Giri Program yazarken en keyif aldm konulardan birisi veritaban programlamadr. Sanrm bunun en nemli sebebi veritaban ynetim sistemleri (RDBMS) ile uzun sre alm olmam (linux zerinde olmasa da). Uzun zamandr kk bir telefon defteri uygulamas iin bile veritaban kullanrm. Sral dosyalar, rastgele eriimli dosyalar vs. 'ye hi bir zaman snamammdr. Bu yzden kullandm programlama aralarnn veritabanlarna verdii destek benim iin ayr bir nem tayor. Yani demek istiyorum ki eitim - 5 ve iki satr sql kodu yazmann zaman geldi ;) insert, update, delete, select Kodlamaya gemeden nce bilgisayarnz da MySQL server 'n kurulu olduunu, ansi-SQL bildiinizi yada en azndan insert, update, delete ilemleri yapan sql kodlarn yazabildiinizi varsayyorum. lk olarak yaplmas gereken Mysql server zerinde bir veritaban oluturmak, ben veritaban ismi olarak test kullanacam. Verileri silip, deitirip, gncelleyeceim tablomun ad da tablo olacak. Son olarak tabloma iki alan ekliyorum bunlardan birincisi int trde veri tutan ve deeri otomatik olarak artan (auto_increment) alan1, ikincisi varchar trde veri tutan alan2. #include <QApplication> #include <QtSql> #include <iostream> using namespace std; bool connect_data() { QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("localhost"); db.setDatabaseName("test"); db.setUserName("kullanici_adi"); db.setPassword("parola"); bool ok ; return ok= db.open(); } int main(int argc, char *argv[]) { QApplication app(argc, argv);

if (connect_data()) { QSqlQuery insert_query; insert_query.exec("insert into tablo (alan2) values ('ondel')"); QSqlQuery update_query; update_query.exec("update tablo set alan2='onder' where alan2='ondel'"); QSqlQuery query; query.exec("SELECT alan1,alan2 from tablo"); QSqlQuery delete_query; delete_query.exec("delete from tablo where alan2='onder'"); while (query.next()) { int alan1 = query.value(0).toInt(); string alan2 = query.value(1).toString().toStdString(); cout << alan1 << " "<< alan2 << endl; } } return 0; } test.cpp: Qt ile veritabanna balanrken yapmamz gereken ilk ey QtSql modln kodumuza dahil etmek. QtSql modl qt uygulamalarmz ii kusursuz veritaban entegrasyonu salyor. QtSql katmandan oluuyor : Driver Layer, SQL API layer ve User Interface layer. Ksaca : Driver Layer(Src Katman) SQL API Layer ile belirli veritabanlar arasnda kpr grevi gryor. SQL API Layer ' veritabanna erimek ve veriler zerinde eitli sorgular altrmak iin kullanyoruz. User Interface Layer (Kullanc arayz katman) verilerin qt kontrolleri zerinde direk gsterilebilmesi iin balant oluturmaya yaryor. QtSql classlarnn ayrntlarn ilerleyen derslerde inceleyeceiz. Veritabanna uygulamalarnda yapmamz gereken ilk ey tabii ki veritabanna balanmak :)) Bunun iin programa ilk olarak connect_data() fonksiyonunu yazarak baladm. Bu fonksiyon iinde ilk olarak QSqlDatabase trnden db adl bir nesne oluturuyorum ve buna addDatabase fonksiyonu ile src tipi mysql olacak ekilde ilk deer veriyorum. Qt aada verilen popler veritabanlarna direk balanabilmeniz iin driverlara sahiptir. Bunlarn dnda bir veritaban kullanacaksanz registerSqlDriver() fonksiyonu ile driver uygulamanza ekleyebilirsiniz. Ben mysql kulandm iin QMYSQL tipini kullandm. Driver Type QDB2 QIBASE QMYSQL IBM DB2 Borland InterBase Driver MySQL Driver Description

Driver Type

Description

QOCI QODBC

Oracle Call Interface Driver ODBC Driver (includes Microsoft SQL Server) PostgreSQL Driver SQLite version 3 or above

QPSQL QSQLITE

QSQLITE2 SQLite version 2 QTDS Sybase Adaptive Server

Daha sonra oluturduum db nesnesine setHostName, setDatabase, setUserName, setPassword fonksiyonlar ile uygun deerleri atyorum. Nesnemin open fonksiyonu ile balanty ayorum ve bunu geri dn deeri (true / false) olarak dndryorum. QtSql ile veri taban balants oluturmak bu kadar kolay ;) main fonksiyonu inde ilk olarak app adnda QApplication nesnesi oluturuyoruz. Bu satr qt ile veritaban uygulamas gelitirmeye alrken en ok hata yapmama neden olan satrdr. Balant kodlarm test ederken bu satr yazmamam sebebiyle gnlerce mysql driver ' ile problemim olduunu dndm. nk eer bu satr yazmassanz program altrdnzda alacanz hata : QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: available drivers: eklinde oluyor. Yani QMYSQL srcs ykl deil ve mevcut driver da yok. Bu sebeple hibir qt uygulamanzda QAplication nesnesi oluturmay unutmayn ;) Nesne oluturduktan sonra conect_data() fonksiyonunu if parantezi iinde altrarak balant salayamamz durumunda olas bir hatay engelliyoruz. QtSql modl ierisinde sql deyimlerini altrmak ve veri ilemek iin QSqlQuery snfn kullanyoruz. Bu ilemleri yapmak iin QSqlQuery trnden bir nesne oluturmak ve exec fonksiyonunu istediimiz sql deyimi ile altrmaktan baka bir ilem yapmaya da gerek yok. Tm deyimler iin (insert, update, select, delete) QSqlQuery nesnesi kullanabiliyoruz. Yukardaki rneimizde ilk sql deyimi ile tablomuzda alan2 'ye "ondel" deeri giriliyor, ikinci sql deyimi ile "ondel" deeri "onder" ile deitiriliyor, nc deyimde tm kaytlar seiliyor ve drdnc deyimde alan2 de "onder" olan kayt(lar) siliniyor. Verilerin ekrana yazdrlmasn bir while dngs ile (bu rnekte) yapyoruz. select sorgusunun sonucu next fonksiyonuna doru deeri dndrd srece yani kayt olduu srece dnen bir dng iinde value() fonksiyonunun deerini alarak ekrana yazdryoruz. qt ile veritaban ilemleri bu kadar kolay ;)

Derleme ve altrma Program derlenip altrldnda aadaki gibi grnr :

Tabii siz program ilk altrdnzda muhtemelen alan1 'in deeri 1 olur ben 23 kez altrdm iin

alan1 'in auto_increment zelliinden dolay deeri 23 ;) Son Sz Programlarnz derlerken dikkat etmeniz gereken bir nokta var eer QtSql modln kullanyorsanz qmake komutundan sonra oluan .pro dosyanza
QT+=sql

satrn eklemek zorundasnz. Aksi takdirde make komutunda QSqldatabase, QSqlQuery gibi snflarn tanml olmadna dair hata mesajlar alrsnz.

Telif Hakk ve Lisans Bu belgenin, QT Eitimi - 5 : Veritaban - I , 1.0 srmnn telif hakk 2006 nder ARSLAN'a aittir. Bu belgeyi, Free Software Foundation tarafndan yaynlanm bulunan GNU zgr Belgeleme Lisansnn 1.1 ya da daha sonraki srmnn koullarna bal kalarak kopyalayabilir, databilir ve/veya deitirebilirsiniz. Bu Lisansn bir kopyasn http://www.gnu.org/copyleft/fdl.html adresinde bulabilirsiniz. Linux, Linus Torvalds adna kaytl bir ticar isimdir. Qt, TrollTech adna kaytl bir ticari isimdir. Mysql, MySQL AB adna kaytl bir ticari isimdir. Feragatname Bu belgedeki bilgilerin kullanmndan doacak sorumluluklar, ve olas zararlardan belge yazar sorumlu tutulamaz. Bu belgedeki bilgileri uygulama sorumluluu uygulayana aittir. Tm telif haklar aksi zellikle belirtilmedii srece sahibine aittir. Belge iinde geen herhangi bir terim bir ticar isim ya da kuruma itibar kazandrma olarak alglanmamaldr. Bir rn ya da markann kullanlm olmas ona onay verildii anlamnda grlmemelidir.

You might also like