QT ile Veritabanı Bağlantıları


Bir önceki yazımızda Qt’yi tanıtmış ve bünyesinde her türlü araç ve kütüphaneyi barındırdığını söylemiştik. Qt’nin özellikle veritabanı konusunda çok büyük kolaylıklar sağladığından ve çok sayıda veritabanını desteklediğinden bahsetmiştik. Bu yazımızda Qt ile veritabanı bağlantıları nasıl yapacağız bunlardan bahsedeceğiz ve basit birkaç örnekle anlattıklarımızı pekiştireceğiz.
Öncelikle QSql kütüphanesinin kullanımından başlayalım. QSql, veritabanınız ile Qt uygulamalarınıza sorunsuz bağlantı yapabilmenizi sağlayan bir modüldür. Qt Sql kütüphanesinde kullanılan çok çeşitli belirleyicileri içermektedir.Sql classı üç farklı katmandan oluşmaktadır.
1.Sürücü Katmanı (Driver Layer): Bu katman, QSqlDriver, QSqlDriverCreator, QSqlDriverCreatorBase, QSqlDriverPlugin ve QSqlResult sınıflarını kapsamaktadır. Sürücü katmanı, belirli veritabanları ile Sql API katmanı arasında köprü görevi görmektedir.
2. SQL API Katmanı (SQL API Layer): Bu sınıflar Sql’ e erişimi sağlayan sınıflardır. Bağlantı işlemi QSqlDatabase sınıfı kullanılarak yapılır. QSqlQuery sınıfı ile veritabanı ile etkileşim yapılır. SQL API katmanı bunların dışında QSqlError, QSqlField, QSqlIndex ve QSqlRecord  gibi sınıfları da desteklemektedir.
3.Kullanıcı Arayüzü Katmanı (User Interface Layer): Bu katman, QSqlQueryModel, QSqlTableModel ve QSqlRelationalTableModel sınıflarını içerir. Bu sınıflar, veritabanındaki dataya erişirler ve Qt’nin model/view framework ü ile birlikte çalışabilecek şekilde dizayn edilmişlerdir.
QSqlDatabase: QSlDatabase veritabanına bağlantı yapmayı sağlayan sınıftır. Bu sınıftan oluşturacağımız nesneler sayesinde veritabanımızı yönetebileceğiz.
QSqlQuery: Bu class sayesinde Sql sorguları oluşturarak veritabanı uygulamaları yapabiliriz.
Şimdi QSqlDatabase sınıfını kullanarak veritabanı bağlantısı oluşturalım.

  QSqlDatabase db = QSqlDatabase::addDatabase("sürücüTipi");  
  db.setHostName("sunucuAdresi");  
  db.setDatabaseName("veritabanıAdı");  
  db.setUserName("kullanıcıAdı");  
  db.setPassword("kullanıcıSifresi");  
  bool ok = db.open();


İlk olarak QSqlDatabase nesnesini(db) oluşturduk. addDatabase() fonksiyonu sürücü tipini belirtmeye yarar. Ne tür bir veri tabanına bağlanılacağını bildirir. Qt birden fazla veritabanını desteklediği için o veritabanına uygun sürücü tipini de belirtmek gerekir. Örneğin kullanılan veritabanına göre şu sürücü tipleri kullanılabilir:

Sürücü Tipi
Açıklama
QDB2
IBM DB2
QIBASE
Borland InterBase Driver
QMYSQL
MySQL Driver
QOCI
Oracle Call Interface Driver
QODBC
ODBC Driver (includes Microsoft SQL Server)
QPSQL
PostgreSQL Driver
QSQLITE
SQLite version 3 or above
QSQLITE2
SQLite version 2
QTDS
Sybase Adaptive Server

setHostName(),setDatabaseName(), setUserName(), setPassword() fonkisyonu ile gerekli bilgileri verdikten sonra  open() fonksiyonu ile veritabanıyla fiziksel bağlantımızı oluşturuyoruz. open() metodunu kullanmadığınız sürece bağlantıyı yapamazsınız. Bu metod, boalean(true/false) sonuç döndürür. Bu sayede bağlantnın açık olup olmadığını kontrol edebiliriz.
Örneklere başlamadan önce değinmek istediğim bir nokta var.  QtCreator ile veritabanı uygulaması geliştirmek için QtCreator’ı açıp, proje tipinizi seçtikten sonra kütüphanelerin bulunduğu bir ekran karşınıza gelecektir. Buradan da QSql seçeneğini aktif hale getirmeniz gerekmektedir. Aksi takdirde QtCreator veritabanı classlarınızı tanımayacağı için hata verecektir.
Şimdi yeni bir proje açalım ve yukarda bahsettiğim gibi QSql seçeneğini seçelim. Projemizin adı da sqlBaglanti olsun ve görsel bir uygulama olsun. Bu durumda projeyi actığımızda sol tarafta sqlBaglanti.h, sqlBaglanti.cpp ve main.cpp  oluşmuş olacak.Biz bağlantı kodlarını içeren bir header file oluşturalım adı connection.h olsun ve projemizin gerekli yerlerinde bu header file’ i kullanalım.
connection.h

#ifndef CONNECTION_H
#define CONNECTION_H

#include
#include
#include
#include

static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");

      if(db.isDriverAvailable("QODBC"))
      {
      db.setDatabaseName("DRIVER={SQL Server};SERVER=ServerName;UID=sa;PWD=12345;DATABASE=readmee;");
      } // Bağlantı cümlenizi bu şekilde tek satırla da belirtebilirsiniz.

      if (!db.open()) {
            QMessageBox::critical(0, QObject::tr("Database Error"),              db.lastError().text());
            QString str = db.lastError().text();
      }
     return true;

}
#endif


sqlBaglanti.h kısmında QSqlDatabase nesnemizi tanımlayalım.

#ifndef SQLBAGLANTI_H
#define SQLBAGLANTI_H

#include
#include "ui_sqlbaglanti.h"

#include

class sqlbaglanti : public QMainWindow
{
      Q_OBJECT

public:
      sqlbaglanti (QWidget *parent = 0, Qt::WFlags flags = 0);
      ~ sqlbaglanti ();

private:
      Ui:: sqlbaglanti Class ui;
      QSqlDatabase db;
};

#endif // SQLBAGLANTI_H


main.cpp kısmında oluşturduğumuz createConnection() metodunu çağıralım:

#include
#include " sqlbaglanti.h"
#include "connection.h"

int main(int argc, char *argv[])
{
      QApplication a(argc, argv);
      if (!createConnection())
        return 1;
      sqlbaglanti w;
      w.show();
      return a.exec();
}


sqlbaglanti.cpp

#include
#include

 #include "sqlbaglanti.h"
 #include "connection.h"

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

sqlbaglanti::~ sqlbaglanti ()
{

}


Veri tabanı bağlantımızı yaptık. Şimdi veritabanımıza SqlQuery kullanarak veri ekleme silme gibi işlemleri yapalım.

QSqlQuery query;

    if (!query.exec("SELECT * FROM person"))
      {          
            QMessageBox::critical(0, QObject::tr("Query Error"),db.lastError().text());
            return false;
      }

// veri ekleme
     query.prepare("INSERT INTO person (ID,Name) "
                   "VALUES (:ID, :Name)");
     query.bindValue(":ID", 10);
     query.bindValue(":Name", "Gamze");
     query.exec();

//ID si 3 olan kaydın adını QMessageBox ‘ ta gösterelim:

     query.exec("SELECT * FROM person where ID='3'");
     int fieldNo = query.record().indexOf("Name");
     while (query.next()) {
              Name = query.value(fieldNo).toString();
       }
      QMessageBox::critical(0, QObject::tr("Name"),Name);


QSqlTableModel
Herhangi bir tabloya(tableWidget ya da tableView gibi) veri ekleme işlemlerinde QsqlTableModel sınıfı kullanılır.QSqlTableModel türünde bir nesne/model oluşturulur.Oluşturulan bu modele veriler aktarılır ve yapılacak tüm işlemler bu model üzerinden gerçekleştilir.Bu sayede tekrar tekrar veritabanından veri çekme işlemi yapılmamış olur.
initializeModel() metodu parametre olarak oluşturduğumuz model nesnesini alıyor ve bu nesneye bir takım özellikler atıyor.
createView() metodu ise ekranda gözükecek olan tableViewı olusturuyor ve buna model nesnesine daha önceden aktarılmıs olan veriler aktarılıyor.Bu tableView nesnesini kodla olşturmak yerine QtDesigner’ da sürükle bırak yöntemiyle de projenize ekleyebilirsiniz.
                 
void initializeModel(QSqlTableModel *model)
 {
       
     model->setTable("person");
     model->setEditStrategy(QSqlTableModel::OnManualSubmit);
     model->select();

     model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
     model->setHeaderData(1, Qt::Horizontal, QObject::tr("Name"));
    
 }

QTableView *createView(const QString &title, QSqlTableModel *model)
 {
     QTableView *view = new QTableView;
     view->setModel(model);
     view->setWindowTitle(title);
     return view;
 }



Bu fonksiyonları da main.cpp ‘ de çağırarak ekranda veri tabanından aldığımız bilgilerle doldurulan tableView’ı gösterebilirsiniz.

int main(int argc, char *argv[])
{
     QApplication a(argc, argv);
            if (!createConnection())
        return 1;

     QSqlTableModel model;
     initializeModel(&model);
     
     QTableView *view1 = createView(QObject::tr("Table Model (View 1)"), &model);
     view1->show();

 return a.exec();
}


Bu yazımda sizlere veritabanı uygulamalarınızda ihtiyaç duyabileceğiniz temel işlemlerden bahsettim. http://doc.trolltech.com/4.5/qsqldatabase.html adresinden bu konuyla ilgili daha detaylı bilgi alabilirsiniz. Bu adreste Qt ile ilgili çok geniş doküman yer almaktadır. Buradaki örnekleri inceleyerek öğrendiklerinizi pekiştirebilirsiniz. Qt ‘ nin bu yukarıda bahsettiğim sınıflar dışında daha birçok veritabanı sınıfı bulunmaktadır. Bunları kullanarak çok çeşitli uygulamalar geliştirebilirsiniz.

2 yorum:

zeynodaninciler dedi ki...

bu yazdıgınız fonksiyonları ve sql queryleri sqlbaglanti.cpp içinde mi yazacagız?
hata veriyor boyle yapınca.. baska ornekleriniz de varsa koyabilirseniz iyi olur:)

Adsız dedi ki...

Ben de hobi olarak Qt ile uğraşıyorum.Minik bir iki uygulama yaptım ve database konusuna da hafiften el atmak istiyordum ki başlangıç olarak yazınıza denk geldim..Teşekkürler açık anlatımınız için..

Yorum Gönder